一,概述
InitializationProvider是Android官方提供的一种应用初始化方式。InitializationProvider通过provider机制,实现不同模块隔离初始化,避免多模块业务耦合到一个Application中初始化。并且提供了依赖项,对于依赖初始化管理更加便利。provider会在应用启动时install,早于Application#onCreate方法。相比于Application#onCreate,有如下优势:

二,原理
1,声明InitializationProvider

声明如上,系统在ActivityThread#handleBindApplication中,会install所有声明的provider,随后再回调Application#onCreate方法,如下

因此,Provider#onCreate比Application#onCreate早些许。本文不展开谈installContentProvider细节,只需知道上述流程决定了Provider作为应用初始化的基础。
2,声明Initializer
在xml声明Provider处,声明meta-data参数,即可声明Initializer。如下,可以写多个初始化组件,以解耦不同模块的初始化。

初始化组件需继承Initializer接口,实现create和dependencies方法,如下

create即初始化逻辑定义处,传入的context是应用Application。
dependencies定义其他依赖的初始化组件,也需实现Initalizer接口,依赖组件会优先初始化,形成一个依赖树。叶子节点最先初始化。
3,执行Initializer
初始化组件执行在InitializationProvider#onCreate中,如下

拿到applicationContext,通过AppInitializer初始化声明的Initializer组件,如下

通过ComponentName拿到InitializationProvider声明的meta-data数组,这里就拿到了所有的Initializer接口实现类声明。

以上逻辑就很清晰了,
1,拿到初始化value字段,这个字段由于过滤meta-data声明的数据,快速找到Initializer组件。
2,创建一个set存放Initializer的class容器
3,匹配androidx.startup
4,存放Initializer#Class
5,调用doInitialize实例化Initializer组件,
最后直接看doInitialize

1,如果组件已经初始化,直接在第5步返回,避免重复初始化。
2,找到依赖项,递归调用doInitialize方法
3,调用Initializer#create方法
4,添加至初始化记录容器
以上,即InitlizationProvider核心逻辑。