應(yīng)用程序進(jìn)程簡(jiǎn)介
要想啟動(dòng)一個(gè)應(yīng)用程序章母,首先要保證這個(gè)應(yīng)用程序所需要的應(yīng)用程序進(jìn)程已經(jīng)啟動(dòng)翩剪。AMS在啟動(dòng)應(yīng)用程序時(shí)會(huì)檢查這個(gè)應(yīng)用程序需要的應(yīng)用程序進(jìn)程是否存在,不存在就會(huì)請(qǐng)求Zygote進(jìn)程啟動(dòng)需要的應(yīng)用程序進(jìn)程蚪缀。我們知道在Zygote的java框架層中會(huì)創(chuàng)建一個(gè)Server端的Socket恕出,這個(gè)Socket用來等待AMS請(qǐng)求Zygote來創(chuàng)建應(yīng)用程序進(jìn)程。Zygote進(jìn)程通過fork自身創(chuàng)建應(yīng)用程序進(jìn)程浙巫,這樣應(yīng)用程序進(jìn)程就會(huì)獲得Zygote進(jìn)程在啟動(dòng)時(shí)創(chuàng)建虛擬機(jī)實(shí)例刷后,還創(chuàng)建了Binder線程池和消息循環(huán)渊抄,這樣運(yùn)行在應(yīng)用進(jìn)程中的應(yīng)用程序就可以方便地使用Binder進(jìn)行進(jìn)程間通信以及處理消息了。上期已經(jīng)講到Android系統(tǒng)啟動(dòng)流程總結(jié)护桦,鏈接:
AMS如果想要啟動(dòng)應(yīng)用程序進(jìn)程二庵,就需要向Zygote進(jìn)程發(fā)送創(chuàng)建應(yīng)用程序進(jìn)程的請(qǐng)求,AMS會(huì)通過調(diào)用startProcessLocked方法向Zygote進(jìn)程發(fā)送請(qǐng)求催享。其中ZygoteProcess類用于保持與Zygote進(jìn)程的通信狀態(tài)睡陪。
??Zygote接收請(qǐng)求并創(chuàng)建應(yīng)用程序進(jìn)程:
(1)應(yīng)用程序進(jìn)程就進(jìn)入了ActivityThread的main方法中,應(yīng)用程序進(jìn)程就創(chuàng)建完成了
并且運(yùn)行了主線程的管理類ActivityThread兰迫。
?(2)啟動(dòng)Binder線程池,確保線程池只會(huì)被啟動(dòng)一次涡拘,并創(chuàng)建線程池中的第一個(gè)線程据德,也就是線程池的主線程,將當(dāng)前線程注冊(cè)到Binder驅(qū)動(dòng)程序中橱野,這樣我們創(chuàng)建的線程就加入了Binder線程池中善玫,新創(chuàng)建的應(yīng)用程序進(jìn)程就支持Binder進(jìn)程間通信了,我們只需要?jiǎng)?chuàng)建當(dāng)前進(jìn)程Binder對(duì)象蜗元,并將它注冊(cè)到ServiceManager中就可以實(shí)現(xiàn)Binder進(jìn)程間通信了系冗,而不必關(guān)心進(jìn)程間是如何通過Binder進(jìn)行通信的。
?(3)應(yīng)用程序進(jìn)程啟動(dòng)后創(chuàng)建消息循環(huán)惯豆,ActivityThread用于管理當(dāng)前應(yīng)用程序的主線程,應(yīng)用程序進(jìn)程完成后循帐,就會(huì)創(chuàng)建一個(gè)消息循環(huán)拄养。系統(tǒng)在應(yīng)用程序進(jìn)程啟動(dòng)完成后银舱,就會(huì)創(chuàng)建一個(gè)消息循環(huán),這樣運(yùn)行在應(yīng)用程序進(jìn)程中的應(yīng)用程序就可以方便地使用消息循環(huán)機(jī)制了寻馏。
應(yīng)用程序進(jìn)程啟動(dòng)后接著該啟動(dòng)應(yīng)用程序了诚欠,也就是啟動(dòng)根Activity。Activity的啟動(dòng)過程分兩種轰绵,一種是根Activity的啟動(dòng)過程,另一種是普通Activity的啟動(dòng)過程唧垦。根Activity指的是應(yīng)用程序啟動(dòng)的第一個(gè)Activity液样,因此根Activity的啟動(dòng)過程一般情況下也可以理解為應(yīng)用程序的啟動(dòng)過程。普通Activity是指除了應(yīng)用程序啟動(dòng)的第一個(gè)Activity之外的其他Activity坊秸。
??Launcher請(qǐng)求AMS過程
Launcher啟動(dòng)后會(huì)將已安裝的應(yīng)用程序的快捷圖標(biāo)顯示到桌面上澎怒,這些應(yīng)用程序的快捷圖標(biāo)就是啟動(dòng)根Activity的入口,當(dāng)我們點(diǎn)擊某個(gè)應(yīng)用程序的快捷圖標(biāo)時(shí)站超,就會(huì)通過Launcher請(qǐng)求AMS來啟動(dòng)該應(yīng)用程序乖酬。,當(dāng)我們點(diǎn)擊某個(gè)應(yīng)用程序的快捷圖標(biāo)時(shí)算撮,就會(huì)調(diào)用Launcher的startActivitySafely方法。Instrumentation主要來監(jiān)控應(yīng)用程序和系統(tǒng)的交互陷舅,Instrumentation調(diào)用execStartActivity方法最終調(diào)用的是AMS的startActivity方法审洞。
??AMS到ApplicationThread的調(diào)用過程
要在目標(biāo)應(yīng)用程序中啟動(dòng)Activity。當(dāng)前代碼邏輯運(yùn)行在AMS所在的進(jìn)程(SystemServer)中仰剿,通過ApplicationThread來與用于程序進(jìn)程進(jìn)行Binder通信痴晦,換句話說,ApplicationThread是AMS所在進(jìn)程(SystemServer)和應(yīng)用程序進(jìn)程的通信橋梁部凑。
??ActivityThread啟動(dòng)Activity的過程
我們知道當(dāng)前的代碼邏輯運(yùn)行在應(yīng)用程序進(jìn)程中碧浊,ApplicationThread是ActivityThread的內(nèi)部類,它管理者當(dāng)前應(yīng)用程序進(jìn)程的主線程必孤,通過ApplicationThread調(diào)用schedudeLauncherActivity方法啟動(dòng)Activity瑞躺。mH指的是H,它是ActivityThread的內(nèi)部類并繼承Handler赡勘,是應(yīng)用程序進(jìn)程中主線程的消息管理類捞镰。因?yàn)锳pplicationThread是一個(gè)Binder,它的調(diào)用邏輯運(yùn)行在Binder線程池中岸售,所以這些需要用H將代碼的邏輯切換到主線程中凸丸。ActivityThread調(diào)用performLauncherActivity方法啟動(dòng)Activity。方法內(nèi)部創(chuàng)建Application,makeApplication方法內(nèi)部會(huì)調(diào)用Application的onCreate方法屎慢。Activity的attach方法初始化Activity,在attach方法會(huì)創(chuàng)建Window對(duì)象(PhoneWindow)并與Activity自身進(jìn)行關(guān)聯(lián)环肘。調(diào)用Instrumentation的callActiivtyOnCreate方法啟動(dòng)Activity,最終調(diào)用Activity的onCreate方法复哆,講到這里荠商,根Activity就啟動(dòng)了。即應(yīng)用程序就啟動(dòng)了。
?根Activity啟動(dòng)過程中涉及的進(jìn)程
根Activity啟動(dòng)過程會(huì)涉及4個(gè)進(jìn)程饰躲,分別是Zygote進(jìn)程臼隔、Launcher進(jìn)程、AMS所在進(jìn)程(SystemServer)寄狼、應(yīng)用程序進(jìn)程氨淌。首先Launcher進(jìn)程向AMS請(qǐng)求創(chuàng)建根Activity,AMS會(huì)判斷根Activity所需的應(yīng)用程序進(jìn)程是否存在并啟動(dòng)盛正,如果不存在就會(huì)請(qǐng)求Zygote進(jìn)程創(chuàng)建應(yīng)用程序進(jìn)程豪筝。啟動(dòng)應(yīng)用程序進(jìn)程后,AMS會(huì)請(qǐng)求創(chuàng)建應(yīng)用程序進(jìn)程并啟動(dòng)根Activity敲街。普通的Activity啟動(dòng)過程會(huì)涉及2個(gè)進(jìn)程严望,AMS所在進(jìn)程(SystemServer)、應(yīng)用程序進(jìn)程墩蔓。