启动类型
冷启动
click event -> IPC -> Process.start -> ActivityThread -> bindApplication -> LifeCycle -> ViewRootImpl
热启动
后台 -> 前台
温启动
Lifecycle
启动相关任务
- 启动App
- 加载空白window
- 创建进程
- 创建Application
- 启动主线程
- 创建MainActivity
- 加载布局
- 布置屏幕
- 首帧绘制
优化方向
Application和Activity生命周期
启动时间的测量
方式1:adb命令(适合本地使用)
adb shell am start -W packagename/首屏Activity(含有包名)
JamesdeMBP:~ zhanxuzhao$ adb shell am start -W com.example.demo_0227/com.example.demo_0227.SplashActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.demo_0227/.SplashActivity }
Status: ok
Activity: com.example.demo_0227/.MainActivity
ThisTime: 123
TotalTime: 285
WaitTime: 304
Complete
ThisTime:最后一个Activity启动耗时(如MainActivity,不会包含前面的SplashActivity)
TotalTime:所有Activity启动耗时
WaitTime:AMS启动Activity总耗时
ThisTime < TotalTime < WaitTime
方式二:手动打点(可以线上统计)
开始点:
Application#attachBaseContext()
结束点:
方案一:首帧开始绘制(不推荐)
onWindowFocusChanged
方案二:真实数据展示(第一条feed加载:onBindViewHolder)
onBindViewHolder
holder.linearLayout.getViewTreeOvserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPregraw(){
LaunchTimer.endRecord();
holder.linearLayout.getViewTreeObserver().removeOnPredrwaListener(this);
return true;}
}
性能检测工具
traceview
Debug.startMethodTracing("fileName"); // 方法开始
Debug.stopMethodTracing(); // 方法结束
生成文件路径:sdcard/android/data/packagename/files
image
特点:
可以统计方法调用关系、耗费时间。
缺点:
运行时开销严重,整体都会变慢。
systrace
结合 Android 内核数据, 生成 html 报告
TraceCompat.beginSection("section name");
TraceCompat.endSection();
特点
轻量级,开销小。
直观反映CPU利用率。