简单的说就是 App Startup 提供了一个 ContentProvider 来运行所有依赖项的初始化,避免每个第三方库单独使用 ContentProvider 进行初始化,从而提高了应用的程序的启动速度。
无论是 Google 提供的库还是第三方库,启动时运行一些初始化逻辑并不少见,例如 WorkManager 在应用启动时使用 ContentProvider 进行初始化,来看一下 Google 工程师 Husayn Hakeem 分享的一张的图。
上图表示现在我们有三个库分别 LibraryA、LibraryB、和 LibraryC 它们使用自己的 ContentProviders 进行初始化。
而 App Startup 提供了一个 ContentProvider 来运行所有依赖项的初始化(LibraryA、LibraryB、和 LibraryC),如下图所示。
AndroidX App Startup 为我们解决了什么问题?
刚才我们说到无论是 Google 提供的库还是第三方库,App 启动运行时会初始化一些逻辑,它们为了方便开发者使用,避免开发者手动调用,使用 ContentProvider 进行初始化,例如 WorkManager 在应用启动时使用 ContentProvider 进行初始化,我们来看一下 WorkManager 的源码,先来看一下 AndroidManifest.xml 文件内容。
如上所见,我们可以看到在 AndroidManifest.xml 文件内定义了一个名为 WorkManagerInitializer 的 ContentProvider,我来看看 WorkManagerInitializer 里面都做了什么。
public class WorkManagerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
// Initialize WorkManager with the default configuration.
WorkManager.initialize(getContext(), new Configuration.Builder().build());
return true;
}
…
// 省略了没用的代码
}
如上所见其实就是在 WorkManagerInitializer 的 onCreate() 方法里面,使用默认配置初始化 WorkManager。
我们也来模仿 WorkManager 写一个 Demo,这里只贴出部分代码,更多信息查看 GitHub 上的 AppStartupSimple 下面的 ContentProvider 模块。
- 定义一个 WorkContentProvider 并在 onCreate 方法中打印一行日志。
class WorkContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
Log.d(TAG, “WorkContentProvider create()”)
return true
}
…
}
- 在 AndroidManifest.xml 文件中注册 WorkContentProvider。
- 运行 App 日志如下所示。
com.hi.dhl.startup.simple D/WorkContentProvider: WorkContentProvider create()
假设你的 App 有很多类似于 WorkManager 这样的库,都在 ContentProvider 里面进行一些初始化工作,在 App 启动时运行多个 ContentProvider,这样会带来一些问题:
- 多个 ContentProvider 会增加了 App 启动运行的时间。
- ContentProvider 的 onCreate 方法会先于 Application 的 OnCreate 方法执行,这是在冷启动阶段自动运行初始化的,来看一下 Android 10 系统源码。
private void handleBindApplication(AppBindData data) {
…
if (!data.restrictedBackupMode) {
if (!ArrayUtils.isEmpty(data.providers)) {
// 创建ContentProvider
installContentProviders(app, data.providers);
}
}
…
try {
// 调用调用 Application 的 OnCreate 方法
mInstrumentation.callApplicationOnCreate(app);
} catch (Exception e) {
…
}
…
}
这是在 App 冷启动时自动运行初始化的,这样只会增加 App 的加载时间,用户希望 App 加载得快,启动慢会带来糟糕的用户体验,AndroidX App Startup 正是为了解决这个问题而出现的。
如何正确使用 AndroidX App Startup?
使用 AndroidX App Startup 来运行所有依赖项的初始化有两种方式:
- 自动初始化。
- 手动初始化(也是延迟初始化)。
具体可以查看 GitHub 上的 AppStartupSimple 下面的 Startup-Library 模块相关代码。
自动初始化
- 在 build.gradle 文件内添加依赖。
implementation “androidx.startup:startup-runtime:1.0.0-alpha01”
- 实现 Initializer 接口,并重写两个方法,来初始化组件。
class LibaryC : Initializer<LibaryC.Dependency> {
override fun create(context: Context): Dependency {
// 初始化工作
Log.e(TAG, "init LibaryC ")
return Dependency()
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> {
return mutableListOf(LibaryB::class.java)
}
…
}
- create(Context): 这里进行组件初始化工作。
- dependencies(): 返回需要初始化的列表,同时设置 App 启动时依赖库运行的顺序,假设
LibaryC 依赖于 LibaryB,LibaryB 依赖于 LibaryA,App 启动运行时,会先运行 LibaryA 然后运行 LibaryB 最后运行 LibaryC。
正如 GitHub 上的 AppStartupSimple 示例项目,它依赖结构就是 LibaryC 依赖于 LibaryB,LibaryB 依赖于 LibaryA,输出结果如下所示:
com.hi.dhl.startup.simple E/LibaryA: init LibaryA
com.hi.dhl.startup.simple E/LibaryB: init LibaryB
com.hi.dhl.startup.simple E/LibaryC: init LibaryC
- 在 AndroidManifest.xml 文件中注册 InitializationProvider。
App 启动的时 App Startup 会读取 AndroidManifest.xml 文件里面的 InitializationProvider 下面的 <meta-data>
声明要初始化的组件,完成自动初始化工作。
手动初始化(也是延迟初始化)
- 在 build.gradle 文件内添加依赖,和上文一样。
- 创建一个类 LibaryD 实现 Initializer 接口,并重写两个方法,来初始化组件,和上文一样。
- 在 AndroidManifest.xml 文件中注册 InitializationProvider。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/552361b38c36a278264d48e29297c7ab.jpeg)
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
11861961588)]
[外链图片转存中…(img-2ZtG7ZGi-1711861961588)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。