Inicio de la aplicación Android Jetpack 之

       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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/Leo_Liang_jie/article/details/108404923
Recomendado
Clasificación