APP啟動(dòng)流程

一、APP啟動(dòng)流程

涉及到?四個(gè)進(jìn)程的通信,分別是?launcher進(jìn)程、AMS所在的SystemServer進(jìn)程、Zygote進(jìn)程、用戶app進(jìn)程

概覽步驟:

1、launcher作為一個(gè)APP,點(diǎn)擊圖標(biāo)后,也觸發(fā)startActivity了,由于與用戶進(jìn)程是不同的,所以通過ServiceManager獲取AMS的binder引用,從而可以訪問AMS(ServiceManager是一個(gè)獨(dú)立進(jìn)程,它存儲(chǔ)了所有APP所需要的binder引用,而且它的地址是固定的)

2、AMS會(huì)查詢對(duì)應(yīng)的activity棧信息,如果進(jìn)程不存在,則通過socket通信方式通知Zygote進(jìn)程去fork新進(jìn)程。

3、APP進(jìn)程創(chuàng)建后會(huì)通知AMS?。

4、AMS?收到信息會(huì)繼續(xù)通知APP去創(chuàng)建Application,并且接下來會(huì)通知application去拉起activity。

5、APP進(jìn)程依次收到通知后,會(huì)依次完成加載apk,初始化application,執(zhí)行activity生命周期。


APP啟動(dòng)流程圖



launcher啟動(dòng)APP流程

二、AMS通知Zygote創(chuàng)建APP過程

1、AMS內(nèi)部執(zhí)行邏輯

(1)ActivityTaskManagerService掉用startProcessAsync方法去創(chuàng)建APP進(jìn)程,是異步的,通過handler交給startProcess方法

(2)然后通知Processlist.startProcessLocked方法,這個(gè)方法會(huì)構(gòu)造一個(gè)對(duì)象ProcessRecord對(duì)象,然后將各種信息添加到這個(gè)對(duì)象中。

(3)接下來調(diào)用Processlist.startProcessLocked方法,這個(gè)方法主要負(fù)責(zé)把各種信息轉(zhuǎn)換為runtimeFlags標(biāo)記位,連同上面構(gòu)造的ProcessRecord繼續(xù)傳遞給下層。

(4)最終通知Process.start方法,交給zygoteProcess.start方法,最終傳遞給startViaZygote方法。

2、Zygote進(jìn)程邏輯

(1)Zygote進(jìn)程創(chuàng)建后,最開始入口是在C層,app_main.cpp文件的main方法,最終會(huì)調(diào)用AndroidRuntime.cpp中的start函數(shù),去啟動(dòng)JVM虛擬機(jī)

(2)創(chuàng)建虛擬機(jī)后,進(jìn)行jni方法注冊(cè),然后通過native層反射找到ZygoteInit的main函數(shù)并執(zhí)行。

(3)ZygoteInit的main方法中,會(huì)做幾件事:

把自身進(jìn)程ID?設(shè)置為0,并且沒有父進(jìn)程

會(huì)進(jìn)行一系列的初始化操作,preload方法中

如果是首次執(zhí)行,則會(huì)forkSystemServer,AMS?,WMS?都屬于SystemServer進(jìn)程

會(huì)創(chuàng)建serverSocket,調(diào)用runLoop,監(jiān)聽AMS傳遞過來的消息。

(4)收到通知后fork產(chǎn)生APP進(jìn)程

(5)調(diào)用ActivityThread.main方法

3、APP進(jìn)程創(chuàng)建和初始化過程

APP創(chuàng)建初始化操作比較簡單,主要做了兩件事,初始化looper,以及通知AMS(注意,此時(shí)只是APP進(jìn)程創(chuàng)建了,但是還沒有加載apk中的任何類)

(1)初始化主線程looper,開啟循環(huán)

(2)通知AMS???attach方法,通過binder通知AMS,并且把自身的binder(ApplicationThread)也傳遞給AMS

AMS的binder是直接通過ServiceManager的方式獲取的,ServiceManager存儲(chǔ)了所有的binder引用,AMS在啟動(dòng)的時(shí)候去注冊(cè)

4、AMS通知APP進(jìn)程進(jìn)行各種生命周期操作

ActivityManagerService的attachApplication?方法會(huì)受到APP傳遞過來的消息,然后交友a(bǔ)ttachApplicationLocked處理。

(1)attachApplicationLocked主要做了兩件事:

通知APP進(jìn)程初始化操作

進(jìn)行一系列操作,拉起APP首頁


(2)handler交給HandleBindApplication去完成APP初始化邏輯的過程

使用ClassLoader去加載apk中的dex文件

加載apk中的資源

反射生成application類,調(diào)用attachBaseApplication方法

調(diào)用application的onCreate方法

(3)AMS中處理Activity啟動(dòng)邏輯

ActivityManagerService.attachApplicationLocked->

ActivityTaskManagerService.LocalService.attachApplication->

RootWindowContainer.attachApplication->

RootWindowContainer.startActivityForAttachedApplicationIfNeeded->

ActivityTaskSupervisor.realStartActivityLocked

realStartActivityLocked中創(chuàng)建Activity的生命周期事務(wù),最終通過ClientLifecycleManager.scheduleTransaction通過binder發(fā)送到APP進(jìn)程的ApplicationThread.scheduleTransaction方法中,則AMS流程就完成了。

FAQ:

問:AMS?通知APP進(jìn)程初始化過程中,為什么不會(huì)出現(xiàn)先加載Activity,然后再去初始化應(yīng)用呢?

答:因?yàn)闊o論初始化APP,還是拉起activity,最終都是交給handler切換到主線程處理,所以即便初始化APP時(shí)耗時(shí)操作,拉起activity的msg也得等前面的消息執(zhí)行完后才執(zhí)行。

參考資料:

https://juejin.cn/post/7231439815647789113

https://blog.csdn.net/rzleilei/article/details/125665839

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

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

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