1、概念:
冷啟動:當啟動應用時,后台沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啟動方式就是冷啟動。
熱啟動:當啟動應用時,后台已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在后台,可進入任務列表查看),所以在已有進 程的情況下,這種啟動會從已有的進程中來啟動應用,這個方式叫熱啟動。
首次啟動:首次啟動嚴格來說也是冷啟動,之所以把首次啟動單獨列出來,一般來說,首次啟動時間會比非首次啟動要久,首次啟動會做一些系統初始化工作,如緩存目錄的生 產,數據庫的建立,SharedPreference的初始化,如果存在多 dex 和插件的情況下,首次啟動會有一些特殊需要處理的邏輯,而且對啟動速度有很大的影響,所以 首 次啟動的速度非常重要,畢竟影響用戶對 App 的第一映像。
2、am start -W packagename/activity 命令 (W大寫)
WaitTime:包括前一個應用 Activity pause 的時間和新應用啟動的時間,稍微大點。
TotalTime: 表示新應用啟動的耗時,包括新進程的啟動和 Activity 的啟動,但不包括前一個應用Activity pause的耗時(真正的啟動耗時)
ThisTime: 表示一連串啟動 Activity 的最后一個 Activity 的啟動耗時
===========================================================================================
測試方法:adb shell am start -W packagename/MainActivity
命令,計算啟動時間
--------------------------------------------------------------------------------------------------------------------------
示例:
adb shell am start -W com.android.calculator2/com.android.calculator2.Calculator
ThisTime:最后一個Activity啟動耗時
TotalTime:所有Activity啟動耗時
WaitTime:AMS啟動Activity的總耗時
總結:線下使用方便,不能帶到線上
不嚴謹、非精確地時間
===========================================================================
關於ThisTime/TotalTime/WaitTime的區別,下面是其解釋。WaitTime=endTime-startTime
-
startTime記錄的剛准備調用startActivityAndWait()的時間點
-
endTime記錄的是startActivityAndWait()函數調用返回的時間點
-
WaitTime = startActivityAndWait()調用耗時。
WaitTime 就是總的耗時,包括前一個應用Activity pause 的時間和新應用啟動的時間;
ThisTime 表示一連串啟動Activity 的最后一個 Activity 的啟動耗時;
TotalTime表示新應用啟動的耗時,包括新進程的啟動和 Activity 的啟動,但不包括前一個應用Activity pause 的耗時。
也就是說,開發者一般只要關心 TotalTime 即可,這個時間才是自己應用真正啟動的耗時。
總結一下,如果只關心某個應用自身啟動耗時,參考TotalTime;
如果關心系統啟動應用耗時,參考WaitTime;
如果關心應用有界面Activity啟動耗時,參考ThisTime。
=========================================================================================
1.2、手動打點
啟動時埋點,啟動結束時埋點,二者差值
public class LaunchTimer {
private static long sTime;
public static void startRecord() {
sTime = System.currentTimeMillis();
}
public static void endRecord() {
endRecord("");
}
public static void endRecord(String msg) {
long cost = System.currentTimeMillis() - sTime;
LogUtils.e(msg + " cost " + cost + "ms");
}
}
總結:精確,可帶到線上,推薦使用
避開誤區,采用Feed第一條展示
誤區:onWindowFocusChanged只是activity的首幀繪制時間,APP啟動的結束時間記在這里是不准確的。我們所要的時間,是用戶真正看到整個界面的時間。
正解:真實數據展示,Feed第一條展示(即adapter中的第一條數據)