要對App進(jìn)行啟動優(yōu)化,需要了解幾個概念。
- 冷啟動:當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進(jìn)程,這時系統(tǒng)會重新創(chuàng)建一個新的進(jìn)程分配給該應(yīng)用,這個啟動方式就是冷啟動。冷啟動因?yàn)橄到y(tǒng)會重新創(chuàng)建一個新的進(jìn)程分配給它,所以會先創(chuàng)建和初始化 Application 類,再創(chuàng)建和初始化 MainActivity 類,最后顯示在界面上。
熱啟動:當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進(jìn)程(例:按back鍵、home鍵,應(yīng)用雖然會退出,但是該應(yīng)用的進(jìn)程是依然會保留在后臺,可進(jìn)入任務(wù)列表查看),所以在已有進(jìn)程的情況下,這種啟動會從已有的進(jìn)程中來啟動應(yīng)用,這個方式叫熱啟動。熱啟動因?yàn)闀囊延械倪M(jìn)程中來啟動,所以熱啟動就不會走 Application 這步了,而是直接走 MainActivity,所以熱啟動的過程不必創(chuàng)建和初始化 Application,因?yàn)橐粋€應(yīng)用從新進(jìn)程的創(chuàng)建到進(jìn)程的銷毀,Application 只會初始化一次。
首次啟動:首次啟動嚴(yán)格來說也是冷啟動,之所以把首次啟動單獨(dú)列出來,一般來說,首次啟動時間會比非首次啟動要久,首次啟動會做一些系統(tǒng)初始化工作,如緩存目錄的生產(chǎn),數(shù)據(jù)庫的建立,SharedPreference的初始化,如果存在多 dex 和插件的情況下,首次啟動會有一些特殊需要處理的邏輯,而且對啟動速度有很大的影響,所以首次啟動的速度非常重要,畢竟影響用戶對 App 的第一映像。
查看啟動時間
-
log日志里,正則過濾出Displayed,需要在NoFilters下
image.png 命令行直接啟動
adb shell am start -W lilun.com.pensionlife/.ui.welcome.SplashActivity
//adb shell dumpsys activity activities 獲取當(dāng)前界面的activity名

上圖中注意三個時間ThisTime、 TotalTime、 WaitTime,該次為冷啟動,熱啟動只有60+ms;
簡單地說
● ThisTime: 最后一個啟動的Activity的啟動耗時
● TotalTime: 自己的所有Activity的啟動耗時
● WaitTime: ActivityManagerService啟動App的Activity時的總時間(包括當(dāng)前Activity的onPause()和自己Activity的啟動)
可以從源碼里frameworks\base\cmds\am\src\com\android\commands\am\Am.java文件中查看到上面時間的計算方法;
啟動優(yōu)化
啟動優(yōu)化主要是指冷啟動的優(yōu)化,冷啟動原理有時間再分析;通常在從Launcher界面點(diǎn)擊App圖標(biāo)到顯示黑白屏之前的這段時間是不可優(yōu)化的。
通過一些小技巧來對冷啟動時間進(jìn)行優(yōu)化,從而讓你app加載變得”快“一些(視覺體驗(yàn)上的快)。
比如啟動黑白屏的問題;
再比如在Application的onCreate里面進(jìn)行過多的初始化;
出現(xiàn)黑白屏的原因及解決方法
http://www.cnblogs.com/sunzn/p/3407078.htmlApplication的onCreate里面進(jìn)行過多的初始化
通過以下幾個方面:延遲初始化、后臺任務(wù)、界面預(yù)加載,減少應(yīng)用啟動時的耗時;
下面onCreate里分析各個初始化函數(shù)的耗時,通過trace文件;
File file = new File(Environment.getExternalStorageDirectory(), "app");
Log.i("App", file.getAbsolutePath());
Debug.startMethodTracing(file.getAbsolutePath());
... //此處即為初始化代碼
Debug.stopMethodTracing();
當(dāng)上段文件運(yùn)行之后,會在getAbsolutePath()目錄下生成app.trace文件。
通過adb pull 命令將其取出至電腦中

將此文件拖入Android Stdio中,從中查看比較耗時的操作,看能否優(yōu)化。

