標籤:lin 發送 不可 android系統 核心 self 一個 調用 方法
轉載:http://www.51testing.com/html/34/n-3725434.html
? 先對整體有了一個基本的認識之後,再去看細節 談到
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啟動流程之前,先看一張前人的流程圖: 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 到記憶體中。 大概的流程如下,如果需要做一些特殊的處理,還是需要自己深入到源碼中,找到自己可以處理的點,進行一些定製化處理。
Android Application啟動流程