「这是我参与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的初始化,部分资源的加载
- 资源拆分,大的资源分拆成小资源加载
- 代码逻辑简化,移除无用逻辑,或延迟到页面之后处理
- 插件化,非核心插件延迟初始化