【Android】之 App Startup 的使用及浅析

前言

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 的初始化方法。

猜你喜欢

转载自blog.csdn.net/yang553566463/article/details/125261217