欢迎光临
专注android技术,聚焦行业精粹,我们一直在努力

app初始化流程思路

背景:一个app启动时需要初始化参数,组件等一些操作,为app正常运行,以及响应用户的特定请求做准备。可是如果一个app响应时间过长的差体验可能会导致用户的流失。

我们app初始化过程通常的问题包括:

 

需要关注的问题:

  1. 无分类:任务添加随意,随着app版本不断迭代,后续添加的任务会不知道放在哪里,导致初始化流程逻辑里面方法膨胀。
  2. 无分级:也就是任务之间的依赖先后顺序。任务之间是相互依赖的,例如网络模块初始化依赖参数初始化,那么这两个任务需要放在不同的级别中。同一级别的任务很多是可以并行的,例如:网络模块和数据库模块之间不相互依赖,可以并行,那么它们可以放在一个级别中。这样的好处是后续添加新的任务可以按照依赖关系放在正确的级别。错误的级别会影响该级别的整体运行耗时。
  3. 主路径:这一点非常重要,主路径应该具有阻塞的特点,主路径没有初始化完成是不能进入app主页面的(不能让用户直接操作的)。很多在初始化期间运行的任务不属于主路径,例如:app检查更新任务,没有这个任务用户也可以进入app,只是用户在app操作一段时间后弹出提示更新app,这样的交互对于用户而言是合理的。把这样的任务放在非主路径,可以加快app的初始化过程。
  4. 无优先级别:主路径需要快速初始化完,需要给予足够的CPU和IO资源,因此非主路径的任务建议使用低优先级的线程来处理,不要和主路径的任务抢资源,保证初始化主路径耗时稳定且快速

 

其它因素:

  1. 进程处理:很多app会包含前后台进程,所以任务初始化也需要考虑在哪个进程初始化。处理不好会导致一个组件在前后台两个进程都初始化了,但只在某个进程使用。
  2. 任务监控:初始化是一个app的入口,它会随着版本的迭代而持续改变,所以初始化需要持续的监控。包括日志输出和打点统计。app快速迭代过程中越来越多的组件加到初始化流程中,需要监控主路径和每个任务的初始化耗时。及时发现不合理的任务对初始化主路径的影响。

 

实现思路:

一个好的初始化流程有以下几个特点:

  1. 方便的添加一个初始化任务:设置任务的名称(方便日志输出,打点收集);所属的进程;执行的优先级别(可以合理的分配线程池资源和IO资源);该任务是否可以并行或者顺序执行
  2. 方便的定义多个初始化flow:初始化过程会包含多个flow, 一个初始化flow会包含多个任务,每个flow可以认为是初始化过程中的一个级别(阶段)划分。
  3. 可以外部定制线程池,日志工具:线程池和日志工具属于APP的基本组件,如果你要做一个初始化组件建议不要自己重复造轮子,可以提供接口让外部实现并注入进来。
  4. 主路径设置和回调:初始化过程中会做很多事情,但只有关键路径中的任务都成功了就可以判定为初始化成功,其它的任务不影响初始化结果。

 

初始化flow和task之间的关系

flow: 表示一个流程,它由一系列的任务(task)组成,一个flow里面所有任务(包括顺序执行和并行执行的任务)都执行完才会回调该flow执行完成

task: 表示一个具体的任务执行单元,里面可以自己添加各自的初始化业务逻辑

一个标准的初始化流程是flow之间是顺序依赖的,每个flow里面包含一个队列和一个线程池用于处理顺序和并行的task。以下图描述了flow和task的关系:

 

赞(0) 打赏
未经允许不得转载:花花鞋 » app初始化流程思路
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

国内精品Android技术社区

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏