您现在的位置是:首页 >其他 >Jetpack StartUp网站首页其他
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中应用。具体实现详情还需看源码解析。