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 及国内外大厂面试题解:在线阅读
-
LeetCode 系列题解:在线阅读
-
最新 Android 10 源码分析系列文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,仓库持续更新,欢迎前去查看 Android10-Source-Analysis
-
整理和翻译一系列精选国外的技术文章,每篇文章都会有译者思考部分,对原文的更加深入的解读,仓库持续更新,欢迎前去查看 Technical-Article-Translation
-
「为互联网人而设计,国内国外名站导航」涵括新闻、体育、生活、娱乐、设计、产品、运营、前端开发、Android 开发等等网址,欢迎前去查看 为互联网人而设计导航网站
历史文章
- 为数不多的人知道的 Kotlin 技巧以及 原理解析(一)
- 为数不多的人知道的 Kotlin 技巧以及 原理解析(二)
- 为数不多的人知道的 AndroidStudio 快捷键(一)
- 为数不多的人知道的 AndroidStudio 快捷键(二)
- 再见吧 buildSrc, 拥抱 Composing builds 提升 Android 编译速度
- Jetpack 最新成员 AndroidX App Startup 实践以及原理分析
- Jetpack 成员 Paging3 实践以及源码分析(一)
- Jetpack 新成员 Paging3 网络实践及原理分析(二)
- Jetpack 新成员 Hilt 实践(一)启程过坑记
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/53c4f722af5d06e05c24cc55090461b6.jpeg)
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
(img-itMXr9Nq-1712281968338)]
[外链图片转存中…(img-4M8qeqB5-1712281968338)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。