Plug-in Android Gradle 8.1.0 (juillet 2023)

Le plug-in Android Gradle 8.1.0 est une version majeure qui comprend de nombreuses nouvelles fonctionnalités et améliorations.

Compatibilité

Version minimale Version par défaut Notes
Gradle 8.0 8.0 Pour en savoir plus, consultez Mettre à jour Gradle.
Build Tools SDK 33.0.1 33.0.1 Installez ou configurez des Build Tools SDK.
NDK N/A 25.1.8937393 Installez ou configurez une autre version du NDK.
JDK 17 17 Pour en savoir plus, consultez Définir la version du JDK.

Le DSL Kotlin est le langage par défaut pour la configuration de compilation

Les nouveaux projets utilisent désormais le DSL Kotlin (build.gradle.kts) par défaut pour la configuration de la compilation. Cela offre une meilleure expérience d'édition que le DSL Groovy (build.gradle) avec la mise en surbrillance de la syntaxe, la complétion du code et la navigation vers les déclarations. Notez que si vous utilisez AGP 8.1 et le DSL Kotlin pour la configuration de compilation, vous devez utiliser Gradle 8.1 pour une meilleure expérience. Pour en savoir plus, consultez le guide de migration du langage DSL Kotlin.

Prise en charge automatique des langues par application

À partir d'Android Studio Giraffe Canary 7 et d'AGP 8.1.0-alpha07, vous pouvez configurer votre application pour qu'elle prenne automatiquement en charge les préférences linguistiques par appli. En fonction des ressources de votre projet, le plug-in Android Gradle génère le fichier LocaleConfig et ajoute une référence à celui-ci dans le fichier manifeste final. Vous n'avez donc plus à le faire manuellement. Le plug-in Android Gradle utilise les ressources des dossiers res de vos modules d'application et les dépendances des modules de la bibliothèque pour déterminer les paramètres régionaux à inclure dans le fichier LocaleConfig.

Notez que la fonctionnalité de prise en charge automatique des langues par application est compatible avec les applications qui exécutent Android 13 (niveau d'API 33) ou version ultérieure. Pour utiliser cette fonctionnalité, vous devez définir compileSdkVersion sur 33 ou plus. Pour configurer les préférences linguistiques par appli pour les versions antérieures d'Android, vous devez toujours utiliser les API et les outils de sélection de langue intégrés à l'application.

Pour activer la prise en charge automatique des langues par application, spécifiez une langue par défaut:

  1. Dans le dossier res du module d'application, créez un fichier nommé resources.properties.
  2. Dans le fichier resources.properties, définissez les paramètres régionaux par défaut avec le libellé unqualifiedResLocale. Pour former les noms des paramètres régionaux, combinez le code de langue avec les codes de script et de région facultatifs, en les séparant par un tiret:

    Par exemple, si votre paramètre régional par défaut est l'anglais américain :

        unqualifiedResLocale=en-US
        

AGP ajoute ces paramètres régionaux par défaut et tous les autres paramètres régionaux que vous avez spécifiés, à l'aide des répertoires values-* du dossier res, au fichier LocaleConfig généré automatiquement.

La prise en charge automatique des langues par application est désactivée par défaut. Pour activer cette fonctionnalité, utilisez le paramètre generateLocaleConfig dans le bloc androidResources {} du fichier build.gradle.kts au niveau du module (fichier build.gradle si vous utilisez Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint contient du bytecode ciblant JVM 17

À partir d'AGP 8.1.0-alpha04, Android Lint contient du bytecode ciblant JVM 17. Si vous écrivez des vérifications lint personnalisées, vous devez compiler avec JDK 17 ou version ultérieure et spécifier jvmTarget = '17' dans les options du compilateur Kotlin.

Pour en savoir plus sur l'outil lint, consultez Améliorer votre code avec des vérifications lint.

Le paramètre de compression des bibliothèques natives a été déplacé vers le DSL

À partir de la version AGP 8.1.0-alpha10, vous recevrez un avertissement si vous ne configurez pas la compression de la bibliothèque native à l'aide du DSL au lieu du fichier manifeste. Les conseils suivants expliquent comment mettre à jour votre configuration pour utiliser le DSL. Pour obtenir de l'aide pour effectuer ces mises à jour, utilisez l'assistant de mise à niveau AGP (Tools > AGP Upgrade Assistant).

Pour utiliser des bibliothèques natives non compressées, supprimez l'attribut android::extractNativeLibs du fichier manifeste et ajoutez le code suivant au fichier build.gradle.kts au niveau du module (fichier build.gradle si vous utilisez Groovy):

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Options de compilation expérimentales

Il s'agit d'indicateurs expérimentaux permettant de configurer votre build dans AGP 8.1.

Signaler Ajouté dans Valeur par défaut Notes
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Si vous activez cette option sans spécifier de configuration de signature, AGP utilise la configuration de signature de débogage par défaut lors de l'exécution d'un build profilable ou débogable. Cet indicateur est désactivé par défaut pour encourager les auteurs de builds à déclarer des configurations de signature de profilage spécifiques.
android.experimental.library.desugarAndroidTest AGP 8.0 false Cet indicateur permet aux compilateurs de bibliothèques d'activer le désucrage de la bibliothèque principale pour les APK de test sans affecter l'AAR produit, par exemple via l'analyse lint. Nous prévoyons de proposer ce comportement dans l'API Variant à terme.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Si cette option est activée, Gradle Managed Devices permet d'utiliser un type d'appareil personnalisé défini par l'utilisateur, qui peut être fourni par un plug-in. Cet indicateur doit être activé si vous souhaitez utiliser le plug-in Firebase Test Lab.
android.lint.printStackTrace AGP 8.0 false Si elle est activée, Android Lint imprime une trace de la pile en cas de plantage. Cette option offre les mêmes fonctionnalités que la variable d'environnement LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Aucune Indique le nombre maximal d'appareils gérés Gradle (AVD) pouvant être actifs à un moment donné. Si la valeur est égale à 0 ou négative, il n'y a pas de nombre maximal d'appareils.
android.experimental.testOptions.installApkTimeout AGP 8.0 Aucune Durée du délai avant expiration (en secondes) pour installer un APK. Si la valeur est égale à 0 ou négative, elle sera définie sur une valeur par défaut par l'UTP.

Problèmes résolus

Plug-in Android Gradle 8.1.0

Problèmes résolus
Plug-in Android Gradle
Problèmes "com.android.build.gradle.tasks.ShaderCompile" avec le cache de configuration
L'ajout de ressources Java à l'aide d'API AGP entraîne un dysfonctionnement du cache de configuration
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so empaqueté dans l'APK
KGP lit le fichier manifeste lors de la configuration, ce qui invalide le cache de configuration en cas de modification du fichier manifeste
Message d'avertissement de compilation peu clair en cas de problème dans le manifeste fusionné
La mise à niveau vers AGP 7.4 génère une erreur StackOverflowError
Exception de type "classe introuvable" dans les fonctionnalités dynamiques qui dépendent directement du sous-projet de la bibliothèque Kotlin
processDebugUnitTestManifest échoue avec des espaces réservés de manifeste pour les variantes de test
processDebugUnitTestManifest échoue avec des espaces réservés de manifeste pour les variantes de test
La propriété d'espace de noms appartient probablement à HasAndroidResources
Impossible de désactiver le message "Gradle files have changed since last project sync" (Les fichiers Gradle ont changé depuis la dernière synchronisation du projet)
Nous vous recommandons d'utiliser un plug-in Android Gradle plus récent, le cas échéant
processDebugUnitTestManifest échoue avec des espaces réservés de manifeste pour les variantes de test
Indicateur booléen pour désactiver la vérification du SDK de compilation dans CheckAarMetadataTask
L'erreur de compilation fait référence au niveau d'API 34, qui n'existe pas
La définition de la chaîne d'outils JVM n'a aucune incidence sur la valeur "targetCompatibility" de JavaCompile
Les entrées deepLink de navigation comportant des domaines avec des caractères génériques n'ont pas d'attribut "android:host" dans le manifeste fusionné
Échec de la tâche processDebugMainManifest à partir du plug-in Android Gradle 8.1
Peut-on supprimer AnalyticsRecordingTask ?
Le contenu du fichier output-metadata.json n'est pas cohérent
Peut-on supprimer AnalyticsRecordingTask ?
Le contenu du fichier output-metadata.json n'est pas cohérent
La définition de la chaîne d'outils JVM n'a aucune incidence sur la valeur "targetCompatibility" de JavaCompile
Les entrées deepLink de navigation comportant des domaines avec des caractères génériques n'ont pas d'attribut "android:host" dans le manifeste fusionné
Échec de la tâche processDebugMainManifest à partir du plug-in Android Gradle 8.1
Android Studio ne respecte pas la variable d'environnement STUDIO_GRADLE_JDK
Les types de sources personnalisés devraient créer des ensembles de sources à plusieurs types de produits
DependenciesInfoBuilder a besoin d'une mise à jour et d'une documentation pour l'API
Échec de DexingNoClasspathTransform (minSdk >= 24) avec la cible Java 11 en raison de membres imbriqués manquants
DslExtension.Builder.extendProjectWith() ne fonctionne pas comme décrit en Groovy
Ajout de l'API VariantSelector.withFlavor qui n'utilise pas kotlin.Pair
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) présente un défaut de cache (miss), car "proguard.txt" a changé
Le manifeste fusionné de l'application contient les attributs extractNativeLibs et useEmbeddedDex des dépendances
AGP : exposer le chemin d'accès à l'outil AIDL et au fichier AIDL du framework en tant qu'API publique
Requête : laissez l'IDE proposer un correctif pour "PermittedSubclasses requires ASM9" (PermittedSubclasses nécessite ASM9)
Bug : l'option "Enable KSP and use the KSP processor for this dependency instead" (Activer KSP et utiliser le processeur KSP pour cette dépendance à la place) redirige simplement vers un site Web
Gradle 8.1 interrompt la mise en cache de la configuration en raison de .gradle/.android/analytics.settings
generateLocaleConfig dans agp 8.1.0 utilise un ordre non déterministe qui endommage les compilations reproductibles
Compilateur DEX (D8)
Le désucrage de la bibliothèque principale entraîne le plantage de l'application après les mises à jour récentes.
Régression d'agp 8.1.0 avec l'API 21 - F/dex2oat ( 4176) : art/compiler/driver/compiler_driver.cc:1181] Échec de la vérification : !method->IsAbstract()
Lint
Lint ne vérifie les diffusions sécurisées que pour les interfaces implémentées directement, pas pour les interfaces héritées
Lint ne vérifie pas les diffusions valides pour les destinataires d'appels
TypedArray#close (API 31) non désucré, mais AS n'affiche pas d'avertissement en cas d'utilisation avec try-with-resources
Bug : avertissement faux positif indiquant notamment que le fournisseur 'BC' est obsolète
Faux positif d'analyse lint sur la mémorisation après la mise à niveau de Kotlin vers la version 1.8.0
Avertissement de type faux positif lors de l'analyse lint pour les vérifications SDK_INT effectuées dans une méthode avec un paramètre enum
La vérification lint de TypographyCitations ne fonctionne pas sur les guillemets échappés
La vérification lint de TrustAllX509TrustManager signale par erreur les interfaces qui étendent X509TrustManager
Remise en forme du code inséré d'un correctif de remplacement
Lint : L'aperçu d'intent génère une exception pour ReplaceStringQuickFix
Réducteur de code (R8)
VerifyError : le vérificateur a rejeté la classe lors de l'utilisation de R8 avec Kotlin 1.8.20
R8 sur AGP 8 fait planter le service Google Fit
L'inclusion d'informations sur le fichier source avec des noms résiduels et des noms d'entrée qui se chevauchent n'est pas représentée correctement
R8 échoue lors de la compilation de Compose avec ArrayIndexOutOfBoundsException
L'appel de fin à ajouter en mode release ou debuggable=false est manquant dans le code simple associé à StringBuilder
Présence d'un corner case dans la méthode VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
Résultats dex-startup-optimization dans java.lang.VerifyError : rejet de la classe
Plantage d'une erreur de vérification sur Android 12 ou version ultérieure

Plug-in Android Gradle 8.1.1

Problèmes résolus
Compilateur DEX (D8)
Enregistrements Java 16: equals(null) génère une exception NullPointerException
Réducteur de code (R8)
java.lang.VerifyError : le vérificateur a rejeté la classe
Le build reste bloqué sur :minifyReleaseWithR8 lors de l'utilisation de la bibliothèque Apache POI
Refus de l'appel lorsque l'optimisation R8 est activée
NoClassDefFoundError pour java.lang.reflect.Executable

Plug-in Android Gradle 8.1.2

Problèmes résolus
Plug-in Android Gradle
androidResources n'est pas disponible dans le module de bibliothèque Android.
[AGP 8.1.0] Le test ./gradlew échoue avec le message "Unable to find manifest output" (Impossible de trouver la sortie du fichier manifeste) si les valeurs splits.abi.isEnable et testOptions.unitTests.isIncludeAndroidResources sont définies sur true.
Réducteur de code (R8)
Kotlin 1.9 entraîne la destruction des lambdas Kotlin par R8 si les vérifications de valeurs nulles sont supprimées
R8 échoue avec "Valeur non définie détectée lors de la compilation" pour play-services-measurement-21.3.0-runtime.jar

Plug-in Android Gradle 8.1.3

Problèmes résolus
Plug-in Android Gradle
[AGP 8.1.0] Le test ./gradlew échoue avec le message "Unable to find manifest output" (Impossible de trouver la sortie du fichier manifeste) si les valeurs splits.abi.isEnable et testOptions.unitTests.isIncludeAndroidResources sont définies sur true.
Échec de la compilation après la mise à jour vers AGP 8.1

Plug-in Android Gradle 8.1.4

Problèmes résolus
Plug-in Android Gradle
Ne pas exécuter de tâche dexing sur les classes de sous-projets lorsqu'elles sont déjà converties au format .dex via des transformations d'artefact