天天看點

android application 方法,Android Application啟動流程

先對整體有了一個基本的認識之後,再去看細節

談到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啟動流程之前,先看一張前人的流程圖:

android application 方法,Android Application啟動流程

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),我們将立即處理。