安卓系统应用启动流程分析
隨著移動開發(fā)的興起,安卓系統(tǒng)的重要性愈加突顯。本文簡要介紹安卓系統(tǒng)上應用啟動流程,對于應用開發(fā)、系統(tǒng)定制以及性能優(yōu)化人員來說,熟悉應用啟動流程會使得在今后的工作中更加得心應手,做到知其然,知其所以然。本文主要面向開發(fā)人員,假定讀者已有一定的安卓基礎(chǔ)。
本文以安卓P版本為基礎(chǔ),不同安卓版本上應用啟動流程略有差異,但核心邏輯仍然一致。
安卓上應用啟動的幾種形式
冷啟動
這種方式應用需要完成完整的啟動過程,即創(chuàng)建進程、初始化資源及顯示應用界面,相比于另外兩種啟動模式,應用冷啟動耗時最長。
熱啟動
這種方式下應用進程已經(jīng)啟動,通常只需將要顯示的activity帶到前臺即可,所以在該模式下應用可以較快速啟動。
溫啟動
這種方式需要完成部分冷啟動過程,比如進程已經(jīng)創(chuàng)建,但要重新執(zhí)行activity的onCreate()來創(chuàng)建要顯示的activity,這種模式下的啟動時間介于以上兩種之間。
本文主要介紹冷啟動的執(zhí)行流程。
應用啟動相關(guān)的一些基本概念
zygote
該進程是安卓上所有應用進程的父進程,在開機過程中由系統(tǒng)啟動并保持運行狀態(tài)。由于現(xiàn)在的安卓平臺大部分同時支持32位和64位應用,zygote也分為32位和64位兩個版本,其原理相同,在本文中不做區(qū)分。
system_server
安卓上的系統(tǒng)服務進程,絕大部分主要系統(tǒng)服務都駐留在該進程內(nèi),包括下文中介紹的AMS、WMS、PMS等。system_server由zygote在啟動進程中分裂而來(即也是zygote的子進程),然后持續(xù)運行。
AMS
Activity Manager Service,是安卓上的一個核心服務,負責管理應用各個組件,所有應用在其生命周期內(nèi)均需和AMS打交道。該服務駐留在system_server進程內(nèi)。?
WMS
Window Manager Service,是安卓上的窗口管理服務,負責處理應用的界面顯示相關(guān)的請求。該服務駐留在system_server進程內(nèi)。
PMS
Package Manager Service,是安卓上的包管理服務,負責處理應用的安裝、缷載等。該服務駐留在system_server進程內(nèi)。
應用冷啟動的任務序列
在冷啟動時,系統(tǒng)首先有三個任務:
1. 在AMS端分配應用資源;
2. 顯示應用的空白啟動窗口;
3. 創(chuàng)建應用進程;
在應用進程啟動后,應用進程會負責啟動的后續(xù)階段:
1. 創(chuàng)建應用對象;
2. 啟動主線程;
3. 創(chuàng)建主activity并完成繪制及顯示;
應用進程完成第一幀繪制后,系統(tǒng)會將空白窗口替換為應用的畫面,此時,用戶可以開始使用應用。
典型的冷啟動場景及流程
接下來,我們以一個典型場景,即從桌面點擊應用圖標啟動應用這一過程,來介紹應用啟動流程。其它應用啟動場景,比如從命令行啟動,或者從A應用啟動B應用,與本場景大同小異,本文中不再另做說明。
先看下簡要的流程圖:
如上圖所示,當用戶點擊桌面上應用圖標后,Launcher進程會將應用信息發(fā)送給AMS,由于這時應用進程還沒有啟動,所以需要先創(chuàng)建應用進程,AMS收到請求后會發(fā)送命令給zygote進程要求創(chuàng)建目標應用進程,當目標進程啟動后,會將自身的遠程handle注冊給AMS,這樣AMS就可以控制應用進程去執(zhí)行接下來的一系列啟動操作。
接下來,我們對這一過程做下詳細說明。
1. 用戶點擊應用圖標后,launcher進程向system_server進程發(fā)消息請求啟動應用進程,即launcher通過startActivity()向AMS發(fā)送請求啟動對應的activity,核心代碼如下:
frameworks/base/core/java/android/app/Activity.java
其中,參數(shù)intent包含了要啟動的目標應用的信息。
以上代碼最終會調(diào)用AMS內(nèi)部的startActivity(),由于Launcher和AMS分屬不同進程,這一過程通過binder通信。
2. system_server進程收到請求后,通過其內(nèi)部邏輯,即AMS收到startActivity()調(diào)用后,會進行必要的權(quán)限檢查,創(chuàng)建activity的內(nèi)部表示即ActivityRecord對象,并顯示一個空白的窗口。
核心代碼如下:
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
由于應用冷啟動時進程不存在,AMS會通過zygote創(chuàng)建應用進程。
核心代碼如下:
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
具體流程如下:
在非冷啟動的情況,即如果應用進程已經(jīng)啟動完成,則可以直接進入啟動activity的邏輯,代碼如下:
在冷啟動的startProcessLocked()調(diào)用過程中,有一個參數(shù)需要特別注意,即 ”entryPoint”,這個參數(shù)表示zygote分裂出的應用進程的入口,其定義為:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
也就是說,ActivityThread是應用程序的入口。
3. 當應用進程啟動后,會進入ActivityThread的main()方法執(zhí)行應用端邏輯;
核心代碼如下:
frameworks/base/core/java/android/app/ActivityThread.java
創(chuàng)建ActivityThread對象時,會同時創(chuàng)建應用進程的表示對象,即該應用的handle,代碼如下:
frameworks/base/core/java/android/app/ActivityThread.java
同時要特別注意應用進程的“attach”操作,這一操作會將應用進程自身的遠程handle即mAppThread注冊給AMS,這樣AMS就可以和應用通信,通知應用執(zhí)行后續(xù)的操作,啟動相應的activity;
核心代碼如下:
frameworks/base/core/java/android/app/ActivityThread.java
4. 現(xiàn)在應用進程已經(jīng)啟動,并且已與AMS建立關(guān)聯(lián),AMS會繼續(xù)執(zhí)行啟動應用的第一個activity的邏輯;
核心代碼如下:
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
其中,realStartActivityLocked()會通知應用啟動相應activity,邏輯如下:
5. 應用進程收到 ”launch”及”resume” 命令后,就會創(chuàng)建相應的activity對象以及關(guān)聯(lián)的窗口對象等資源,并調(diào)用activity的生命周期回調(diào)函數(shù)完成activity的顯示;到此,應用進程的第一個activity就創(chuàng)建完成了;
核心代碼如下:
frameworks/base/core/java/android/app/ActivityThread.java
初始化圖形資源及與WMS的連接:
創(chuàng)建activity對象:
初始化activity實例:
調(diào)用activity的onCreate()函數(shù):
接下來會繼續(xù)activity的其它生命周期回調(diào)函數(shù)并將activity顯示出來,至此,一個應用的首個activity即完成了啟動。
總結(jié)
本文簡要說明了安卓平臺上應用啟動的流程,通過本篇介紹,希望讀者能理清應用啟動的大致脈絡,對應用啟動過程有一個基本的理解。
參考資料
[1]http://androidxref.com/
[2]https://developer.android.com/topic/performance/vitals/launch-time
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
嵌入式Linux
微信掃描二維碼,關(guān)注我的公眾號
總結(jié)
以上是生活随笔為你收集整理的安卓系统应用启动流程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle常用高级函数,oracle常
- 下一篇: SAP系统-WMS Paywall 接口