总结
- 某个库使用了ContentProvider来进行初始化,那这个库最好接入App Startup,这样可以让使用了这个库的APP降低启动耗时.一般做APP开发很少能用到App Startup,如果考虑到架构可以将原来Application中初始化的代码移动到App Startup中单独执行,这样可以让代码结构更好.
- 一些库设计者会使用ContentProvider来初始化库, 这样做就不用使用的时候去显示的调用初始化库方法了.
- 假如每个库都使用ContentProvider来初始化, ContentProvider是四大组件之一,用多了会非常耗时,这个时候可以使用App Startup来解决这个问题,这些库使用App Startup提供的初始化标准后,App Startup可以将所有用于初始化的ContentProvider合并成一个,从而使APP启动速度变得更快.
使用
- 添加依赖
dependencies {
implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}
- 初始化库代码
class AppInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 这里类似于Application.create()方法,可以在此处初始化库
Timber.plant(DebugTree())
AppHelper.init(context)
}
// 如果当前AppInitializer还依赖于其他的XXInitializer类,
// 那么就将该类加入集合中类似:mutableListOf(OtherInitializer::class.java),如果没有依赖就返回空
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}
- 配置AndroidManifest.xml文件
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.hi.dhl.pokemon.init.AppInitializer"
android:value="androidx.startup" />
</provider>
以上AndroidManifest的配置会导致APP启动时就对库自动进行初始化,如果不想自动初始化,可以稍微改下配置就行了.
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.hi.dhl.pokemon.init.AppInitializer"
android:value="remove" />
</provider>
android:value="remove"
这样子配置,打包的时候回将这个provider节点删除,APP启动的时候就不会自动初始化库了,然后可以选择手动初始化
AppInitializer.getInstance(this).initializeComponent(AppInitializer::class.java)
这个就是手动初始化的代码了.