Android App啟動時間測量
一、測量方式
1. 使用AM服務啟動App的第一個介面並輸出應用啟動時間。
通過adb命令執行am命令啟動App並出界應用啟動時間。
命令格式:
adb shell am start -W packagename/packagename.首頁Activity
示例:
adb shell am start -W com.example.demoapp/com.example.demoapp.MainActivity2
結果:
➜ DemoApp adb shell am start -W com.example.demoapp/com.example.demoapp.MainActivity2 Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.demoapp/.MainActivity2 } Status: ok Activity: com.example.demoapp/.MainActivity2 ThisTime: 967 TotalTime: 967 WaitTime: 1011 Complete
ThisTime:最後啟動的Activity的耗時。
TotalTime:所有Activity啟動耗時。
WaitTime:是AMS啟動Activity耗時。
由於例子中只啟動了一個Activity,所以ThisTime和TotalTime時間一致。
使用adb shell am命令很方便的輸出了應用啟動時間及Activity啟動耗時,但是,時間並不太精準。
在實際場景也不會有應用去執行adb shell am命令收集指定應用的啟動耗時。
應用啟動耗時統計從App啟動到首頁第一屏展示過程的時間,而不是單指應用首頁Activity啟動耗時。
2. 手動打點
需要明確應用啟動到首頁第一屏UI展示為結束的時間點計算為應用啟動時間。
從桌面launch觸發應用啟動到首頁Activity展示,這個過程中哪些是應用中可以控制的,哪些是系統控制的。
launch App -> AMS -> zygote -> create app process -> attachApplication -> bindApplication -> create activity。 這個過程應用最早被呼叫的函式是Application.attachApplication()。
應用啟動時間從Application.attachApplication()函式中開始計時,一直到首頁Activity第一屏UI展示結束,是應用啟動的耗時。
在網上大部分資源都是到首頁Activity.onWindowFocusChanged(hasFocus: Boolean)函式,這個函式是Activity的首幀渲染時間,並不是首頁第一屏展示時間。