El uso y la deficiencia de la aplicación de inicio de Jetpack y la versión mejorada de Android-Startup

El 28 de octubre de 2020, JetPack | App Startup 1.0.0  finalmente marcó el comienzo del lanzamiento oficial.

La biblioteca de inicio de la aplicación proporciona una manera simple y eficiente de inicializar los componentes cuando se inicia la aplicación. Tanto los desarrolladores de bibliotecas como los desarrolladores de aplicaciones pueden usar el inicio de la aplicación para simplificar la secuencia de inicio y establecer explícitamente el orden de inicialización.

En lugar de definir un proveedor de contenido independiente para cada componente que debe inicializarse, App Startup le permite definir inicializadores de componentes que comparten un solo proveedor de contenido. Esto puede reducir significativamente el tiempo de inicio de la aplicación.

Tabla de contenido


conocimiento previo

El contenido de este artículo implicará los siguientes requisitos previos/conocimientos relacionados, y lo he preparado para usted, disfrute ~


1. ¿Por qué usar el inicio de la aplicación?

En esta sección, analicemos por qué se usa App Startup, es decir, qué problemas resuelve App Startup.

El método no invasivo para obtener Contexto basado en el mecanismo de inicio de ContentProvider : "Android | Use ContentProvider para obtener Contexto sin intrusión" . Aquí resumo brevemente:

  • 1. En la biblioteca de terceros o de terceros, a menudo es necesario obtener el Contexto para la inicialización;
  • 2. Debido a que ContentProvider se inicializará cuando se inicie la aplicación, muchas bibliotecas usan el mecanismo de inicio de ContentProvider Application#onCreate()para inicializarse, como LeakCanary 2.4 :

AppWatcherInstaller.java

internal sealed class AppWatcherInstaller : ContentProvider() {

    internal class MainProcess : AppWatcherInstaller()

    internal class LeakCanaryProcess : AppWatcherInstaller()

    override fun onCreate(): Boolean {
        val application = context!!.applicationContext as Application
        AppWatcher.manualInstall(application)
        return true
    }

    // 其他方法直接 return 
}
  • 3. El riesgo de este enfoque es que hay demasiados ContentProviders e iniciar demasiados ContentProviders aumentará el tiempo de inicio de la aplicación.

  • 4. El enfoque de AppStartup es fusionar todos los ContentProviders utilizados para la inicialización, reducir la creación de ContentProviders y proporcionar administración global .


2. Pasos para usar

En esta sección, resumiremos los pasos para usar el inicio de la aplicación. Las dependencias son las siguientes:

build.gradle

implementation "androidx.startup:startup-runtime:1.0.0"

2.1 Implementar la interfaz del Inicializador para el componente

InitializerLa interfaz es la interfaz del componente encapsulada por Startup, que se utiliza para especificar la lógica de inicialización y la secuencia de inicialización (es decir, la relación de dependencia) del componente.

Initializer.java

public interface Initializer<T> {

    1、初始化操作,返回的初始化结果将被缓存
    @NonNull
    T create(@NonNull Context context);

    2、依赖关系,返回值是一个依赖组件的列表
    @NonNull
    List<Class<? extends Initializer<?>>> dependencies();
}
  • 1. create(...)Operación de inicialización: el resultado de inicialización devuelto se almacenará en caché y contextel parámetro es Aplicación;
  • 2. dependencies()Dependencia: El valor devuelto es una lista de componentes dependientes, si no hay necesidad de depender de otros componentes, devuelve una lista vacía. Cuando App Startup inicialice el componente actual, se asegurará de que los componentes dependientes se hayan inicializado.

2.2 Inicialización automática

Como se mencionó anteriormente, App Startup fusiona todos los ContentProviders utilizados para la inicialización. El ContentProvider fusionado es lo que InitializationProviderdebemos AndroidManifestdeclarar, por ejemplo:

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

Los puntos principales son los siguientes:

  • 1. El nombre del componente debe ser androidx.startup.InitializationProvider;
  • 2. Se requiere una declaración android:exported="false"para restringir el acceso de otras aplicaciones a este componente;
  • 3. Se requiere que sea android:authoritiesúnico en todo el teléfono móvil, generalmente usando ${applicationId} como prefijo;
  • 4. Debe declararse tools:node="merge"para garantizar que manifest merger toollos nodos en conflicto se puedan resolver correctamente;
  • 5. Los metadatos nameson el nombre completo de la clase de implementación del Inicializador del componente, valueque es androidx.startup.

Sugerencia: ¿Por qué querrías androidx.startupestablecerlo en value, en lugar de name? Porque el par clave-valor namees único, valuepero se permiten duplicados.

Acerca AndroidManifestde cómo App Startup realiza automáticamente la inicialización después de declarar componentes en , dije en la Sección 3 .

2.3 Inicialización manual

Cuando un componente necesita una carga diferida (una tarea que requiere mucho tiempo), se puede realizar una inicialización manual. Los inicializadores que requieren una inicialización manual no necesitan AndroidManifestdeclararse en , ni otros componentes deben confiar en ellos. La inicialización manual se puede realizar llamando a:

AppInitializer.getInstance(context)
.initializeComponent(ExampleLoggerInitializer::class.java)

Cabe señalar que el resultado de la inicialización se almacenará en caché en el inicio de la aplicación, y las llamadas repetidas initializeComponent()no darán lugar a una inicialización repetida. Sobre el análisis del código fuente de la parte de inicialización manual del inicio de la aplicación, dije en la Sección 3 .

2.4 Cancelar la inicialización automática

Si algunas bibliotecas han sido configuradas con inicialización automática usando el método en la Sección 2.2 , y queremos realizar una carga diferida, necesitamos usar las manifest merger toolreglas de combinación para eliminar el Inicializador correspondiente a esta biblioteca. detalles de la siguiente manera:

<provider
    android:name="andro

Supongo que te gusta

Origin blog.csdn.net/MYBOYER/article/details/124035680
Recomendado
Clasificación