天天看點

安卓系統應用啟動流程分析

随着移動開發的興起,安卓系統的重要性愈加突顯。本文簡要介紹安卓系統上應用啟動流程,對于應用開發、系統定制以及性能優化人員來說,熟悉應用啟動流程會使得在今後的工作中更加得心應手,做到知其然,知其是以然。本文主要面向開發人員,假定讀者已有一定的安卓基礎。

本文以安卓P版本為基礎,不同安卓版本上應用啟動流程略有差異,但核心邏輯仍然一緻。

安卓上應用啟動的幾種形式

冷啟動

這種方式應用需要完成完整的啟動過程,即建立程序、初始化資源及顯示應用界面,相比于另外兩種啟動模式,應用冷啟動耗時最長。

熱啟動

這種方式下應用程序已經啟動,通常隻需将要顯示的activity帶到前台即可,是以在該模式下應用可以較快速啟動。

溫啟動

這種方式需要完成部分冷啟動過程,比如程序已經建立,但要重新執行activity的onCreate()來建立要顯示的activity,這種模式下的啟動時間介于以上兩種之間。

本文主要介紹冷啟動的執行流程。

應用啟動相關的一些基本概念

zygote

該程序是安卓上所有應用程序的父程序,在開機過程中由系統啟動并保持運作狀态。由于現在的安卓平台大部分同時支援32位和64位應用,zygote也分為32位和64位兩個版本,其原理相同,在本文中不做區分。

system_server

安卓上的系統服務程序,絕大部分主要系統服務都駐留在該程序内,包括下文中介紹的AMS、WMS、PMS等。system_server由zygote在啟動程序中分裂而來(即也是zygote的子程序),然後持續運作。

AMS

Activity Manager Service,是安卓上的一個核心服務,負責管理應用各個元件,所有應用在其生命周期内均需和AMS打交道。該服務駐留在system_server程序内。 

WMS

Window Manager Service,是安卓上的視窗管理服務,負責處理應用的界面顯示相關的請求。該服務駐留在system_server程序内。

PMS

Package Manager Service,是安卓上的包管理服務,負責處理應用的安裝、缷載等。該服務駐留在system_server程序内。

應用冷啟動的任務序列

在冷啟動時,系統首先有三個任務:

1. 在AMS端配置設定應用資源;

2. 顯示應用的空白啟動視窗;

3. 建立應用程序;

在應用程序啟動後,應用程序會負責啟動的後續階段:

1. 建立應用對象;

2. 啟動主線程;

3. 建立主activity并完成繪制及顯示;

應用程序完成第一幀繪制後,系統會将空白視窗替換為應用的畫面,此時,使用者可以開始使用應用。

典型的冷啟動場景及流程

接下來,我們以一個典型場景,即從桌面點選應用圖示啟動應用這一過程,來介紹應用啟動流程。其它應用啟動場景,比如從指令行啟動,或者從A應用啟動B應用,與本場景大同小異,本文中不再另做說明。

先看下簡要的流程圖:

安卓系統應用啟動流程分析

如上圖所示,當使用者點選桌面上應用圖示後,Launcher程序會将應用資訊發送給AMS,由于這時應用程序還沒有啟動,是以需要先建立應用程序,AMS收到請求後會發送指令給zygote程序要求建立目标應用程序,當目标程序啟動後,會将自身的遠端handle注冊給AMS,這樣AMS就可以控制應用程序去執行接下來的一系列啟動操作。

接下來,我們對這一過程做下詳細說明。

1. 使用者點選應用圖示後,launcher程序向system_server程序發消息請求啟動應用程序,即launcher通過startActivity()向AMS發送請求啟動對應的activity,核心代碼如下:

frameworks/base/core/java/android/app/Activity.java

安卓系統應用啟動流程分析

其中,參數intent包含了要啟動的目标應用的資訊。

以上代碼最終會調用AMS内部的startActivity(),由于Launcher和AMS分屬不同程序,這一過程通過binder通信。

2. system_server程序收到請求後,通過其内部邏輯,即AMS收到startActivity()調用後,會進行必要的權限檢查,建立activity的内部表示即ActivityRecord對象,并顯示一個空白的視窗。

核心代碼如下:

frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java

安卓系統應用啟動流程分析

由于應用冷啟動時程序不存在,AMS會通過zygote建立應用程序。

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

安卓系統應用啟動流程分析

具體流程如下:

安卓系統應用啟動流程分析

在非冷啟動的情況,即如果應用程序已經啟動完成,則可以直接進入啟動activity的邏輯,代碼如下:

安卓系統應用啟動流程分析

在冷啟動的startProcessLocked()調用過程中,有一個參數需要特别注意,即 ”entryPoint”,這個參數表示zygote分裂出的應用程序的入口,其定義為:

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

安卓系統應用啟動流程分析

也就是說,ActivityThread是應用程式的入口。

3. 當應用程序啟動後,會進入ActivityThread的main()方法執行應用端邏輯;

frameworks/base/core/java/android/app/ActivityThread.java

安卓系統應用啟動流程分析

建立ActivityThread對象時,會同時建立應用程序的表示對象,即該應用的handle,代碼如下:

安卓系統應用啟動流程分析

同時要特别注意應用程序的“attach”操作,這一操作會将應用程序自身的遠端handle即mAppThread注冊給AMS,這樣AMS就可以和應用通信,通知應用執行後續的操作,啟動相應的activity;

安卓系統應用啟動流程分析

4. 現在應用程序已經啟動,并且已與AMS建立關聯,AMS會繼續執行啟動應用的第一個activity的邏輯;

安卓系統應用啟動流程分析

其中,realStartActivityLocked()會通知應用啟動相應activity,邏輯如下:

安卓系統應用啟動流程分析

5. 應用程序收到 ”launch”及”resume” 指令後,就會建立相應的activity對象以及關聯的視窗對象等資源,并調用activity的生命周期回調函數完成activity的顯示;到此,應用程序的第一個activity就建立完成了;

初始化圖形資源及與WMS的連接配接:

安卓系統應用啟動流程分析

建立activity對象:

安卓系統應用啟動流程分析

初始化activity執行個體:

安卓系統應用啟動流程分析

調用activity的onCreate()函數:

安卓系統應用啟動流程分析

接下來會繼續activity的其它生命周期回調函數并将activity顯示出來,至此,一個應用的首個activity即完成了啟動。

總結

本文簡要說明了安卓平台上應用啟動的流程,通過本篇介紹,希望讀者能理清應用啟動的大緻脈絡,對應用啟動過程有一個基本的了解。