启动流程:
- 点击app - 启动app
- 加载空白window
- 创建进程
- 创建application
- 启动主线程(ActivityThread)
- 创建Activity
- 加载布局
- 布置屏幕
- 首帧绘制
优化方案
其中1-3,5,6,为系统行为,一般情况下我们无法干预
针对4可以采用如下策略:
1. 延迟初始化和异步初始化
- 必须在主线程
- 可以延迟
- 建议使用idleHandler,在主线程空闲时间进行初始化
- 不可以延迟
- 直接初始化
- 可以延迟
- 可以在子线程
- 子线程不可延迟初始化的(其实几乎没有。既然可以放到子线程,大多时候是可以延迟初始化的)
- 子线程可延迟初始化的
2. 部分项目中可能存在项目初始化依赖关系,比如a依赖于b,需要b先初始化,再初始化a。可以使用如下第三方
依赖关系
- JetPack App Startup(可以合并ContentProvider,并指定一定的顺序)
- 阿里的alpha(代码比较老)
- AnchorTask
3. 其他优化
- 减少io操作
- 减少线程操作
- 避免创建大对象,减少gc
- ...
针对过程7-9,我们可以做布局优化,绘制优化
比如:
- 减少嵌套层数。
- 动态创建View,不使用xml来加载ui
- 减少测量,比如写死固定高度等
- ...