介绍
App Startup是一个可以用于加速App启动速度的一个库。
出现的原因
以前初始化第三方库会在Application的onCreate中。
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
LitePal.initialize(this)
AAA.initialize(this)
BBB.initialize(this)
CCC.initialize(this)
DDD.initialize(this)
EEE.initialize(this)
}
}
现在越来越多的库在ontentProvider来初始化。
class MyProvider : ContentProvider() {
override fun onCreate(): Boolean {
context?.let {
LitePal.initialize(it)
}
return true
}
}
这样写逻辑不会有什么问题。
但是ContentProvider越来越多,启动就慢了。
关于ContentProvider的耗时,Google官方也有给出一个测试结果:
原理
把这些库放置到一个ContentProvider。
- 以前:
- 现在:
使用
- 引入App Startup。
dependencies {
implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}
- 定义一个用于执行初始化的Initializer,并实现App Startup库的Initializer接口。
class LitePalInitializer : Initializer<Unit> {
override fun create(context: Context) {
LitePal.initialize(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
(1)依赖其他Initializer
return listOf(OtherInitializer::class.java)
(2)不依赖其他Initializer
return emptyList()
}
}
Initializer接口要求重现两个方法。
-
在create()方法中,我们去进行之前要进行的初始化操作就可以了,create()方法会把我们需要的Context参数传递进来。
-
dependencies()方法表示,当前的LitePalInitializer是否还依赖于其他的Initializer,如果有的话,就在这里进行配置,App Startup会保证先初始化依赖的Initializer,然后才会初始化当前的LitePalInitializer。不依赖的话,直接返回emptyList()。
- 将它配置到AndroidManifest.xml当中。
<application ...>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.LitePalInitializer"
android:value="androidx.startup" />
</provider>
</application>
这里的配置是有比较严格的格式要求的
meta-data中的android:name部分我们需要指定成我们自定义的Initializer的全路径类名,其他部分都是不能修改的
,否则App Startup库可能会无法正常工作。
使用小结:
- 引入App Startup的库。
- 自定义一个用于初始化的Initializer。
- 将自定义Initializer配置到AndroidManifest.xml当中。
延迟初始化
<application ...>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.LitePalInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
</application>
区别仅仅在于,这里在LitePalInitializer的meta-data当中加入了一个tools:node="remove"的标记。
这个标记用于告诉manifest merger tool,在最后打包成APK时,将所有android:name是com.example.LitePalInitializer的meta-data节点全部删除。
等需要初始化的时候,调用这个方法。
AppInitializer.getInstance(this)
.initializeComponent(LitePalInitializer::class.java)
总结:
-
原理就是将多个ContentProvider压缩成一个。
-
这个组件是给库的开发者使用的。
网友评论