1. 程式人生 > >Android UI優化—App啟動流程和啟動模式

Android UI優化—App啟動流程和啟動模式

Android 理論基礎

1、每一個Android App都執行在一個單獨的程序中
2、Android App由很多不同元件組成,這些元件還可以啟動其他App的元件
3、一個程序裡面只有一個主執行緒
4、程序在其需要的時候被啟動
基於上述共識,我們先來分析Android系統的啟動流程,然後再分析App的啟動流程。

Android系統啟動流程

Android系統啟動時, bootloader啟動核心和init程序,init程序分裂出更多名為"daemons(守護程序)"的底層的Linux程序,諸如android debug deamon, USB deamon等。這些守護程序處理底層硬體相關的介面。
隨後, init程序會啟動一個非常有意思的程序—“Zygote”(Zygote的中文意思為受精卵)。這是一個Android平臺的非常基礎的程序。這個程序初始化了第一個VM,並且預載入了framework和眾多App所需要的通用資源。然後它開啟一個Socket介面來監聽請求,根據請求孵化出新的VM來管理新的App程序。一旦收到新的請求,Zygote會基於自身預先載入的VM來孵化出一個新的VM建立一個新的程序。
啟動Zygote之後,init程序會啟動runtime程序。Zygote會孵化出一個超級管理程序—System Server。SystemServer會啟動所有系統核心服務,例如Activity Manager Service,硬體相關的Service等。到此,系統準備好啟動它的第一個App程序—Home程序了。
綜上,總結出Android 系統啟動流程

如下:
1、bootloader啟動核心和init程序
2、init程序產生守護程序— daemons
3、init程序啟動Zygote程序
4、Zygote程序初始化第一個VM, 預載入framework和通用資源
5、init程序啟動runtime程序
6、Zygote程序孵化出System Server

App啟動流程

App流程的幾個基本步驟如下:
1、建立程序
2、繫結Application
3、啟動Activity

下面具體分析一下每個步驟,如下圖:
App啟動流程
當用戶點選一個App圖示時,Click事件會通過Binder IPC機制呼叫startActivity(Intent), 最終呼叫到ActivityManagerService。在ActivityManagerService中做三件事:
1、通過PackageManager的resolveIntent()收集這個intent物件的指向資訊,
指向資訊被儲存在一個intent物件中。
2、通過grantUriPermissionLocked()方法來驗證使用者是否有足夠的許可權去呼叫該intent物件指向的Activity。
3、如果有許可權, ActivityManagerService會檢查這個程序的ProcessRecord是否存在。如果不存在, ActivityManagerService會建立新的程序來例項化目標activity。
ActivityManagerService建立新的程序並例項化目標activity分為三個步驟,也就是上面說的App啟動的三個步驟。
第一步,建立程序


ActivityManagerService呼叫startProcessLocked()方法來建立新的程序,該方法會通過socket通道傳遞引數給“Zygote”程序。 Zygote孵化自身,並呼叫ZygoteInit.main()方法來例項化ActivityThread物件並最終返回新程序的pid。隨後ActivityThread依次呼叫Looper.prepareLoop()和Looper.loop()來開啟訊息迴圈。
第二步,繫結Application
第二步要做的就是將程序和指定的Application繫結起來。這個是通過ActivityThread物件中呼叫bindApplication()方法完成的。該方法傳送一個BIND_APPLICATION的訊息到訊息佇列中,最終通過handleBindApplication()方法處理該訊息。然後呼叫makeApplication()方法來載入App的classes到記憶體中。
第三步,啟動Activity

經過前兩個步驟之後,系統中已經擁有了該App的程序。後面的步驟就是從一個已經存在的程序中啟動一個新程序的activity了。該步驟實際呼叫方法是realStartActivity(),它會呼叫application執行緒物件中的sheduleLaunchActivity()傳送一個LAUNCH_ACTIVITY訊息到訊息佇列中,通過 handleLaunchActivity()來處理該訊息。
經過這三個步驟,就成功啟動了一個App。

App啟動模式

由上述App啟動流程可以看出,App啟動需要判斷系統中是否有該App的程序,沒有的話就需要建立。故App的啟動模式可以根據系統中是否存在App的程序分為熱啟動和冷啟動兩種,如下:
冷啟動:App沒有啟動過或App程序被killed, 系統中不存在該App程序。
熱啟動:App程序處於後臺, 系統將其從後臺帶到前臺, 展示給使用者。