Zygote和System进程的启动过程
生活随笔
收集整理的這篇文章主要介紹了
Zygote和System进程的启动过程
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
##init腳本的啟動(dòng)
+------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| +------------+ +-------+ +-----------+create and public server socketlinux內(nèi)核加載完成后,運(yùn)行init.rc腳本
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666- /system/bin/app_process Zygote服務(wù)啟動(dòng)的進(jìn)程名
- --start-system-server 表明Zygote啟動(dòng)完成之后,要啟動(dòng)System進(jìn)程。
- socket zygote stream 666 在Zygote啟動(dòng)時(shí),創(chuàng)建一個(gè)權(quán)限為666的socket。此socket用來請求Zygote創(chuàng)建新進(jìn)程。socket的fd保存在名稱為“ANDROID_SOCKET_zygote”的環(huán)境變量中。
##Zygote進(jìn)程的啟動(dòng)過程
create rumtime +-----------+ +----------+ |app_process+----------> |ZygoteInit| +-----------+ +-----+----+ | | | registerZygoteSocket()| +------+ startSystemServer() | |System| <-------+ | +------+ fork | runSelectLoopMode() | vapp_process進(jìn)程
/system/bin/app_process
啟動(dòng)時(shí)創(chuàng)建了一個(gè)AppRuntime對象。通過AppRuntime對象的start方法,通過JNI調(diào)用創(chuàng)建了一個(gè)虛擬機(jī)實(shí)例,然后運(yùn)行com.android.internal.os.ZygoteInit類的靜態(tài)main方法,傳遞true(boolean
startSystemServer)參數(shù)。
ZygoteInit類
ZygoteInit類的main方法運(yùn)行時(shí),會(huì)通過registerZygoteSocket方法創(chuàng)建一個(gè)供ActivityManagerService使用的server socket。然后通過調(diào)用startSystemServer方法來啟動(dòng)System進(jìn)程。最后通過runSelectLoopMode來等待AMS的新建進(jìn)程請求。
##System進(jìn)程的啟動(dòng)
+ | | v fork() +--------------+ |System Process| +------+-------+ | | RuntimeInit.zygoteInit() commonInit, zygoteInitNative | init1() SurfaceFlinger, SensorServic... | | | init2() +------------+ +-------> |ServerThread| | +----+-------+ | | | | AMS, PMS, WMS... | | | | | | v vSystem進(jìn)程是在ZygoteInit的handleSystemServerProcess中開始啟動(dòng)的。
##Android進(jìn)程啟動(dòng)
+----------------------+ +-------+ +----------+ +----------------+ +-----------+ |ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit| +--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+ | | | | | | | | | | startProcessLocked() | | | | +---------------> | | | | | | start() | | | | | "android.app.ActivityThread" | | | +-----------------> | | | | | | | | | | | | | | | |openZygoteSocketIfNeeded() | | | +------+ | | | | | | | | | | | <----+ | | | | | | | | | |sZygoteWriter.write(arg) | | | +------+ | | | | | | | | | | | | | | | | | <----+ | | | | | | | | | +--------------> | | | | | | | | | | |runSelectLoopMode() | | | | +-----------------+ | | | | | | | | | | | <---------------+ | | | | | acceptCommandPeer() | | | | | | | | | | | | | | runOnce() | | | | +------------------> | | | | | |forkAndSpecialize() | | | +-------------+ | | | | | | | | | | | <-----------+ | | | | | handleChildProc() | | | | | | | | | | | | | | | | | | | zygoteInit() | | | | +-------------> | | | | | | | | | | |in^okeStaticMain() | | | | +----------------> | | | | |("android.app.ActivityThread")| | | | | | | | | | + + + + +- AMS向Zygote發(fā)起請求(通過之前保存的socket),攜帶各種參數(shù),包括“android.app.ActivityThread”。
- Zygote進(jìn)程fork自己,然后在新Zygote進(jìn)程中調(diào)用RuntimeInit.zygoteInit方法進(jìn)行一系列的初始化(commonInit、Binder線程池初始化等)。
- 新Zygote進(jìn)程中調(diào)用ActivityThread的main函數(shù),并啟動(dòng)消息循環(huán)。
轉(zhuǎn)載于:https://www.cnblogs.com/cyf1314/p/8602978.html
總結(jié)
以上是生活随笔為你收集整理的Zygote和System进程的启动过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。