Android 性能優化 - 啓動速度優化

啓動的類型

通常分爲,冷啓動和熱啓動html

冷啓動:啓動時,後臺沒有任何該應用的進程,系統須要從新建立一個進程,並結合啓動參數啓動該應用。python

熱啓動:啓動時,系統已經有該應用的進程(好比按 home 鍵臨時退出該應用)下啓動該應用。android

如何獲取啓動時間

  1. 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 的啓動時間。

  1. 時間戳

時間戳的方法基於如下的 2 個知識點。

  • 應用進程剛建立,會調用 Application 的 onCreate 方法。
  • 首次進入一個 Activity 後會在 onResume() 方法後面調用 onWindowsFocusChange 方法。

結合這 2 個特性,咱們能夠在 A Application 的 onCreate() 方法和 Activity 的 onWindowsFocusChange 方法裏面,經過時間戳來獲取應用的冷啓動時間。

如何監控啓動過程

  1. 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 就能夠看到詳細的啓動信息。

  1. 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 裏面打開,能夠看到從 startMethodTracingSamplingstartMethodTracing 過程當中的方法調用等信息,也能夠較好的分析啓動問題。

通常有那些優化方法

  1. 耗時操做放到異步進程

好比文件解壓、讀寫等耗時 IO 操做能夠新開一個線程來執行。

  1. 延時初始化

即暫時不適用的工具類等延後到使用的時候再去初始化。好比從 xml 裏面讀取顏色,能夠考慮在使用的時候再去讀取和解析。

  1. 線程優化

線程的建立須要消耗較多的系統系統資源,減小線程的建立。能夠考慮共用一個線程池。

如何檢測線程的建立,能夠參考我個開源庫 performance

聯繫我

相關文章
相關標籤/搜索