一、啟動(dòng)流程的內(nèi)部機(jī)制
1.點(diǎn)擊app應(yīng)用圖標(biāo),通過(guò)binder發(fā)送到system_server進(jìn)程
2.system_server調(diào)用Process.start()?收集 uid、gid 等參數(shù)信息,通過(guò)socket發(fā)送給Zygote進(jìn)程請(qǐng)求創(chuàng)建新進(jìn)程
3.Zygote進(jìn)程收到請(qǐng)求后,調(diào)用 ZygoteInit.main() 方法進(jìn)行 runSelectLoop() 循環(huán)體內(nèi),當(dāng)有客戶(hù)端連接時(shí)執(zhí)行 ZygoteConnection.runOnce() 方法,再經(jīng)過(guò)層層調(diào)用后 fork 出新的應(yīng)用進(jìn)程。

4.開(kāi)始啟動(dòng)應(yīng)用,應(yīng)用的啟動(dòng)流程主要分為三步:?jiǎn)?dòng)主線(xiàn)程,創(chuàng)建 Application,創(chuàng)建 MainActivity
5.ActivityThread調(diào)用main方法,進(jìn)行初始化,創(chuàng)建主進(jìn)程handler,開(kāi)啟looper信息輪訓(xùn),通過(guò)bindApplication方法進(jìn)行Application創(chuàng)建和初始化,執(zhí)行Application的生命周期
6.通過(guò)主線(xiàn)程 Handler,在主線(xiàn)程中執(zhí)行 Activity 的創(chuàng)建和啟動(dòng),執(zhí)行LifeCycle結(jié)束之后,執(zhí)行到ViewRootImpl,開(kāi)始頁(yè)面的真正繪制。

二、確定應(yīng)用冷啟動(dòng)的開(kāi)始時(shí)間和結(jié)束時(shí)間
1.開(kāi)始時(shí)間:定位Application的attachBaseContext,應(yīng)用進(jìn)程的第一個(gè)生命周期,最早的預(yù)加載時(shí)機(jī)。
2.結(jié)束時(shí)間:頁(yè)面上的首幀加載完成的時(shí)間,即itemView回調(diào)perDrawCallback()的時(shí)間點(diǎn)作為結(jié)束時(shí)間。
三、啟動(dòng)時(shí)間分析工具
1.Displayed:日志Displayed關(guān)鍵字過(guò)濾
2.通過(guò)adb shell運(yùn)行app,查看相應(yīng)信息
3.reportFullyDrawn:在異步任務(wù)完成之后調(diào)用activity.reportFullyDrawn()打印系統(tǒng)日志
4.AOP編譯插樁技術(shù) 埋點(diǎn)
四、具體實(shí)用分析工具
1.TraceView:通過(guò)在耗時(shí)代碼前面分別調(diào)用Debug.startMethodTracing()與?Debug.stopMethodTracing(),運(yùn)行應(yīng)用后,在(SD卡) Android/data/包名/files ?目錄下找到dmtrace.trace文件,在as中點(diǎn)擊分析。
2.CPU Profiler:
(1)在 Android Studio 工具中選擇 Run > Edit Configurations 配置界面
(2)在 App 中選擇 Profiling,勾選 Start this recording on startup 選項(xiàng)
(3)從菜單中選擇 Java/Kotlin Methods Trace
(4)通過(guò)選擇 Run > Profile,待應(yīng)用運(yùn)行起來(lái)
(5)在Profiler里面分析。
3.Perfetto技術(shù)。
五、可行的實(shí)戰(zhàn)優(yōu)化方案
1.視覺(jué)優(yōu)化:在啟動(dòng)頁(yè)主題中,通過(guò)windowBackground設(shè)置一個(gè)啟動(dòng)背景
2.異步任務(wù)優(yōu)化:?jiǎn)?dòng)器
(1)對(duì)初始化任務(wù)代碼 Task 化,啟動(dòng)任務(wù)抽象為 Task 類(lèi)
(2)根據(jù)所有任務(wù)依賴(lài)關(guān)系排序生成有向無(wú)環(huán)圖,也就是對(duì)所有任務(wù)進(jìn)行有向無(wú)環(huán)圖的拓?fù)渑判蛩惴ㄅ判?,將并行效率最大化?/p>
(3)多線(xiàn)程按照排序之后的優(yōu)先級(jí)依次執(zhí)行任務(wù)。
