adb命令
adb shell am start -W packagename/首屏Activity
$ adb shell am start -W com.dianping.v1/com.dianping.main.guide.SplashScreenActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.dianping.v1/com.dianping.main.guide.SplashScreenActivity }
Status: ok
Activity: com.dianping.v1/com.dianping.main.guide.SplashScreenActivity
ThisTime: 2469
TotalTime: 2469
WaitTime: 2487
Complete
ThisTime:最后一个Activity启动耗时
TotalTime:所有Activity启动耗时
WaitTime:AMS启动Activity的总耗时
adb命令优缺点:
线下使用方便,不能带到线上
非严谨、精确时间
手动打点
启动时埋点,启动结束埋点,二者差值
注意点:
误区:onWindowFocusChanged只是首帧时间
正解:真实数据展示,比如列表第一条展示
案例:
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.i(msg + "cost " + cost);
}
}
在Application的attachBaseContext进行启动时埋点
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
LaunchTimer.startRecord();
}
在界面数据显示时进行启动结束埋点
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
if (position == 0 && !mHasRecorded) {
mHasRecorded = true;
holder.layout.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
holder.layout.getViewTreeObserver().removeOnPreDrawListener(this);
LaunchTimer.endRecord("FeedShow");
return true;
}
});
}
...
}
总结:
精确,可带到线上,推荐使用
避开误区,采用界面数据显示出来作为启动结束
addOnDrawListener要求API16