一、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生命周期。


二、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í)行。
參考資料: