Inicio de apps Parte de Android Jetpack.
La biblioteca de App Startup proporciona una forma sencilla y eficaz de inicializar de seguridad cuando se inicia la aplicación. Desarrolladores de bibliotecas y desarrolladores de apps Puede usar App Startup para optimizar las secuencias de inicio y establecer el orden de forma explícita de la inicialización.
En lugar de definir proveedores de contenido independientes para cada componente, debes inicializar, App Startup te permite definir inicializadores de componentes que comparten un único proveedor de contenido. Esto puede acelerar en gran medida el tiempo de inicio de la app.
Configuración
Para usar Jetpack Startup en tu biblioteca o app, agrega lo siguiente a tu Gradle archivo:
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.2.0" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.2.0") }
Cómo inicializar componentes cuando se inicia la app
Las apps y las bibliotecas a menudo dependen de que los componentes se inicialicen de inmediato cuando se inicia la app. Puedes satisfacer esta necesidad usando proveedores de contenido para inicializan cada dependencia, pero la creación de instancias de los proveedores de contenido es costoso. y puede ralentizar la secuencia de inicio de forma innecesaria. Además, Android inicializa los proveedores de contenido en un orden indeterminado. App Startup proporciona una y con mejor rendimiento de inicializar componentes cuando se abre la app y de manera explícita definen sus dependencias.
Para usar App Startup para inicializar componentes automáticamente en el inicio, debes hacer lo siguiente: definir un inicializador de componentes para cada componente que la app necesite inicializar.
Cómo implementar inicializadores de componentes
Para definir cada inicializador de componentes, crea una clase que implemente el Initializer<T>
. Esta interfaz define dos métodos importantes:
- El método
create()
, que contiene todas las operaciones necesarias para inicializamos el componente y muestra una instancia deT
. - El método
dependencies()
, que muestra una lista de las otras ObjetosInitializer<T>
de los que depende el inicializador. Puedes usar esta para controlar el orden en el que la app ejecuta los inicializadores en el inicio.
Por ejemplo, supongamos que tu app depende de WorkManager
y debe y, luego, inicializarlo al inicio. Define una clase WorkManagerInitializer
que implementa Initializer<WorkManager>
:
Kotlin
// Initializes WorkManager. class WorkManagerInitializer : Initializer<WorkManager> { override fun create(context: Context): WorkManager { val configuration = Configuration.Builder().build() WorkManager.initialize(context, configuration) return WorkManager.getInstance(context) } override fun dependencies(): List<Class<out Initializer<*>>> { // No dependencies on other libraries. return emptyList() } }
Java
// Initializes WorkManager. class WorkManagerInitializer implements Initializer<WorkManager> { @Override public WorkManager create(Context context) { Configuration configuration = Configuration.Builder().build(); WorkManager.initialize(context, configuration); return WorkManager.getInstance(context); } @Override public List<Class<Initializer<?>>> dependencies() { // No dependencies on other libraries. return emptyList(); } }
El método dependencies()
muestra una lista vacía porque WorkManager
no. depender de otras bibliotecas.
Supongamos que tu app también depende de una biblioteca llamada ExampleLogger
, que en Girar depende de WorkManager
. Esta dependencia significa que debes asegurarte que App Startup inicialice WorkManager
primero. Define un Clase ExampleLoggerInitializer
que implementa Initializer<ExampleLogger>
:
Kotlin
// Initializes ExampleLogger. class ExampleLoggerInitializer : Initializer<ExampleLogger> { override fun create(context: Context): ExampleLogger { // WorkManager.getInstance() is non-null only after // WorkManager is initialized. return ExampleLogger(WorkManager.getInstance(context)) } override fun dependencies(): List<Class<out Initializer<*>>> { // Defines a dependency on WorkManagerInitializer so it can be // initialized after WorkManager is initialized. return listOf(WorkManagerInitializer::class.java) } }
Java
// Initializes ExampleLogger. class ExampleLoggerInitializer implements Initializer<ExampleLogger> { @Override public ExampleLogger create(Context context) { // WorkManager.getInstance() is non-null only after // WorkManager is initialized. return ExampleLogger(WorkManager.getInstance(context)); } @Override public List<Class<Initializer<?>>> dependencies() { // Defines a dependency on WorkManagerInitializer so it can be // initialized after WorkManager is initialized. return Arrays.asList(WorkManagerInitializer.class); } }
Como incluyes WorkManagerInitializer
en el método dependencies()
, la app El inicio inicializa WorkManager
antes del ExampleLogger
.
Cómo configurar entradas del manifiesto
App Startup incluye un proveedor de contenido especial llamado InitializationProvider
que usa para descubrir y llamar a los inicializadores de tus componentes. Inicio de apps descubre inicializadores de componentes verificando primero una entrada <meta-data>
. en la entrada del manifiesto InitializationProvider
. Luego, App Startup llama a dependencies()
para cualquier inicializador que ya haya descubierto.
Esto significa que, para que la App pueda detectar el inicializador de un componente, Para el inicio, se debe cumplir una de las siguientes condiciones:
- El inicializador del componente tiene una entrada
<meta-data>
correspondiente en el Entrada de manifiesto deInitializationProvider
. - El inicializador del componente aparece en el método
dependencies()
de un inicializador que ya es detectable.
Considera nuevamente el ejemplo con WorkManagerInitializer
y ExampleLoggerInitializer
Para garantizar que App Startup pueda detectar estos inicializadores, agrega lo siguiente al archivo de manifiesto:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- This entry makes ExampleLoggerInitializer discoverable. --> <meta-data android:name="com.example.ExampleLoggerInitializer" android:value="androidx.startup" /> </provider>
No es necesario que agregues una entrada <meta-data>
para WorkManagerInitializer
, porque WorkManagerInitializer
es una dependencia de ExampleLoggerInitializer
. Esto significa que si ExampleLoggerInitializer
es detectable, también lo es WorkManagerInitializer
El atributo tools:node="merge"
garantiza que la combinación del manifiesto la herramienta resuelve correctamente cualquier entrada en conflicto.
Cómo ejecutar comprobaciones de lint
La biblioteca de App Startup incluye un conjunto de reglas de lint que puedes usar para comprobar si definiste los inicializadores de componentes correctamente. Puedes realizar estas comprobaciones de lint ejecutando ./gradlew :app:lintDebug
desde la línea de comandos.
Inicializa los componentes de forma manual
Por lo general, cuando usas App Startup, el objeto InitializationProvider
usa un entidad llamada AppInitializer
a descubrir y ejecutar automáticamente inicializadores de componentes cuando se inicia la aplicación. Sin embargo, también puedes usar AppInitializer
directamente para inicializar componentes que tu app no necesita en el inicio. Esto se denomina inicialización diferida y puede ayudar a minimizar los costos de inicio.
Primero debes inhabilitar la inicialización automática para los componentes que desees. para inicializarse de forma manual.
Inhabilita la inicialización automática para un componente individual
Para inhabilitar la inicialización automática de un solo componente, quita el elemento Entrada <meta-data>
para el inicializador de ese componente desde el manifiesto
Por ejemplo, si agregas lo siguiente al archivo de manifiesto, se inhabilitan las actualizaciones automáticas inicialización de ExampleLogger
:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="com.example.ExampleLoggerInitializer" tools:node="remove" /> </provider>
Usa tools:node="remove"
en la entrada en lugar de solo quitarla para asegurarte de que la herramienta de fusión también elimine la entrada de todos los demás archivos de manifiesto combinados.
Inhabilita la inicialización automática para todos los componentes
Para inhabilitar toda la inicialización automática, quita toda la entrada durante InitializationProvider
del manifiesto:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove" />
Cómo llamar manualmente a inicializadores de componentes
Si la inicialización automática está inhabilitada para un componente, puedes usar AppInitializer
para inicializar de forma manual ese componente y sus dependencias
Por ejemplo, el siguiente código llama a AppInitializer
y se inicializa de forma manual ExampleLogger
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
Como resultado, App Startup también inicializa WorkManager
porque WorkManager
es una dependencia de ExampleLogger
.
Envía comentarios
Usa estos recursos para compartir tus comentarios y tus ideas con nosotros:
- Herramienta de seguimiento de errores
- Informa los problemas para que podamos corregir los errores.
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- Arquitectura de apps: Capa de datos - Cómo programar tareas con WorkManager - Android Developers
- Arquitectura de apps: Capa de datos - DataStore - Android Developers