您现在的位置是:首页 >其他 >Jetpack StartUp网站首页其他

Jetpack StartUp

hswizy 2024-06-17 11:25:06
简介Jetpack StartUp

在翻看Android文档的时候看到jetpack有个StartUp组件,好奇就查了下它的用途

App的初始化

我们现在很多初始化sdk库的方式一般为:

class App: Application() {
    override fun onCreate(){
        ASDK.init()
        BSDK.init()
        CSDK.init(this)    
    }
}

还有一种初始化sdk的方式是放在ContentProvider中, privder初始化的时机早于Application的onCreate

Application 构造方法 –> Application.attachBaseContext –> ContentProvider
构造方法 –> ContentProvider.onCreate –> Application.onCreate –> Activity
构造方法 –> Activity attachBaseContext –> Activity.onCreate

所以在Provider中初始化也有一定的局限性,那就是不能强依赖application。
所以一些SDK在ContentProvider中进行了初始化,这种方式的优点就是:
与宿主项目解耦,开发者无需特殊配置,sdk自动初始化。
目前看到JetPack的一些SDK就是这样初始化的:

<provider android:authorities="com.hsw.forreview.androidx-startup" android:exported="false" android:name="androidx.startup.InitializationProvider">
    <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup"/>
    <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup"/>
    <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup"/>
</provider>

每个ContentProvider的初始化都是耗时的, 如果每个sdk或者module都这样使用的话,就会出现启动慢的情况。
这时如果把ContentProvider合并到一起的话,就不会出现这个问题了,所以StartUp就出现了。

StartUp的作用

文档对它的描述

App Startup 库提供了一种直接、高效的方法来在应用程序启动时初始化组件。 库开发人员和应用程序开发人员都可以使用 App
Startup 来简化启动顺序并明确设置初始化顺序。

App Startup 允许您定义共享单个内容提供程序的组件初始化程序,而不是为您需要初始化的每个组件定义单独的内容提供程序。 这可以显着缩短应用程序启动时间。
从上面的文档上就可以总结下它的作用:
简化启动顺序、设置初始化顺序
实现StartUp提供的接口即可,无需自定义ContentProvider
合并Initializer到一个ContentProvider,减少启动时间。
接下来我们看下如何使用及这些作用的体现

StartUp的使用方法

添加StartUp库

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

实现Intiallizer方法

class SimpleInitializer: Initializer<String> {
    @SuppressLint("RestrictedApi")
    override fun create(context: Context): String {
        // WorkManager 已经初始化完成了
        val workManager = WorkManager.getInstance(context)
        val result: String = doSomeThing(workManager)
        return result
    }

    /**
     * [create] 之前的依赖,就是必须要依赖初始化完成后才能执行[create], 这个就是顺序执行
     * 上面的AndroidManifest分析中我们已经看到 [WorkManager] 的 [WorkManagerInitializer] 已经通过StartUp初始化了
     */
    override fun dependencies(): MutableList<Class<out Initializer<*>>> {
        return mutableListOf(WorkManagerInitializer::class.java)
    }
}

在AndroidManifest中添加provider

<provider
    android:authorities="${applicationId}.androidx-startup"
    android:name="androidx.startup.InitializationProvider"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="com.hsw.forreview.SimpleInitializer"
        android:value="androidx.startup"/>
</provider>

这样配置就可以了。
如果不想在这里初始化,想要自定义初始化时机。

<meta-data android:name="com.hsw.forreview.SimpleInitializer"
    android:value="androidx.startup"
    tools:node="remove"/>

AppInitializer.getInstance(this).initializeComponent(SimpleInitializer::class.java)

解析apk中的AndroidManifest可以看到已加入到provider中

<provider android:authorities="com.hsw.forreview.androidx-startup" android:exported="false" android:name="androidx.startup.InitializationProvider">
            <meta-data android:name="com.hsw.forreview.SimpleInitializer" android:value="androidx.startup"/>
            <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup"/>
            <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup"/>
            <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup"/>
</provider>

总结:

实际开发中大部分三方的SDK都是需要application作为依赖的,所以使用StartUp的机会并不多。如果是不依赖的建议使用这种方式,毕竟我们使用的jetpack都已经用它初始化了,我们在里面多加一条,相当于搭了顺风车,省时省力。
虽然用它不多,但是可以借鉴它的实现初始化顺序的思想可以借鉴下,在application中应用。具体实现详情还需看源码解析。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。