Optimisations de mise en page DEX et profils de démarrage

Ce document explique comment activer les optimisations de mise en page DEX avec des profils de démarrage lorsque vous créez une application Android.

Conditions requises

Pour utiliser les optimisations de mise en page DEX et les fonctionnalités associées, vous devez disposer de la version 1.2.0-alpha14 de Jetpack Macrobenchmark ou ultérieure, et du plug-in Android Gradle décrit dans le tableau suivant :

Technologie Version minimale du plug-in Android Gradle
Profils de référence 7.4.1
Optimisations de mise en page DEX 8.2.0-alpha09
Compilation du profil améliorée 8.2.0-alpha09

Actuellement, les systèmes de compilation tiers tels que Bazel ne sont pas compatibles.

Profils de démarrage

Les profils de démarrage sont semblables aux profils de référence. Ils décrivent les classes et les méthodes qui sont essentielles au démarrage de l'application et qui doivent être prêtes à être chargées en premier. Les profils de démarrage utilisent également le même format lisible par l'humain que les profils de référence.

Une différence essentielle entre les profils de démarrage et les profils de référence est que les profils de référence incluent des classes et des méthodes importantes pour l'optimisationau-delà du démarrage de l'application, par exemple en réduisant les à-coups pendant les animations ou les parcours utilisateur critiques après le démarrage.

Une autre différence clé entre les profils de démarrage et les profils de référence est que les profils de démarrage ne peuvent pas être fournis par les bibliothèques et ne sont pas susceptibles d'être fusionnés par le plug-in Android Gradle. En effet, les bibliothèques ne comprennent pas forcément bien le rôle des classes et des méthodes essentielles lors du démarrage de l'application. C'est pourquoi il est préférable qu'elles proviennnent de Jetpack Macrobenchmarks, en utilisant BaselineProfileRule avec les CUJ qui ciblent spécifiquement le démarrage de l'application, comme collect.

Le tableau suivant fournit un résumé rapide des principales différences entre les profils de référence et les profils de démarrage.

Type de profil Par build Peuvent faire l'objet d'une fusion
Profils de référence N O
Profils de démarrage O N

Les profils de démarrage sont stockés dans src/<variantName>/main/baselineProfiles/startup-prof.txt.

Optimisations de mise en page DEX

Cette optimisation permet de réduire le nombre de défaillances majeures de page au démarrage de l'application en améliorant la localité du code utilisé au démarrage, ce qui raccourcit le temps de démarrage.

Elle est possible grâce à l'ajout de tout le code exécuté au démarrage dans le fichier classes.dex principal et à la suppression du code non nécessaire au démarrage dans le fichier classes.dex principal.

Figure 1 : Amélioration de la localité du code pour l'optimisation de mise en page DEX

Utiliser les optimisations de mise en page DEX

Cette section explique comment utiliser les optimisations de mise en page DEX.

Créer des profils de démarrage

Tout d'abord, vous devez créer vos profils de démarrage.

Configuration du projet

Dans l'exemple précédent, le test d'instrumentation génère un module app nommé com.example.app.

Lorsque vous utilisez Jetpack Macrobenchmarks pour générer des règles de profil de démarrage, vous définissez une nouvelle variante de benchmark dans le cadre de la compilation. Cette variante est identique à la variante de version, sauf que vous désactivez la minification.

Voici un extrait du fichier build.gradle du module d'application.

Kotlin

buildTypes {
        ...
        create("benchmark") {
            initWith(buildTypes.getByName("release")
            isMinifyEnabled = false
            signingConfig = signingConfigs.getByName("debug")
            matchingFallbacks += "release"
        }
}

Groovy

buildTypes {
        ...
        benchmark {
            initWith buildTypes.release
            minifyEnabled false
            signingConfig signingConfigs.debug
            matchingFallbacks = ['release']
        }
}

Générer des règles de démarrage

Kotlin

@RunWith(AndroidJUnit4::class)
class StartupProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun startup() =
        baselineProfileRule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
    ) {
            // This scenario just starts the activity and waits for it to draw
            // the first frame. If you have animations or async content in your
            // startup, wait for them with UiAutomator.
            startActivityAndWait()
        }
}

Java

@RunWith(AndroidJUnit4.class)
public class StartupProfileGenerator {
    @Rule
    BaselineProfileRule baselineProfileRule = new BaselineProfileRule();

    @Test
    public void startup() {
        baselineProfileRule.collect(
            "com.example.app",
            /* includeInStartupProfile = */ true,
            (scope -> {
                // This scenario just starts the activity and waits for it to
                // draw the first frame. If you have animations or async content
                // in your startup, wait for them with UiAutomator.
                scope.startActivityAndWait();
                return null;
            }
        ));
    }
}

Sortie

Les résultats du test sont exécutés dans un fichier qui se présente comme suit :

HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;

Copiez le contenu du fichier de sortie dans src/main/baselineProfiles/startup-prof.txt.

Activer les optimisations de mise en page DEX

La propriété expérimentale android.experimental.r8.dex-startup-optimization permet d'optimiser la mise en page DEX.

Kotlin

android {
    // ...
    experimentalProperties["android.experimental.r8.dex-startup-optimization"] = true
}

Groovy

android {
    // ...
    experimentalProperties["android.experimental.r8.dex-startup-optimization"] = true
}

Pour créer l'APK avec des optimisations de mise en page DEX, vous pouvez utiliser la commande suivante :

./gradlew :app:assembleRelease