啓動的類型
通常分爲,冷啓動和熱啓動html
冷啓動:啓動時,後臺沒有任何該應用的進程,系統須要從新建立一個進程,並結合啓動參數啓動該應用。python
熱啓動:啓動時,系統已經有該應用的進程(好比按 home 鍵臨時退出該應用)下啓動該應用。android
如何獲取啓動時間
- adb 命令
adb shell am start -S -W 包名/啓動類的全名git
adb shell am start -S -W xxx/xxxActivity Stopping: xxx Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=xxx/xxxActivity } Status: ok Activity: xxx/xxxActivity ThisTime: 770 TotalTime: 770 WaitTime: 848 Complete
ThisTime: 表示最後一個 Activity 啓動時間github
TotalTime: 表示啓動過程當中,全部的 Activity 的啓動時間shell
WaitTime: 表示應用進程的建立時間 + TotalTime瀏覽器
通常咱們關注 TotalTime
就行了。app
另外,谷歌在 Android4.4(API 19)上也提供了測量方法,在 logcat 中過濾 Displayed 字段也能夠看到啓動時間異步
2021-04-06 19:25:52.803 2210-2245 I/ActivityManager: Displayed xxx/xxxActivity: +623ms工具
+623ms
就是Activity 的啓動時間。
- 時間戳
時間戳的方法基於如下的 2 個知識點。
- 應用進程剛建立,會調用 Application 的 onCreate 方法。
- 首次進入一個 Activity 後會在 onResume() 方法後面調用 onWindowsFocusChange 方法。
結合這 2 個特性,咱們能夠在 A Application 的 onCreate() 方法和 Activity 的 onWindowsFocusChange 方法裏面,經過時間戳來獲取應用的冷啓動時間。
如何監控啓動過程
- systrace
systrace 是一個功能很強大的工具,除了能夠查看卡頓問題,也能夠用來查看應用的啓動問題。使用示例以下:
python $ANDROID_HOME/platform-tools/systrace/systrace.py gfx view wm am pm ss dalvik app sched -b 90960 -a 你的包名 -o test.log.html
用 Google 瀏覽器打開 test.log.html
就能夠看到詳細的啓動信息。
- Debug 接口
package android.os; ... class Debug { ... public static void startMethodTracingSampling(String tracePath, int bufferSize, int intervalUs) { } public static void startMethodTracing(String tracePath, int bufferSize) { } }
利用 Debug 類的這兩個方法,能夠生成一個 trace
文件,這個 trace
文件,能夠直接在 AS
裏面打開,能夠看到從 startMethodTracingSampling
到 startMethodTracing
過程當中的方法調用等信息,也能夠較好的分析啓動問題。
通常有那些優化方法
- 耗時操做放到異步進程
好比文件解壓、讀寫等耗時 IO 操做能夠新開一個線程來執行。
- 延時初始化
即暫時不適用的工具類等延後到使用的時候再去初始化。好比從 xml 裏面讀取顏色,能夠考慮在使用的時候再去讀取和解析。
- 線程優化
線程的建立須要消耗較多的系統系統資源,減小線程的建立。能夠考慮共用一個線程池。
如何檢測線程的建立,能夠參考我個開源庫 performance
聯繫我
-
Github: https://github.com/XanderWang
-
Mail: 420640763@qq.com