Por lo general, presentamos más o menos SDK de terceros en el desarrollo de proyectos. Básicamente, deben inicializarse cuando se introducen. La mayoría de las inicializaciones de SDK se inicializan en onCreate () de la aplicación, como las siguientes:
class MyApplication:Application() {
override fun onCreate() {
super.onCreate()
MySdk().init(this)
MySdk1().init(this)
MySdk2().init(this)
MySdk3().init(this)
Log.d("MyTest", "MyApplication create")
}
}
De esta forma, con el desarrollo del proyecto, se irán introduciendo cada vez más SDK de terceros, lo que hará que el código de inicialización en la Aplicación esté muy hinchado, y afectará demasiado la eficiencia de inicio de toda la Aplicación. ¿Existe una solución que pueda hacer que la aplicación sea menos hinchada y mejorar la eficiencia de inicio de la aplicación?
Tener
Aplicación de Jetpack
¿Cómo usarlo? Es simple, solo tres pasos
1. Introducir dependencias
2. Implementar la interfaz Initializer
3. Registro en AndroidManifest.xml
【1. Introducir dependencia】
dependencies {
implementation "androidx.startup:startup-runtime:1.0.0-alpha02"
}
[ 2. Implementar la interfaz de inicializador ]
class SdkInitializer : Initializer<Any> {
override fun create(context: Context) {
// init your sdk
MySdk().init(context)
Log.d("MyTest", "Initializer create")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
Log.d("MyTest", "Initializer dependencies")
return emptyList()
}
}
[ 3. Registro en AndroidManifest.xml ]
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.leo.dicaprio.myutilapp.startup.SdkInitializer"
android:value="androidx.startup" />
</provider>
El punto principal aquí es que solo se puede cambiar el nombre de metadatos para el contenido registrado de AndroidManifest.xml. Es mejor no cambiar otros lugares, ni es necesario cambiarlo.
Es así de simple. Coloque todos los SDK que deben inicializarse en las interfaces create () y dependencies () de Initializer. ¿Qué interfaz debería instalar?
Si el sdk1 que introdujo no necesita depender de otro sdk2, solo necesita poner sdk1 en create () para la inicialización, de la siguiente manera:
class SdkInitializer : Initializer<Any> {
override fun create(context: Context) {
// init your sdk
MySdk1().init(context)
Log.d("MyTest", "Initializer create")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
Log.d("MyTest", "Initializer dependencies")
// 如果没有需要初始化的sdk,返回 空列表即可
return emptyList()
}
}
Si el sdk1 que importó necesita depender de otro sdk2, entonces necesita poner sdk2 en dependencias () , y luego poner sdk1 en create () para la inicialización,
Debido a que las dependencias () precede a la devolución de llamada create () , asegúrese de que sdk2 se inicialice primero, de la siguiente manera:
【SdkInitializer】
class SdkInitializer : Initializer<Any> {
override fun create(context: Context) {
// init your sdk
MySdk().init(context)
Log.d("MyTest", "Initializer create")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
Log.d("MyTest", "Initializer dependencies")
return listOf(Sdk2Initializer::class.java)
}
}
【SdkInitializer2】
class Sdk2Initializer : Initializer<Any> {
override fun create(context: Context) {
// init your sdk
MySdk2().init(context)
Log.d("MyTest", "Initializer create2")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
Log.d("MyTest", "Initializer dependencies2")
return emptyList()
}
}
Tenga en cuenta que solo es necesario registrar un inicializador, no es necesario registrar Sdk2Initializer en AndroidManifest.xml; de lo contrario, se informará un error ...
Iniciamos la aplicación, miramos el log:
/MyTest: Initializer dependencies
/MyTest: Initializer dependencies2
/MyTest: Initializer create2
/MyTest: Initializer create
Mire el registro disponible: primero inicialice sdk2, luego inicialice sdk1
【Principio】
Lo anterior acaba de hablar sobre cómo usarlo, pero ¿por qué puede mejorar la eficiencia de inicio? Primero observe el registro de Initializer en AndroidManifest.xml,
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.leo.dicaprio.myutilapp.startup.SdkInitializer"
android:value="androidx.startup" />
</provider>
De hecho, Initializer es un ContentProvider. La ejecución de ContentProvider precede a la aplicación y el proceso es el siguiente:
El orden de ejecución de una aplicación es así. Primero llame al método attachBaseContext () de Application, luego llame al método onCreate () de ContentProvider, y luego llame al método onCreate () de Application
Movimos la inicialización del SDK al ContentProvider antes de la aplicación. Esto solo evitó el código de la aplicación inflado y no vio ninguna mejora en la eficiencia, porque cuánto tiempo se debe dedicar a la inicialización y cuánto tiempo se debe dedicar.
Sin embargo, ¿te acuerdas? Como se mencionó anteriormente, solo es necesario registrar un inicializador y no se requieren varios inicializadores y no se pueden registrar. De hecho, la razón por la que AppStartup puede mejorar la eficiencia es precisamente aquí: no importa cuántos SDK necesite inicializar, solo necesita registrar un inicializador (es decir, un ContentProvider).
En pocas palabras, cuanto más ContentProviders se registre, más tiempo tardará en iniciarse ContentProvider. Pero registrar solo un ContentProvider ciertamente puede mejorar la eficiencia.
Deje un mensaje si tiene alguna pregunta anterior, gracias