前言
App Startup 是一个可以用于加速 App 启动速度的一个库。
平时开发中,大部分的第三方都需要在 Application 中进行初始化,但是有些库则会借助 ContentProvider 来初始化,以便使自己的库引入成本更低,代码侵入性更低,使用更加简便。
但是,一旦项目引入了使用 ContentProvider 进行初始化的库越来越多,那么应用的启动速度将会越来越慢,因为每个 ContentProvider 的初始化都是比较耗时的操作。
而 App Startup,它可以将所有用于初始化的 ContentProvider 合并成一个,从而使 App 的启动速度变得更快。实际上,App Startup 内部也创建了一个 ContentProvider,并提供了一套用于初始化的标准。
如果你在设计一款第三方库,建议使用 App Startup 来初始化你的库,而非 ContentProvider。
基本使用
下面来介绍 App Startup 的使用。
步骤一:引入依赖
implementation "androidx.startup:startup-runtime:1.1.1"
步骤二:创建 Initializer 类
class MainInitializer : Initializer<Unit> {
override fun create(context: Context) {
// todo 执行库的初始化操作
}
/**
* 表示当前的 Initializer 是否还依赖于其他的 Initializer,如果有的话就在这里进行配置,
* App Startup 会保证先初始化依赖的 Initializer,然后才会初始化当前的 LitePalInitializer
*/
override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()
}
步骤三:在 AndroidManifest.xml 中声明
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.demoproject.app.MainInitializer"
android:value="androidx.startup" />
</provider>
其中,meta-data 中的 android:name 节点需要指定成我们自定义的 Initializer 的全路径类名,其他部分都是不能修改的,否则App Startup库可能会无法正常工作。
手动初始化
我们可以在 meta-data 中加入 tools:node="remove"
使对应的 Initializer 失效,例如:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
这样,WorkManagerInitializer 将不会执行 onCreate 方法,因此,如果我们想要执行 WorkManagerInitializer 的初始化,需要手动调用 WorkManager 的初始化方法。