android App 啟動(dòng)流程詳解
- 啟動(dòng)請(qǐng)求階段
用戶點(diǎn)擊應(yīng)用圖標(biāo):
Launcher(桌面應(yīng)用)通過(guò) startActivity() 發(fā)送啟動(dòng)請(qǐng)求,攜帶目標(biāo)應(yīng)用的入口 Activity 信息,如包名和組件名15。
Launcher 請(qǐng)求傳遞:
啟動(dòng)請(qǐng)求通過(guò) Binder 機(jī)制傳遞給系統(tǒng)服務(wù) ActivityManagerService(AMS)進(jìn)行合法性驗(yàn)證(如權(quán)限、Intent 匹配等)15。
- AMS 處理請(qǐng)求
創(chuàng)建 Task 和 ActivityRecord:
AMS 為待啟動(dòng)的 Activity 創(chuàng)建新的 Task(任務(wù)棧)和 ActivityRecord,用于管理 Activity 的生命周期和狀態(tài)15。
調(diào)度啟動(dòng)任務(wù):
AMS 將啟動(dòng)請(qǐng)求加入系統(tǒng)主線程的消息隊(duì)列,等待調(diào)度執(zhí)行16。
- 應(yīng)用進(jìn)程創(chuàng)建
Zygote 孵化新進(jìn)程:
若目標(biāo)應(yīng)用進(jìn)程未運(yùn)行,AMS 通過(guò) Socket 向 Zygote 進(jìn)程發(fā)送請(qǐng)求,由 Zygote 調(diào)用 fork() 創(chuàng)建新進(jìn)程,繼承已預(yù)加載的類庫(kù)和資源47。
執(zhí)行 ActivityThread.main():
新進(jìn)程啟動(dòng)后,執(zhí)行 ActivityThread 的 main() 方法,初始化主線程的 Looper 和消息循環(huán)34。
- 組件初始化
綁定 Application:
ActivityThread 調(diào)用 attach() 方法向 AMS 注冊(cè)應(yīng)用進(jìn)程,隨后創(chuàng)建 Application 實(shí)例并執(zhí)行其 onCreate() 方法34。
創(chuàng)建 Activity 實(shí)例:
AMS 通過(guò) Binder 通知應(yīng)用進(jìn)程創(chuàng)建目標(biāo) Activity,觸發(fā) Activity 的生命周期方法(如 onCreate()、onStart())13。
- 界面顯示
界面渲染:
Activity 的 onResume() 方法執(zhí)行后,View 系統(tǒng)通過(guò) ViewRootImpl 完成界面測(cè)量、布局和繪制,最終通過(guò) SurfaceFlinger 合成顯示到屏幕16。
啟動(dòng)完成:
Activity 界面完全顯示后,啟動(dòng)流程結(jié)束,應(yīng)用進(jìn)入可交互狀態(tài)15。
關(guān)鍵依賴組件
Zygote:預(yù)加載系統(tǒng)資源,快速孵化應(yīng)用進(jìn)程78。
AMS:統(tǒng)一管理 Activity 生命周期和進(jìn)程調(diào)度15。
Binder IPC:跨進(jìn)程通信機(jī)制,支撐系統(tǒng)服務(wù)與應(yīng)用進(jìn)程的交互17。
此流程綜合了系統(tǒng)服務(wù)協(xié)作、進(jìn)程創(chuàng)建、組件初始化及界面渲染,核心目標(biāo)是在保證安全性和效率的前提下完成應(yīng)用啟動(dòng)