面试系列——App启动性能优化总结

Posted BridgeGeorge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试系列——App启动性能优化总结相关的知识,希望对你有一定的参考价值。

启动性能优化总结

需求背景

随着业务增多,引入很多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 启动器框架来解决;

  1. 抽象出来task 定义初始化SDK 依赖关系;
  2. 抽象 有向无环图 并检查是否合法;
  3. 任务调度器 取入度为0的任务交给执行器去执行;
  4. 每当一个任务执行完毕,则触发 有向无环图 移除当前任务结点,并尝试寻找下一个 入度为0的结点;
  5. 所有任务执行完毕,结束。

关键模块

  • StartTask
    • 依赖关系 class 对象
    • 运行在主线程还是工作线程
    • 启动器 是否必须等待此任务执行关闭才能返回。
  • TaskGraph
    有向无环图 的定义;
    广度优先遍历BFS 累计出队次数,如果小于结点个数N则 证明 存在环;
  • 主线程阻塞等待
    • 主线程的loop阻塞 等待调度器加入可运行的主线程任务;
    • 执行完毕以后 等待 是否还有needWait任务 需wait 等待;

优化启动收益

启动器模块修改 强制review 代码修改谨慎 ,保证收益;

结果

收益明显,启动时间平均提升35%以上。

以上是关于面试系列——App启动性能优化总结的主要内容,如果未能解决你的问题,请参考以下文章

Android 性能优化 05---App启动优化

Android性能优化系列之App启动优化

Android 面试官: “你做过那些性能优化?“

Android面试-Android性能优化和内存优化APP启动速度一线大厂的实战案例解析

移动端性能优化系列—启动速度

App瘦身性能优化总结