倘若不进行任务分类初始化,则首帧显示前需要完成所有任务的初始化
分类之后,对原来 Task 进行依赖排列如下
![](https://upload-
images.jianshu.io/upload_images/22459598-917448f3431065e1?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
降低初始化阻塞时间收益如下
然而在实际场景中,拆分出来的三个方法中的任务可能存在依赖关系导致情况变得复杂:
-
onCreateBlock() 只能依赖 onCreateAsync() 内任务m依赖 onCreateSync() 会导致死锁;
-
onCreateSync() 可依赖其他两个方法内的任务;
-
onCreateAsync() 可依赖其他两个方法内的任务,同时可尽可能支持多条子线程任务来加快缩短所有异步任务的完成时间,这取决于当前设备的 CPU 状态
如果按照上述的逻辑来重新梳理启动任务的初始化,则需要实现一下逻辑:
-
封装 Task 支持上述三种场景的运行
-
提供线程池以运行异步任务,Handler#Post 运行同步非阻塞任务
-
以 Task 为图节点,构建一张应用依赖启动图并从头部开始初始化
-
Task 运行状态支持拦截提供外部业务逻辑获取状态,打断初始化等
-
多条异步子链运行时尽可能保持同时并发
-
…
希望完成上述功能,优先考虑现有轮子。于是在 github找到了 alpha 。
https://github.com/alibaba/alpha
alpha 是一个阿里巴巴开源的,基于PERT图构建的Android异步启动框架,协助应用启动时正确执行依赖任务。
集成了之后发现满足不了项目的应用场景,当时并没有很好的解决方法,迫于项目需求当晚就 clone 下了源码研究了实现,略感失落,但也找到了优化的方向。
alpha 的缺陷
1. 启动节点粒度不够细
alpha 封装了 Task 类用于表示一个异步任务, 衍生出Proj