先對整體有了一個基本的認識之後,再去看細節
談到Android Application的啟動流程,很多文章都是各種源碼類和方法的一堆調用關系,這樣的文章就算看一百遍,也隻是雲裡霧裡。源碼得看,但是最好不要一下子深陷到源碼的細節之中,不可自拔。這裡站在前人的基礎之上做一個總結。
在說應用的啟動流程之前,得先了解一下Android系統的啟動流程,因為Application的啟動是離不開系統的處理的。
Android系統的啟動流程
1.BootLoader啟動核心和init程序;
2.init程序分裂出過個守護程序,如Android Debug Damon,USB Damon,這些守護程序會處理一些與硬體相關的接口;
3.init程序啟動一個Zygote程序
Zygote程序初始化了第一個VM,并預加載了Framework和一些通用資源。
zygote程序會開啟一個Socket接口,用來監聽請求。一旦收到請求,Zygote會基于自身預先加載的VM來孵化一個新的VM,并建立一個新的程序。
4.啟動Zygote之後,init程序會啟動Runtime程序。Zygote會孵化出一個超級管理程序-System Server。System Server 會啟動所有系統核心的服務,如Activity Manager Service以及硬體相關的Service。
5.這個時候就開始準備啟動它的第一個App程序-Home程序了。
Android系統已經啟動完畢,一些核心的服務也已經啟動完畢,然後啟動Launcher應用,那麼什麼時候啟動應用的程序呢?
App程序什麼時候被建立?
答案是被需要的時候才建立。
如果當一個應用(多是Launcher)調用App中的頁面之時,如果目标程序不存在,則會建立一個新的程序并啟動。
Application啟動流程
在說Application啟動流程之前,先看一張前人的流程圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN1MjYiFmNhJGOiVzMiVGOjNWYkZDN5ATN4gjN3EmZh9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
App啟動流程
分析流程的時候,可以同時看一下上面的流程圖。
點選桌面Icon
然後調用StartActivity(Intent intent)方法;
這個方法最終會通過Binder IPC的方式調用ActivityManagerService,這裡簡稱AMS。
AMS會執行以下操作:
最終會通過PackageManager的resolveIntent()方法收集這個Intent對象的指向資訊(中間會經曆很多類,方法的調用)。
通過grantUriPermissionLocked()方法驗證使用者是否具有足夠的權限去調用目标Activity;
查詢ProcessRecord是否存在
如果不存在,AMS會建立新的程序來執行個體化目标Activity。
接下來就說App程序的建立過程了。
App程序的建立
調用startProcessLocked()方法建立新的程序
通過上面所說的Socket通道傳遞參數給Zygote程序,Zygote程序孵化自身,并調用ZygoteInit.main()方法來執行個體化ActivityThread對象,并最終傳回新程序的pid。
ActivityThread依次調用Looper.prepare()和Looper.loop()方法來開啟消息循環。
這個時候程序已經建立完畢,但是如何與應用自身的Application聯系起來呢?
Application的綁定
調用ActivityThread中的bindApplication()方法發送一個BIND_APPLICATION的消息到消息隊列中.
通過handleApplication()方法處理之前的綁定消息;
調用makeApplication()方法來加載Application的class 到記憶體中。
大概的流程如下,如果需要做一些特殊的處理,還是需要自己深入到源碼中,找到自己可以處理的點,進行一些定制化處理。
上文内容不用于商業目的,如涉及知識産權問題,請權利人聯系博為峰小編(021-64471599-8017),我們将立即處理。