Android 個(gè)人也能搞的應(yīng)用啟動(dòng)優(yōu)化

一、啟動(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)程。


系統(tǒng)創(chuàng)建應(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è)面的真正繪制。



系統(tǒng)創(chuàng)建應(yīng)用進(jìn)程后續(xù)階段

二、確定應(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ù)。

任務(wù)執(zhí)行流程圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容