by hzwusibo? 20190504
用戶點擊app后會通知 ActivityManagerService 啟動應用的入口 Activity, ActivityManagerService 發(fā)現(xiàn)這個應用還未啟動,則會通知 Zygote 進程孵化出應用進程,然后在這個應用進程里執(zhí)行 ActivityThread 的 main 方法。應用進程接下來通知 ActivityManagerService 應用進程已啟動,ActivityManagerService 保存應用進程的一個代理對象,這樣 ActivityManagerService 可以通過這個代理對象控制應用進程,然后 ActivityManagerService 通知應用進程創(chuàng)建入口 Activity 的實例,并執(zhí)行它的生命周期函數(shù)。
https://www.cnblogs.com/zyanrong/p/5661114.html
一個APP從啟動到主頁面顯示經歷了哪些過程?
http://www.itdecent.cn/p/a72c5ccbd150

啟動流程:
①點擊桌面App圖標,Launcher進程采用Binder IPC向system_server進程發(fā)起startActivity請求;
②system_server進程接收到請求后,向zygote進程發(fā)送創(chuàng)建進程的請求;
③Zygote進程fork出新的子進程,即App進程;
④App進程,通過Binder IPC向sytem_server進程發(fā)起attachApplication請求;
⑤system_server進程在收到請求后,進行一系列準備工作后,再通過binder IPC向App進程發(fā)送scheduleLaunchActivity請求;
⑥App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message后,通過發(fā)射機制創(chuàng)建目標Activity,并回調Activity.onCreate()等方法。
⑧到此,App便正式啟動,開始進入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法,UI渲染結束后便可以看到App的主界面。
App啟動過程
App啟動從用戶按下桌面圖標開始。
App都是由桌面啟動器啟動的,桌面啟動器自身也是一個App,它也存在一個進程,稱為Launcher進程,也叫調用者進程。
用戶按下桌面上的App圖標后,Launcher進程會將請求啟動主活動(MainActivity)的請求以Binder的方式發(fā)送給AMS服務。
AMS服務收到請求后,交付給ActivityStarter處理intent和flag信息,然后交給ActivityStackSuperVisior/ActivityStack處理Activity進程相關流程,同時通過Socket客戶端向Zygote進程請求孵化新進程。
Zygote進程收到請求后,創(chuàng)建一個新進程,這個新進程就是APP所在進程。
ActivityThread中會調用prepareMainLooper()方法,創(chuàng)建一個Looper對象,Looper對象會創(chuàng)建一個消息隊列MessageQueue,調用Looper.loop()方法后UI線程會進入消息循環(huán)體,不斷從消息隊列中取出消息Message對象并處理消息。
ApplicationThread類監(jiān)聽到了創(chuàng)建Activity的請求,ActivityThread通過ClassLoader類加載器加載Activity并創(chuàng)建Activity實例,然后回調onCreate()方法。

系統(tǒng)啟動流程
Zygote進程 –> SystemServer進程 –> 各種系統(tǒng)服務 –> 應用進程
當所有的服務都啟動完畢后,SystemServer會打印出“Making services ready”,然后通過ActivityManager啟動Home界面,并發(fā)送“ACTION_BOOT_COMPLETED”廣播消息
init進程:linux的根進程,android系統(tǒng)是基于linux系統(tǒng)的,因此可以算作是整個android操作系統(tǒng)的第一個進程;
Zygote進程:android系統(tǒng)的根進程,主要作用:可以作用Zygote進程fork出SystemServer進程和各種應用進程;
SystemService進程:主要是在這個進程中啟動系統(tǒng)的各項服務,比如ActivityManagerService,PackageManagerService,WindowManagerService服務等等;
各種應用進程:啟動自己編寫的客戶端應用時,一般都是重新啟動一個應用進程,有自己的虛擬機與運行環(huán)境;

而在Linux中,它的啟動可以歸為一下幾個流程:?
Boot Loader——>初始化內核——>。。。。。。?
當初始化內核之后,就會啟動一個相當重要的祖先進程,也就是init進程,在Linux中所有的進程都是由init進程直接或間接fork出來的。
而對于Android來說,前面的流程都是一樣的,而當init進程創(chuàng)建之后,會fork出一個Zygote進程,這個進程是所有Java進程的父進程。我們知道,Linux是基于C的,而Android是基于Java的(當然底層也是C)。所以這里就會fork出一個Zygote Java進程用來fork出其他的進程?!緮帱c1】
總結到了這里就提一下之后會談到的幾個非常重要的對象以及一個很重要的概念。
ActivityManagerServices(AMS):它是一個服務端對象,負責所有的Activity的生命周期,ActivityThread會通過Binder與之交互,而AMS與Zygote之間進行交互則是通過Socket通信(IPC通信在之后會總結到)
ActivityThread:它也就是我們俗稱的UI線程/主線程,它里面存在一個main()方法,這也是APP的真正入口,當APP啟動時,就會啟動ActivityThread中的main方法,它會初始化一些對象,然后開啟消息循環(huán)隊列(之后總結),之后就會Looper.loop死循環(huán),如果有消息就執(zhí)行,沒有就等著,也就是事件驅動模型(edt)的原理。
ApplicationThread:它實現(xiàn)了IBinder接口,是Activity整個框架中客戶端和服務端AMS之間通信的接口,同時也是ActivityThread的內部類。這樣就有效的把ActivityThread和AMS綁定在一起了。
Instrumentation:這個東西我把它理解為ActivityThread的一個工具類,也算是一個勞動者吧,對于生命周期的所有操作例如onCreate最終都是直接由它來執(zhí)行的。
Android系統(tǒng)中的客戶端和服務器的概念?
在Android系統(tǒng)中其實也存在著服務器和客戶端的概念,服務器端指的就是所有App共用的系統(tǒng)服務,比如上面的AMS,PackageManagerService等等,這些系統(tǒng)服務是被所有的App共用的,當某個App想要實現(xiàn)某個操作的時候,就會通知這些系統(tǒng)服務。
當Zygote被初始化的時候,會fork出System Server進程,這個進程在整個的Android進程中是非常重要的一個,地位和Zygote等同,它是屬于Application Framework層的,Android中的所有服務,例如AMS, WindowsManager, PackageManagerService等等都是由這個SystemServer fork出來的。所以它的地位可見一斑。
而當System Server進程開啟的時候,就會初始化AMS,同時,會加載本地系統(tǒng)的服務庫,創(chuàng)建系統(tǒng)上下文,創(chuàng)建ActivityThread及開啟各種服務等等。而在這之后,就會開啟系統(tǒng)的Launcher程序,完成系統(tǒng)界面的加載與顯示。
Android面試題(31)-App啟動流程
https://blog.csdn.net/pgg_cold/article/details/79491791
“三個進程”,“六個大類”
三個進程:
Launcher進程:整個App啟動流程的起點,負責接收用戶點擊屏幕事件,它其實就是一個Activity,里面實現(xiàn)了點擊事件,長按事件,觸摸等事件,可以這么理解,把Launcher想象成一個總的Activity,屏幕上各種App的Icon就是這個Activity的button,當點擊Icon時,會從Launcher跳轉到其他頁面;
SystemServer進程:這個進程在整個的Android進程中是非常重要的一個,地位和Zygote等同,它是屬于Application Framework層的,Android中的所有服務,例如AMS, WindowsManager, PackageManagerService等等都是由這個SystemServer fork出來的。所以它的地位可見一斑。
App進程:你要啟動的App所運行的進程;
六個大類:
ActivityManagerService:(AMS)AMS是Android中最核心的服務之一,主要負責系統(tǒng)中四大組件的啟動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統(tǒng)中的進程管理和調度模塊相類似,因此它在Android中非常重要,它本身也是一個Binder的實現(xiàn)類。
Instrumentation:監(jiān)控應用程序和系統(tǒng)的交互;
ActivityThread:應用的入口類,通過調用main方法,開啟消息循環(huán)隊列。ActivityThread所在的線程被稱為主線程;
ApplicationThread:ApplicationThread提供Binder通訊接口,AMS則通過代理調用此App進程的本地方法
ActivityManagerProxy:AMS服務在當前進程的代理類,負責與AMS通信。
ApplicationThreadProxy:ApplicationThread在AMS服務中的代理類,負責與ApplicationThread通信。
可以說,啟動的流程就是通過這六個大類在這三個進程之間不斷通信的過程;
我先簡單的梳理一下app的啟動的步驟:
(1)啟動的起點發(fā)生在Launcher活動中,啟動一個app說簡單點就是啟動一個Activity,那么我們說過所有組件的啟動,切換,調度都由AMS來負責的,所以第一步就是Launcher響應了用戶的點擊事件,然后通知AMS
(2)AMS得到Launcher的通知,就需要響應這個通知,主要就是新建一個Task去準備啟動Activity,并且告訴Launcher你可以休息了(Paused);
(3)Launcher得到AMS讓自己“休息”的消息,那么就直接掛起,并告訴AMS我已經Paused了;
(4)AMS知道了Launcher已經掛起之后,就可以放心的為新的Activity準備啟動工作了,首先,APP肯定需要一個新的進程去進行運行,所以需要創(chuàng)建一個新進程,這個過程是需要Zygote參與的,AMS通過Socket去和Zygote協(xié)商,如果需要創(chuàng)建進程,那么就會fork自身,創(chuàng)建一個線程,新的進程會導入ActivityThread類,這就是每一個應用程序都有一個ActivityThread與之對應的原因;
(5)進程創(chuàng)建好了,通過調用上述的ActivityThread的main方法,這是應用程序的入口,在這里開啟消息循環(huán)隊列,這也是主線程默認綁定Looper的原因;
(6)這時候,App還沒有啟動完,要永遠記住,四大組建的啟動都需要AMS去啟動,將上述的應用進程信息注冊到AMS中,AMS再在堆棧頂部取得要啟動的Activity,通過一系列鏈式調用去完成App啟動;
下面這張圖很好的描述了上面的六大步:

