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