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。
- 禁用单个组件的自动初始化,需要在
<meta-data>
标签内添加tools:node="remove"
清单合并工具会将它从清单文件中删除。 - 禁用所有组件初始化,需要在
provider
标签内添加tools:node="remove"
清单合并工具会将它从清单文件中删除。
…
- 在需要的地方进行初始化,调用以下代码进行初始化。
AppInitializer.getInstance(context).initializeComponent(MyInitializer::class.java)
如果组件初始化之后,再次调用 AppInitializer.initializeComponent() 方法不会再次初始化。
手动初始化(也是延迟初始化)是非常有用的,组件不需要在 App 启动时运行,只需要在需要它地方运行,可以减少 App 的启动时间,提高启动速度。
全文到这里就结束了,App Startup 和 ContentProvider 相关示例已经上传到 GitHub 上了
AndroidX-Jetpack-Practice:https://github.com/hi-dhl/AndroidX-Jetpack-Practice
正在建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,仓库持续更新中,可以前去查看:AndroidX-Jetpack-Practice
总结
这篇文章主要介绍了以下内容:
- ContentProvider 启动顺序源码分析。
- App Startup 是 Jetpack 的新成员,是为了解决因 App 启动时运行多个 ContentProvider 会增加 App 的启动时间的问题。
- 使用了一个 InitializationProvider 管理多个依赖项,消除了每个库单独使用 ContentProvider 成本,减少初始化时间。
- App Startup 允许你自定义组件初始化顺序。
- App Startup 可以自动初始化 AndroidManifest.xml 文件中 InitializationProvider 下面的
<meta-data>
声明要初始化的组件。 - App Startup 提供了一种延迟初始化组件的方法,减少 App 初始化时间。
在 AndroidManifest.xml 文件中声明 node="remove"
打包的时候会删除?这样做的目的是什么?
- 便于管理所有的初始化项
- 禁用组件自动初始化也将禁用该组件依赖项的自动初始化
- 确保合并工具从所有其他合并清单文件中删除
参考文献
结语
关注公众号:ByteCode,查看一系列 Android 系统源码、逆向分析、算法、译文、Kotlin、Jetpack 源码相关的文章,如果这篇文章对你有帮助,请帮我点个 star,感谢!!!,欢迎一起来学习,在技术的道路上一起前进。
最后推荐我一直在更新维护的项目和网站:
-
计划建立一个最全、最新的 AndroidX Jetpack 相关组件的实战项目 以及 相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看:AndroidX-Jetpack-Practice
-
LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解,语言 Java 和 kotlin,包含多种解法、解题思路、时间复杂度、空间复杂度分析
- 剑指 offer 及国内外大厂面试题解:在线阅读
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
资源分享
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算