0%

启动框架设计和优化

对于大型App来说,启动任务多,任务依赖复杂,如何使用启动框架来合理的编排任务,提高线程运行效率是重点关注的问题。

1 任务依赖

目前我们开发的App启动阶段需要做的事情很多,启动各步骤之间存在先后依赖关系,最初启动框架1.0 的时候,为了提升性能,简单的采用多线程并发执行的,总体逻辑比较复杂,不容易维护。所以我们决定启动框架2.0采用有向无环图(DGA)的方式实现和管理任务。

启动依赖图

解决任务依赖关系有类似的框架,(官方Startup和Alpha等),为什么我们需要自研一套?

  • Startup现阶段依赖关系只能支持主线程。
  • Alpha对于复杂场景线程切换支持不够完美。

2 复杂场景

2.1 限定D任务必须在主线程阻塞执行的时候当如何设计?。

高效率执行方式:A B C 同时异步执行 执行完成后再执行D。

但当真正实现的时候发现ABC异步执行,再通过main handler 把D任务通知到主线程执行,你会发现app create 主线程根本没办法阻塞,直接执行结束。(Alpha的设计就是如此)

任务依赖

不理解的可以看下面的图

执行顺序

2.2 实现

出现上述场景后我们考虑通过添加锁等待的方式来实现执行阻塞。

  • 将启动框架所有任务放在子线程中执行
  • 每个启动任务增加属性,是否需要阻塞主线程等待。
  • 在App start创建的时候遍历所有启动任务,统计需要阻塞任务的个数,并创建CountDownLatch
  • 需要阻塞的任务在执行完成的时候会触发waitCountDownLatch.countDown()
  • 启动框架start的时候触发waitCountDownLatch.await等待。

整体的设计比较轻量、整个框架一共5个类。