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 ~
- Análisis de componentes de ContentProvider: Android | Proceso de trabajo de ContentProvider
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
Initializer
La 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é ycontext
el 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 InitializationProvider
debemos AndroidManifest
declarar, 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 quemanifest merger tool
los nodos en conflicto se puedan resolver correctamente; - 5. Los metadatos
name
son el nombre completo de la clase de implementación del Inicializador del componente,value
que esandroidx.startup
.
Sugerencia: ¿Por qué querrías
androidx.startup
establecerlo envalue
, en lugar dename
? Porque el par clave-valorname
es único,value
pero se permiten duplicados.
Acerca AndroidManifest
de 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 AndroidManifest
declararse 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 tool
reglas de combinación para eliminar el Inicializador correspondiente a esta biblioteca. detalles de la siguiente manera:
<provider
android:name="andro