启动时间的测量方式

497 阅读1分钟

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