Part 2 App启动优化
一 App启动优化介绍
1、背景
用户的第一体验,八秒定律(70%用户放弃等待)
2、启动分类
App startup time官方教程(https://developer.android.google.cn/topic/performance/vitals/launch-time )
冷启动
耗时最多,衡量标准
ClickEvent(用户点击) -> IPC(触发ipc) -> Process.start(进程的创建) -> ActivityThread(单独进程app的入口类似main) -> bindApplication(通过反射创建Application) -> LifeCycle(我们的activity) -> ViewRootImpl(界面的绘制)
热启动
最快
后台 -> 前台
温启动
较快
LifeCycle(只重走activity的生命周期)
3、相关任务
冷启动之前
启动app、加载空白window、创建进程(这三个都是系统行为,无法多做干涉)
随后任务
创建Application、创建主线程、创建MainActivity、加载布局、布置屏幕、首帧绘制
4、优化方向
Application和Activity的生命周期(我们开发者能控制的)
二 启动时间测量方式
1、adb命令方式
adb shell am start -W packagename/首屏Activity
ThisTime:最后一个Activity的启动耗时
TotalTime:所有Activity的启动耗时
WaitTime:AMS启动Activity的总耗时
特点:线下使用方便,不能带到线上、非严谨精确时间
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.i(msg + "cost " + cost);
}
}
启动位置放置在Application的attachBaseContext中,结束位置放置在MainActivity中
特点:精确,可带到线上,推荐使用
误区:onWindowFocusChange只是首帧时间
正解:真实数据展示,Feed第一条数据展示
三 启动优化工具选择
1、traceview
图形形式展示执行时间、调用栈等,信息全面,包含所有线程
使用方式
第一种: