理論基礎
Binder
Binder它是android中的一種行程間通信機制,它主要采用的是CS架構模式,
Binder框架中主要涉及到4個角色Client、Server、Service Manager及Binder驅動,其中Client、Server、Service Manager運行在用戶空間,Binder驅動運行在內核空間,
執行緒池
執行緒池它是一種用于多執行緒處理形式,處理程序中將任務添加到佇列,然后在創建執行緒后自動啟動這些任務,執行緒池執行緒都是后臺執行緒,每個執行緒都使用默認的堆疊大小,以默認的優先級運行,并處于多執行緒單元中,
簡單的說:執行緒池就是創建一些執行緒,它們的集合稱為執行緒池,
Binder執行緒池啟動流程
我們知道一個新的app應用程式行程在創建完成之后,它會通過呼叫RunTimeInit類的靜態成員函式zygoteInitNative來進行啟動Binder執行緒池,
Binder執行緒池啟動程序中,主要呼叫幾個關鍵函式:ZygoteInitNative—>onZygoteInit—>startThreadPool,
下面的原始碼分析主要是以android5.0版本為例,
ZygoteInitNative原始碼分析
由于ZygoteInitNative函式是java實作的代碼,實踐上最終呼叫的是由C++實作的JNI方法,
以下代碼來源于系統的/frameworks/base/core/jni/androidRuntime.cpp檔案中
static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
//gCurRuntime是個全域的變數,后面跟上的是另外實作的方法,
gCurRuntime->onZygoteInit();
}
onZygoteInit原始碼分析
onZygoteInit函式在需要原始碼的位置:/frameworks/base/cmds/app_process/app_main.cpp檔案中,
//該函式是個虛函式,并且是一個無回傳值和無引數的函式
virtual void onZygoteInit()
{
// Re-enable tracing now that we're no longer in Zygote.
atrace_set_tracing_enabled(true);
//獲取行程的狀態資訊
sp<ProcessState> proc = ProcessState::self();
//列印日志資訊
ALOGV("App process: starting thread pool.\n");
//啟動執行緒池
proc->startThreadPool();
}
startThreadPool 原始碼分析
startThreadPool系統實作在\frameworks\native\libs\binder\ProcessState.cpp檔案中,
每一個支持Binder行程間通信機制的行程內都有一個唯一的ProcessState物件,當這個ProcessState物件的成員函式StartThreadPool函式被第一次呼叫的時候,它就會在當前行程中啟動一個執行緒池,并將mThreadPoolStarted這個成員變數設定為true,
//該函式是個無引數,無回傳值的函式
void ProcessState::startThreadPool()
{
AutoMutex _l(mLock);
//判斷執行緒池是否啟動狀態,啟動的話就將標志資訊設定為true屬性,
if (!mThreadPoolStarted) {
mThreadPoolStarted = true;
spawnPooledThread(true);
}
}
總結
Binder在android底層中是一個非常重要的機制,我們在實際的專案呼叫程序中,我們在app應用程式中只要實作自己的Binder本地物件的時候,跟其他服務一樣,只需要將它進行啟動起來,并且進行注冊到Server Mananger就可以了,至于內部的實作一般是不需要去關心的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/305500.html
標籤:其他
上一篇:flutter制作具有自定義導航欄的漸進式 Web 應用程式
下一篇:iOS 性能優化之記憶體優化
