android 冷啟動,android開啟app過程

APP的啟動過程是任何一個學習Android的人所必須了解的,這篇文章將會基于Android P完整的解析一個APP從其圖標被點擊到其界面顯示完畢的全過程 。
1、概述
概括地來說,一個APP的冷啟動過程可以劃分如下:
請求階段
1.發起請求
2.解析Intent
3.創建ActivityRecord
4.分配Task
5.Pause前臺activity
6.Resume請求的activity
進程啟動階段
7.AMS請求創建進程
8.Zygote fork進程
9.初始化 Runtime
10.注冊進程到system_server
11.創建application
Activity初始化階段
12.真正地start activity
13.加載activity
14.初始化窗口
Activity顯示階段
15.新建DecorView
16.新建ViewRootImpl
17.添加到Display
18.顯示
注意,這里說的是APP冷啟動的過程,如果不是冷啟動,經過的階段是上述階段的一個子集 。
2、發出啟動Activity的請求
Android為了降低開發難度,屏蔽底層進程間通訊等細節,抽象出了四大組件 。通過四大組件,我們可以方便、快捷地和其他組件進行交互,而不管目標組件是在哪個APP實現的、哪個進程中運行的 。而一個APP的主Activity通常聲明如下:
android.intent.action.MAIN:決定應用的入口Activity , 也就是我們啟動應用時首先顯示哪一個Activity 。
android.intent.category.LAUNCHER:表示activity應該被列入系統的啟動器(launcher)(允許用戶啟動它) 。Launcher是安卓系統中的桌面啟動器,是桌面UI的統稱 。
凡是聲明了上面filter的activity,都會被launcher解析出來 , 對應圖標排列在桌面 。這樣,用戶就可以通過點擊的方式啟動Activity了 。
APP端啟動activity流程是:
Acticity.startActivity(new Intent(this,target.class))
Acticity.startActivityForResult(...)
Instrumentation.execStartActivity(...)
IActivityManager.startActivity(...)
(為了簡潔起見,上面過程省略一些重載的調用,以后調用過程同樣如此) 。
APP請求啟動activity最重要的兩個參數:Context和Intent 。
Context指明我是誰 。為了安全認證和管理,系統必須知道誰請求啟動activity,而context里面包含著身份信息例如activity token等表明了我是誰,這樣ActivityManagerService(以后簡稱AMS)才允許啟動activity 。
Intent指明我想做什么 。上面的intent是顯式intent,顯式intent通常用在包內啟動組件 , 如果是啟動其他APP的組件 , 則通常用隱式intent 。顯式intent里面包含了一個ComponentName,ComponentName由包名類名組成,可以唯一標識一個組件,系統通過ComponentName就可以找到要啟動的組件 。隱式intent通常通過Action來過濾出要啟動的組件,這一點我們將在第3節中展開講述 。
在表明身份和說明意圖后,最后通過Binder調用請求AMS啟動目標activity
3、AMS解析Intent
本階段的調用流程是:
AMS.startActivity(...)
AMS.startActivityAsUser(...)
ActivityStarter.startActivity(...)
ActivityStarter.startActivityMayWait(...)
ResolveInfo rInfo = ASS.resolveIntent(intent,uid,...)
PackageManagerService.resolveIntent()
ActivityInfo aInfo = ASS.resolveActivity(intent, rInfo...);
ActivityStarter.startActivty(intent,aInfo,...)
AMS解析Intent主要是通過PackageManagerService后面簡稱(PMS)來解析的,因為我們四大組件都是必須聲明在AndroidManifest.xml文件中的(廣播接收器允許動態注冊) 。Android這么做的原因上面也說過了,為了屏蔽進程間通訊細節,應用之間通過組件就可以交互,系統會在必要的時候拉起對方進程 。在應用沒起來之前,只有PMS知道應用都有哪些組件 。應用四大組件的信息在應用安裝的時候,就已經被PMS解析保存起來了 。如果沒有聲明在AndroidManifest.xml文件中,那么AMS就無法獲取目標組件的信息,對于顯式intent,會拋出錯誤;對于隱式intent,也會啟動失敗 。