Démarrage des applications Inclus dans Android Jetpack.
La bibliothèque App Startup offre un moyen simple et performant d'initialiser au démarrage de l'application. Les développeurs de bibliothèques et d'applications vous pouvez utiliser le démarrage de l'application pour simplifier les séquences de démarrage et définir explicitement l'ordre de l'initialisation.
Au lieu de définir des fournisseurs de contenu distincts pour chaque composant, vous devez le démarrage de l'application vous permet de définir des initialiseurs de composants qui partagent avec un seul fournisseur de contenu. Cela peut considérablement améliorer le temps de démarrage de l'application.
Configuration
Pour utiliser Jetpack Startup dans votre bibliothèque ou votre application, ajoutez ce qui suit à votre Gradle :
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.1.1" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.1.1") }
Initialiser les composants au démarrage de l'application
Les applications et les bibliothèques reposent souvent sur l'initialisation immédiate des composants l'application démarre. Pour répondre à ce besoin, vous pouvez faire appel à des fournisseurs initialisera chaque dépendance, mais l'instanciation des fournisseurs de contenu coûte cher. et peut ralentir inutilement la séquence de démarrage. En outre, Android initialise les fournisseurs de contenu dans un ordre indéterminé. App Startup offre un plus efficace d'initialiser les composants au démarrage de l'application et d'initialiser définir leurs dépendances.
Pour utiliser le démarrage de l'application afin d'initialiser automatiquement les composants au démarrage, vous devez : définir un initialiseur de composant pour chaque composant dont l'application a besoin initialiser.
Implémenter des initialiseurs de composants
Pour définir chaque initialiseur de composant, créez une classe qui implémente la classe
Initializer<T>
.
Cette interface définit deux méthodes importantes:
- La méthode
create()
, qui contient toutes les opérations nécessaires pour initialisez le composant et renvoie une instance deT
. - La méthode
dependencies()
, qui renvoie une liste des autres ObjetsInitializer<T>
dont dépend l'initialiseur. Vous pouvez utiliser cette pour contrôler l'ordre dans lequel l'application exécute les initialiseurs au démarrage.
Par exemple, supposons que votre application dépende
WorkManager
et doit
et l'initialiser au démarrage. Définissez une classe WorkManagerInitializer
qui
implémente 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(); } }
La méthode dependencies()
renvoie une liste vide, car WorkManager
n'a pas
dépendent de toute autre bibliothèque.
Supposons que votre application dépend également d'une bibliothèque appelée ExampleLogger
, qui, dans
dépend de WorkManager
. Cette dépendance signifie
que vous devez vous assurer
que le démarrage de l'application initialise WorkManager
en premier. Définissez une
ExampleLoggerInitializer
qui implémente 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); } }
Étant donné que vous incluez WorkManagerInitializer
dans la méthode dependencies()
,
Le démarrage initialise WorkManager
avant ExampleLogger
.
Configurer des entrées de fichier manifeste
App Startup inclut un fournisseur de contenu spécial appelé InitializationProvider
qu'il utilise pour détecter et appeler
les initialiseurs de composants. Démarrage des applications
découvre les initialiseurs de composants en recherchant d'abord une entrée <meta-data>
sous l'entrée du fichier manifeste InitializationProvider
. Ensuite, le démarrage de l'application appelle
dependencies()
pour tous les initialiseurs qu'il a déjà découverts.
Cela signifie que pour qu'un initialiseur de composant soit visible par l'application, Au démarrage, l'une des conditions suivantes doit être remplie:
- L'initialiseur de composant possède une entrée
<meta-data>
correspondante sous la section Entrée du fichier manifesteInitializationProvider
. - L'initialiseur du composant est répertorié dans la méthode
dependencies()
à partir d'une d'un initialiseur déjà visible.
Reprenons l'exemple avec WorkManagerInitializer
.
ExampleLoggerInitializer
Pour s'assurer que le démarrage de l'application détecte ces
d'initialisation, ajoutez ce qui suit au fichier manifeste:
<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>
Vous n'avez pas besoin d'ajouter une entrée <meta-data>
pour WorkManagerInitializer
.
car WorkManagerInitializer
est une dépendance de ExampleLoggerInitializer
.
Cela signifie que si ExampleLoggerInitializer
est visible, il l'est aussi
WorkManagerInitializer
L'attribut tools:node="merge"
garantit que l'outil de fusion des fichiers manifestes
résout correctement les entrées en conflit.
Exécuter des vérifications lint
La bibliothèque App Startup inclut un ensemble de règles lint que vous pouvez utiliser pour vérifier
si vous avez correctement défini
les initialiseurs de composants. Vous pouvez effectuer
ces vérifications lint en exécutant ./gradlew :app:lintDebug
à partir de la ligne de commande.
Initialiser manuellement les composants
Habituellement, lorsque vous utilisez le démarrage de l'application, l'objet InitializationProvider
utilise une
entité appelée
De AppInitializer
à
pour détecter et exécuter automatiquement les initialiseurs de composants au démarrage de l'application.
Toutefois, vous pouvez également utiliser AppInitializer
directement pour
initialisez les composants dont votre application n'a pas besoin au démarrage. C'est ce qu'on appelle
l'initialisation différée, et peut contribuer à réduire les coûts de démarrage.
Vous devez d'abord désactiver l'initialisation automatique pour les composants que vous souhaitez pour s'initialiser manuellement.
Désactiver l'initialisation automatique pour un composant individuel
Pour désactiver l'initialisation automatique pour un seul composant, supprimez le paramètre
Entrée <meta-data>
pour l'initialiseur de ce composant à partir du fichier manifeste.
Par exemple, l'ajout de ce qui suit au fichier manifeste désactive l'automatisation
initialisation pour 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>
Vous utilisez tools:node="remove"
dans l'entrée au lieu de simplement la supprimer.
afin de vous assurer que l'outil de fusion supprime également l'entrée de toutes les autres
des fichiers manifestes fusionnés.
Désactiver l'initialisation automatique pour tous les composants
Pour désactiver toute initialisation automatique, supprimez l'intégralité de l'entrée pour
InitializationProvider
du fichier manifeste:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Appeler manuellement les initialiseurs de composants
Si l'initialisation automatique est désactivée pour un composant, vous pouvez utiliser
AppInitializer
pour initialiser manuellement ce composant et ses dépendances.
Par exemple, le code suivant appelle AppInitializer
et initialise manuellement
ExampleLogger
:
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
Par conséquent, le démarrage de l'application initialise également WorkManager
, car WorkManager
est
une dépendance de ExampleLogger
.
Envoyer des commentaires
Faites-nous part de vos commentaires et de vos idées via les ressources suivantes :
- Issue Tracker
- Signalez les problèmes pour que nous puissions corriger les bugs.
Recommandations personnalisées
- Remarque : Le texte du lien s'affiche lorsque JavaScript est désactivé
- Architecture de l'application: Couche de données – Planifier une tâche avec WorkManager – Développeurs Android
- Architecture de l'application: Couche de données – DataStore – Développeurs Android