启动时间测量方式

启动时间测量方式

获取启动时间的方式

方式一:adb 命令

adb shell am start -W packagename/首屏Activity

  • ThisTime:最后一个Activity启动耗时
  • TotalTime:所有Activity启动耗时
  • WaitTime:AMS启动Activity的总耗时

特点:

  • 线下使用方便,不能带到线上
  • 非严谨、精确时间
方式二:实验室监控:视频录制

通过高速摄像头录制app启动过程,然后计算启动消耗帧率

有条件的还可以使用图像识别技术实现自动化

方式三:手动打点

启动时埋点,启动结束买点,二者差值

1
2
3
4
5
6
7
8
9
10
11
// 手动打点记录相关类
public class LaunchTimer {
private static long sTime;
public static void startRecord() {
sTime = System.currentTimeMillis();
}
public static void endRecord() {
long cost = System.currentTimeMillis() - sTime;
Log.w("LaunchTimer","cost: " + cost);
}
}

开始打点:ApplicationattachBaseContext方法里打点,这里是app所能收到的最早回调时间

1
2
3
4
5
6
// Application
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
LaunchTimer.startRecord();
}

结束打点:

  • 误区:在onWindowFocusChanged里打点,这里只是首帧时间,用户未必可以交互
  • 正解:在界面的真实数据展示里的UI进行打点,如列表的第一条数据、可交互控件的显示等

要在必要的可交互View中进行结束打点,如下操作

1
2
3
4
5
6
7
view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
view.getViewTreeObserver().removeOnDrawListener(this);
LaunchTimer.endRecord();
}
});

特点:

  • 精确,可带到线上,并能将记录到的时间上传至后台,推荐使用

启动类型监控

  • 首次安装启动(由于有 dex优化的过程,首次安装刚开始可能内存和代码执行效率不是很高)
  • 覆盖安装启动(由于有 dex优化的过程,覆盖安装刚开始可能内存和代码执行效率不是很高)
  • 冷启动(指标)
  • 热启动(可以反映程序的保活能力)

扩展:

  1. 启动结束时机

    是否时以用户真正可以操作的时间作为启动结束的时间

  2. 启动时间扣除逻辑

    闪屏、广告和引导页消耗的时间应该从启动时间里扣除

  3. 启动排除逻辑

    对于 BroadcastServer 拉起进程,但是没有启动 Activity 需要排除统计