启动性能优化总结
需求背景
随着业务增多,引入很多SDK或一些业务模块,导致启动性能急速下降,用户体验感下降,数据指标越来越难看。
衡量启动时间
-
线上统计
attachBaseContext 首页的 onWindowsFocusChanged 方法 上报打点 -
线下打点:
-
adb 脚本 自动化 统计
adb shell am start -S -W -R 6 [启动的targetMainActivity]
WaitTime 返回从 startActivity 到应用第一帧完全显示这段时间. 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;
ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时;
TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause的耗时。
找到耗时方法
分析耗时 线下method trace 按照耗时进行排序, 问题在于 method trace 拖慢程序运行,JVM 需要增加 额外的开销,获得的时间不是真正执行的时间,只能获得一个相对耗时排行;
优化启动耗时
分析启动耗时 推动 三方SDK 优化,IM SDK ,直播SDK 延迟初始化等;
设计启动器 解决循环依赖问题
SDK之间的项目依赖 通过 LauncherStarter 启动器框架来解决;
- 抽象出来task 定义初始化SDK 依赖关系;
- 抽象 有向无环图 并检查是否合法;
- 任务调度器 取入度为0的任务交给执行器去执行;