【Android FrameWork】Zygote

58:05 up畫流程圖
下面是我自己總結(jié)的大致的流程,可能會有錯,所以只能供參考。
init.rc 找到zygote的解析文件 執(zhí)行app_main的main函數(shù)
-創(chuàng)建AppRuntime對象,
-解析參數(shù),
-然后調(diào)用runtime對象的start函數(shù)(傳入“com....ZygoteInit”等參數(shù))
--通過jni_invocation.Init(Null)加載libart.so函數(shù)庫
--通過startVm(&mJavaVM,&env,zygote)創(chuàng)建Java虛擬機
--通過startReg(env)注冊JNI環(huán)境(封裝了許多jni函數(shù)) 17:34
--解析參數(shù)找到ZygoteInit.java的main函數(shù),并通過CallStaticVoidMethod(startClass,startMeth,strArry) 調(diào)用java層的ZygoteInit的main函數(shù)
---創(chuàng)建ZygoteServer服務(wù)端(沒有實例化),
---通過startZygoteNoThreadCreation開啟線程的限制
---設(shè)置參數(shù)后,通過preload(bootTimingsTraceLog)進行預(yù)加載,預(yù)加載clss,系統(tǒng)資源,drawable,color等
---加載完后,通過gcAndFinalize()進行一次gc
---通過initNativeState(isPrimaryZygote)對Zygote初始化一些native state
---通過stopZygoteNoThreadCreation()關(guān)閉線程創(chuàng)建限制
---實例化ZygoteServer,然后通過forkSystemServer(...)開啟SystemServer
---通過zygoteServer.runSelectLoop(abiList) 開啟循環(huán),等待客戶端請求并處理(注意這里會等待一個caller返回){//下面是死循環(huán)
----通過Os.poll(...)進行阻塞,等待請求
----如果拿到請求,就會調(diào)用processsOneCommand(this)處理客戶端的請求(這里會返回caller)
-----將參數(shù)包裝進ZygoteArguments包裝類里
-----通過Zygote.forkAndSpecialize(...)將子進程fork出來,具體是函數(shù)內(nèi)部會調(diào)用native的nativeForkAndSpecialize函數(shù)->ForkCommon(...)->fork()
-----然后處理子進程的事情,如通過closeServerSocket關(guān)閉ServerSocket
-----最后調(diào)用handleChildProc進行處理(這里會返回caller)
------通過closeSocket()關(guān)閉socket請求
------通過ZygoteInit.zygoteInit(...)來初始化進程信息,并且創(chuàng)建binder
-------通過ZygoteInit.nativeZygoteInit()來初始化進程信息,并且創(chuàng)建binder, 其中nativeZygoteInit里面會調(diào)用appRuntime的onZygoteInit方法,這個方法會①調(diào)用ProcessState::self方法來創(chuàng)建初始化進程信息 ②開啟線程池
-------初始化完成后會調(diào)用RuntimeInit.applicationInit(...)方法對客戶端請求信息進行包裝,然后返回一個caller,這個caller包裝了客戶端請求調(diào)用的類的main方法的信息}
---拿到caller后,會退出循環(huán),通過caller.run方法調(diào)用客戶端請求調(diào)用的類的main方法