启动优化思维方式

260 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

前言

本篇不说明具体的优化技巧,而是从思维层面来分析问题该如何展开和解决。 所有的优化都要解决三件事:

  • 1.事情发生的流程
  • 2.如何量化事件流程中的指标
  • 3.如何对于短板进行优化

启动优化套用上述公式,那需要解决三部分内容:

  • 1.app启动的流程
  • 2.app启动耗时如何分析,如何打印耗时
  • 3.耗时如何优化

app启动流程分析

Launcher应用发送startActivity给ams作为起点,ams从pms获取并校验启动信息,通过socket给zygote发起fork进程请求,构造ApplicationThread发起attachApplication执行Application.onCreate的生命周期,启动ActivityThread,反射生成Activity并执行Activity的生命周期函数,开启Loop处理后续的事件。

实际能够被我们干预的流程包括:

  • Application.onCreate
  • Splash.onCreate
  • Splash.onResume
  • MainActivity.onCreate
  • MainActivity.onResume

启动统计量化

整体耗时统计

分析问题由大到小,先定位最耗时的activity,一般有三种方式

  • log日志 搜索activityManager标签,找activity的display耗时输出。
  • 通过adb 启动activity -w 标记,打印thisTime , totalTime和waitTime.
  • 自定义log 打印activity的耗时

方法耗时

宏观分析之后,我们定位到了耗时的activity,然后要分析具体的耗时方式,可以通过系统提供的方法分析函数,生成trace文件

  • Debug.startMethodTracing
  • Debug.stopMethodTracing

或者通过第三方的统计sdk,具体使用都非常简单,不展开分析。

  • Hugo 通过注解的方式分析activity中用到的所有方法的耗时。

优化思路

视觉优化(视觉欺骗)

视觉优化往往能够较大程度的缓解启动等待焦虑,一般采用

  • 添加启动背景,
  • Loading动画等

逻辑优化

分析耗时方法中的短板

  • 异步线程处理oncreate中的流程,如一些sdk的初始化,部分资源的加载
  • 资源拆分,大的资源分拆成小资源加载
  • 代码逻辑简化,移除无用逻辑,或延迟到页面之后处理
  • 插件化,非核心插件延迟初始化