安卓启动速度优化

180 阅读2分钟

如何统计启动时间

  • 冷启动时间:冷启动表示用户首次打开应用,这时进程还没创建,包含了Application创建的过程。冷启动时间指从第一次用户点击Launcher中的应用图标开始,到首页内容全部展示出来的时间。

  • 热启动时间:热启动表示用户在首页按了返回,首页Activity已经Destroy,不过Application仍在内存中存在,对应的进程并没有被杀掉,不包含Application创建过程。热启动时间指在Application仍然存在的情况下,从用户点击桌面图标,到首页内容全部展示出来的时间

本地测试

命令行
adb shell am start -S -W com.example.myapplication/com.example.myapplication.MainActivity
Systrace

应用内的代码需要手动埋点:Trace.traceBegin、Trace.traceEnd

Profiler

// TODO

打点测试

  • 冷启动起始点:attachBaseContext
  • 热启动起始点:MainActivity.onCreate
  • 结束点:MainActivity.onWindowFocusChanged

数据校准

  • 冷启动上报参数:区分有广告页、无广告页场景
  • 冷启动时间校准:在广告页onPause方法中清除计时TimeUtils.clearStartTimeCalculate();
  • 检查所有有可能引起Application创建,但是不是正常启动流程的地方,调用TimeUtils.clearStartTimeCalculate();清除计时

性能优化的四个部分

度量、分析、优化、防裂化(线下统计、自动化工具)

优化六板斧

不执⾏、懒加载、延迟、异步、预加载、减负

不执行
  • Debug 包登陆 SSO 验证,判断条件可以移到外⾯,避免⽆效的类初始化(不执⾏)
  • 频繁的⽅法调⽤:initDeviceId、ALog.d
  • 极光推送
懒加载

非主线功能(小游戏、语音助手)

不执行、懒加载
  • 策略精准智能优化
    • 如何定义中低端机型
      • OS版本、CPU、GPU、运⾏内存、机身存储、视频编解码效率
    • 取消视频卡⽚⾃动播放逻辑(不执行)
    • 取消⼴告展示(不执行)
    • 取消WebView预加载(懒加载)
异步
  • 主线程需要等待⼦线程初始化任务的完成
  • 初始化任务越早执行越好
  • 初始化任务越少越好
预加载
  • 减少渲染时间,避免 createViewHolder
    • 缓存卡⽚内容提前到 Application 阶段开始解析
    • ⼦线程 new RecycledViewPool,根据上次⾸屏的卡⽚ Type 创建对应的 ViewHolder
减负
  • 闪屏⻚、⾸⻚合并,减少跳转时间
防裂化
  • MR阶段防裂化,重点⽂件监控,卡合码流程
  • 自动化测试

指标

50分位:2.4 -> 1.4 95分位:12 -> 5