Android系統(tǒng)啟動

所有的進(jìn)程都是init進(jìn)程的子進(jìn)程或?qū)O進(jìn)程。是init進(jìn)程fork出子進(jìn)程

fork:fork函數(shù)UNIX及類UNIX系統(tǒng)中的分叉函數(shù),一個現(xiàn)有進(jìn)程可以調(diào)用fork函數(shù)創(chuàng)建一個新進(jìn)程。由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)程持有的是上述存儲空間的“副本”,這意味著父子進(jìn)程間不共享這些存儲空間。


init進(jìn)程->Zygote進(jìn)程->SystemServer

ActivityManagerService 和?Zygote 之間的通信是使用Socket進(jìn)程間通信機制。

具體啟動細(xì)節(jié):每一個App應(yīng)用都是由ActivityManagerService通過Socket與Zygote進(jìn)程進(jìn)行通信,ActivityManagerService調(diào)用startProcessLocked()方法來創(chuàng)建新的進(jìn)程, 該方法會通過前面講到的socket通道傳遞參數(shù)給Zygote進(jìn)程。Zygote會fork一個子進(jìn)程出來作為這個即將要啟動的應(yīng)用程序的進(jìn)程, 并調(diào)用ZygoteInit.main()方法來實例化ActivityThread對象并最終返回新進(jìn)程的pid。接下來要做的就是將進(jìn)程和指定的Application綁定起來. 這個是通過ActivityThread對象中調(diào)用bindApplication()方法完成的. 該方法發(fā)送一個BINDAPPLICATION的消息到消息隊列中, 最終通過handleBindApplication()方法處理該消息. 然后調(diào)用makeApplication()方法來加載App的classes到內(nèi)存中。

經(jīng)過前兩個步驟之后, 系統(tǒng)已經(jīng)擁有了該application的進(jìn)程。后面的調(diào)用順序就是普通的從一個已經(jīng)存在的進(jìn)程中啟動一個新進(jìn)程的Activity了。ActivityManagerService會通過Binder機制通知ActivityThread去創(chuàng)建需要的Activity,實際調(diào)用方法是realStartActivity(), 它會調(diào)用application線程對象中的sheduleLaunchActivity()發(fā)送一個LAUNCHACTIVITY消息到消息隊列中, 通過handleLaunchActivity()來處理該消息。最后會輾轉(zhuǎn)到Instrumentation來創(chuàng)建Activity。


本文參考鏈接:http://www.itdecent.cn/p/030efebdcdac

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容