Jetpack新成员,App Startup

介绍

App Startup是一个可以用于加速App启动速度的一个库。

出现的原因

以前初始化第三方库会在Application的onCreate中。

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        LitePal.initialize(this)
        AAA.initialize(this)
        BBB.initialize(this)
        CCC.initialize(this)
		DDD.initialize(this)
		EEE.initialize(this)
    }
    ...
}
复制代码

现在越来越多的库在ontentProvider来初始化。

class MyProvider : ContentProvider() {

    override fun onCreate(): Boolean {
        context?.let {
            LitePal.initialize(it)
        }
        return true
    }
    ...
}

复制代码

image.png

这样写逻辑不会有什么问题。

但是ContentProvider越来越多,启动就慢了。

关于ContentProvider的耗时,Google官方也有给出一个测试结果:

image.png

原理

把这些库放置到一个ContentProvider。

  1. 以前:

image.png

  1. 现在:

image.png

使用

  1. 引入App Startup。
dependencies {
    implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}
复制代码
  1. 定义一个用于执行初始化的Initializer,并实现App Startup库的Initializer接口。
class LitePalInitializer : Initializer<Unit> {

    override fun create(context: Context) {
        LitePal.initialize(context)
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        (1)依赖其他Initializer
        return listOf(OtherInitializer::class.java)
        (2)不依赖其他Initializer
         return emptyList()
    }

}
复制代码

Initializer接口要求重现两个方法。

  • 在create()方法中,我们去进行之前要进行的初始化操作就可以了,create()方法会把我们需要的Context参数传递进来。

  • dependencies()方法表示,当前的LitePalInitializer是否还依赖于其他的Initializer,如果有的话,就在这里进行配置,App Startup会保证先初始化依赖的Initializer,然后才会初始化当前的LitePalInitializer。不依赖的话,直接返回emptyList()。

  1. 将它配置到AndroidManifest.xml当中。
<application ...>

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

复制代码

这里的配置是有比较严格的格式要求的

meta-data中的android:name部分我们需要指定成我们自定义的Initializer的全路径类名,其他部分都是不能修改的,否则App Startup库可能会无法正常工作。

使用小结:

  1. 引入App Startup的库。
  2. 自定义一个用于初始化的Initializer。
  3. 将自定义Initializer配置到AndroidManifest.xml当中。

延迟初始化

<application ...>

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

复制代码

区别仅仅在于,这里在LitePalInitializer的meta-data当中加入了一个tools:node="remove"的标记。

这个标记用于告诉manifest merger tool,在最后打包成APK时,将所有android:name是com.example.LitePalInitializer的meta-data节点全部删除。

等需要初始化的时候,调用这个方法。

AppInitializer.getInstance(this)
    .initializeComponent(LitePalInitializer::class.java)
复制代码

总结:

  1. 原理就是将多个ContentProvider压缩成一个。

  2. 这个组件是给库的开发者使用的。

参考:

Guess you like

Origin juejin.im/post/7060349714205999140