Le plug-in Android Gradle 9.0 est une version majeure qui apporte des modifications d'API et de comportement.
Pour passer à la version 9.0.1 du plug-in Android Gradle, utilisez l'assistant de mise à niveau du plug-in Android Gradle. L'assistant de mise à niveau AGP permet de préserver les comportements existants lors de la mise à niveau de votre projet, le cas échéant. Vous pouvez ainsi mettre à niveau votre projet pour utiliser AGP 9.0, même si vous n'êtes pas prêt à adopter toutes les nouvelles valeurs par défaut d'AGP 9.0.
Deux compétences d'agent sont également disponibles pour faciliter le processus de migration. Pour une application non KMP, essayez la compétence de mise à niveau AGP 9 du dépôt de compétences Android. Pour une application KMP, essayez la compétence de mise à niveau AGP 9 de JetBrains. Pour en savoir plus sur l'utilisation des compétences dans Android Studio, consultez Étendre le mode Agent avec des compétences.
Compatibilité
Le niveau d'API maximal compatible avec le plug-in Android Gradle 9.0 est le niveau d'API 36.1. Voici d'autres informations sur la compatibilité :
| Version minimale | Version par défaut | Notes | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Pour en savoir plus, consultez Mettre à jour Gradle. |
| Build Tools SDK | 36.0.0 | 36.0.0 | Installez ou configurez SDK Build Tools. |
| NDK | N/A | 28.2.13676358 | Installez ou configurez une autre version du NDK. |
| JDK | 17 | 17 | Pour en savoir plus, consultez Définir la version du JDK. |
| Plug-in Kotlin Gradle (KGP) | 2.2.10 | 2.2.10 | Pour en savoir plus, consultez Dépendance d'exécution du plug-in Gradle Kotlin. |
Les classes DSL android n'implémentent désormais que les nouvelles interfaces publiques.
Ces dernières années, nous avons introduit de nouvelles interfaces pour notre DSL et notre API afin de mieux contrôler les API publiques. Les versions 7.x et 8.x d'AGP utilisaient toujours les anciens types de DSL (par exemple, BaseExtension), qui implémentaient également les nouvelles interfaces publiques, afin de maintenir la compatibilité à mesure que les interfaces évoluaient.
AGP 9.0 utilise exclusivement nos nouvelles interfaces DSL, et les implémentations ont été remplacées par de nouveaux types entièrement masqués. Cela supprime également l'accès à l'ancienne API de variante obsolète.
Pour passer à AGP 9.0, vous devrez peut-être effectuer les opérations suivantes :
- Assurez-vous que votre projet est compatible avec Kotlin intégré : le plug-in
org.jetbrains.kotlin.androidn'est pas compatible avec le nouveau DSL. Passer les projets KMP au plug-in de bibliothèque Android Gradle pour KMP : l'utilisation du plug-in
org.jetbrains.kotlin.multiplatformdans le même sous-projet Gradle que les plug-inscom.android.libraryetcom.android.applicationn'est pas compatible avec le nouveau DSL.Mettez à jour vos fichiers de compilation : Bien que le changement d'interfaces vise à conserver un DSL aussi similaire que possible, il peut y avoir quelques petites modifications.
Mettez à jour votre logique de compilation personnalisée pour référencer le nouveau DSL et la nouvelle API : remplacez toutes les références au DSL interne par les interfaces DSL publiques. Dans la plupart des cas, il s'agira d'un remplacement un à un. Remplacez toute utilisation de
applicationVariantset d'API similaires par la nouvelle APIandroidComponents. Cela peut être plus complexe, car l'APIandroidComponentsest conçue pour être plus stable afin de maintenir la compatibilité des plug-ins plus longtemps. Pour obtenir des exemples, consultez nos recettes Gradle.Mettre à jour les plug-ins tiers : certains plug-ins tiers peuvent toujours dépendre d'interfaces ou d'API qui ne sont plus exposées. Migrez vers des versions de ces plug-ins compatibles avec AGP 9.0.
Le passage aux nouvelles interfaces DSL empêche les plug-ins et les scripts de compilation Gradle d'utiliser diverses API obsolètes, y compris :
API obsolète dans le bloc android |
Fonction | Remplacement |
|---|---|---|
applicationVariants,libraryVariants,testVariants etunitTestVariants
|
Points d'extension permettant aux plug-ins d'ajouter de nouvelles fonctionnalités à AGP. |
Remplacez-la par l'API androidComponents.onVariants, par exemple :
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Permet de désactiver les variantes sélectionnées. |
Remplacez-la par l'API androidComponents.beforeVariants, par exemple :
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider ettestServer
|
Enregistrement d'environnements de test personnalisés pour exécuter des tests sur des appareils et des émulateurs Android. | Passez aux appareils gérés par Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable etadbExe
|
Utiliser différents composants du SDK Android pour des tâches personnalisées. |
Passez à androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider etwrapJavaSourceSet |
Fonctionnalité obsolète principalement liée à la gestion des sources générées dans Android Studio, qui a cessé de fonctionner dans AGP 7.2.0. | Il n'existe pas de remplacement direct pour ces API. |
dexOptions
|
Paramètres obsolètes liés à l'outil dx, qui a été remplacé par d8. Aucun des paramètres n'a eu d'effet depuis le plug-in Android Gradle 7.0.
|
Il n'existe pas de remplacement direct. |
generatePureSplits
|
Générez des fichiers de configuration fractionnés pour les applications instantanées. | La possibilité d'envoyer des fichiers de configuration fractionnés est désormais intégrée aux Android App Bundles. |
aidlPackagedList
|
Fichiers AIDL à empaqueter dans l'AAR pour l'exposer en tant qu'API pour les bibliothèques et les applications qui dépendent de cette bibliothèque. |
Il est toujours exposé sur LibraryExtension, mais pas sur les autres types d'extensions.
|
Si vous passez à AGP 9.0 et que le message d'erreur suivant s'affiche, cela signifie que votre projet fait toujours référence à certains des anciens types :
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Si vous êtes bloqué par des plug-ins tiers incompatibles, vous pouvez désactiver l'option et récupérer les anciennes implémentations du DSL, ainsi que l'ancienne API de variante.
Pendant ce temps, les nouvelles interfaces sont également disponibles, et vous pouvez toujours mettre à jour votre propre logique de compilation vers la nouvelle API. Pour désactiver cette option, incluez cette ligne dans votre fichier gradle.properties :
android.newDsl=false
Pour une migration plus progressive, AGP 9.4 vous permet de désactiver des modules individuels. Pour savoir comment procéder, consultez Désactivation du module de l'API Variant.
Les classes précédentes sont marquées comme obsolètes dans l'AGP 9.0. Cela signifie que les projets qui désactivent l'option newDsl verront des avertissements d'abandon, y compris sur le bloc android lui-même.
Vous pouvez également commencer à passer aux nouvelles API avant de passer à AGP 9.0. Les nouvelles interfaces sont présentes dans de nombreuses versions d'AGP. Vous pouvez donc avoir un mélange d'anciennes et de nouvelles interfaces. La documentation de référence de l'API AGP présente la surface de l'API pour chaque version d'AGP, ainsi que la date d'ajout de chaque classe, méthode et champ.
Nous contactons les auteurs des plug-ins couramment utilisés pour les aider à adapter et à publier des plug-ins entièrement compatibles avec les nouveaux modes. Nous continuerons également à améliorer l'assistant de mise à niveau AGP dans Android Studio pour vous guider tout au long de la migration.
Si vous constatez que le nouveau DSL ou la nouvelle API Variant ne disposent pas de certaines fonctionnalités, veuillez signaler un problème dès que possible.
Kotlin intégré
Le plug-in Android Gradle 9.0 introduit la compatibilité intégrée avec Kotlin et l'active par défaut. Cela signifie que vous n'avez plus besoin d'appliquer le plug-in org.jetbrains.kotlin.android (ou kotlin-android) dans vos fichiers de compilation pour compiler les fichiers sources Kotlin.
Cela simplifie l'intégration de Kotlin à AGP, évite l'utilisation d'API obsolètes et améliore les performances dans certains cas.
Par conséquent, lorsque vous mettez à niveau votre projet vers AGP 9.0, vous devez également migrer vers Kotlin intégré ou désactiver cette option.
Vous pouvez également désactiver de manière sélective la compatibilité intégrée avec Kotlin pour les sous-projets Gradle qui n'ont pas de sources Kotlin.
Dépendance d'exécution au plug-in Gradle Kotlin
Pour fournir une compatibilité Kotlin intégrée, le plug-in Android Gradle 9.0 dépend désormais de l'environnement d'exécution du plug-in Kotlin Gradle (KGP) 2.2.10. Cela signifie que vous n'avez plus besoin de déclarer une version de KGP. Si vous utilisez une version de KGP antérieure à la version 2.2.10, Gradle mettra automatiquement à niveau votre version de KGP vers la version 2.2.10. De même, si vous utilisez une version de KSP antérieure à la version 2.2.10-2.0.2, AGP la mettra à niveau vers la version 2.2.10-2.0.2 pour qu'elle corresponde à la version de KGP.
Passer à une version supérieure du KGP
Pour utiliser une version plus récente de KGP ou KSP, ajoutez ce qui suit à votre fichier de compilation de premier niveau :
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Passer à une version antérieure du KGP
Vous ne pouvez passer à une version antérieure du KGP que si vous avez désactivé Kotlin intégré. En effet, AGP 9.0 active Kotlin intégré par défaut, et Kotlin intégré nécessite KGP 2.2.10 ou version ultérieure.
Pour utiliser une version antérieure de KGP ou de KSP, déclarez cette version dans votre fichier de compilation de premier niveau à l'aide d'une déclaration de version stricte :
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Notez que la version minimale du KGP vers laquelle vous pouvez revenir est la version 2.0.0.
Compatibilité de l'IDE avec les outils de test
AGP 9.0 est entièrement compatible avec l'IDE Android Studio pour les outils de test.
Plug-in de bibliothèque fusionnée
Le plug-in Fused Library (preview) vous permet de publier plusieurs bibliothèques sous la forme d'un seul fichier AAR de bibliothèque Android. Cela peut permettre à vos utilisateurs de dépendre plus facilement de vos artefacts publiés.
Pour en savoir plus sur les premiers pas, consultez Publier plusieurs bibliothèques Android en une seule avec Fused Library.
Changements de comportement
Le plug-in Android Gradle 9.0 présente les nouveaux comportements suivants :
| Comportement | Recommandation |
|---|---|
Le plug-in Android Gradle 9.0 utilise la version r28c du NDK par défaut.
|
Envisagez de spécifier explicitement la version du NDK que vous souhaitez utiliser. |
| Par défaut, le plug-in Android Gradle 9.0 exige que les utilisateurs d'une bibliothèque utilisent une version du SDK de compilation identique ou supérieure. |
Utilisez un SDK de compilation identique ou supérieur lorsque vous utilisez une bibliothèque.
Si ce n'est pas possible ou si vous souhaitez donner plus de temps aux utilisateurs d'une bibliothèque que vous publiez pour effectuer la transition, définissez explicitement AarMetadata.minCompileSdk.
|
AGP 9.0 inclut des mises à jour des valeurs par défaut des propriétés Gradle suivantes. Vous pouvez ainsi choisir de conserver le comportement d'AGP 8.13 lors de la mise à niveau :
| Propriété | Fonction | Passage d'AGP 8.13 à AGP 9.0 | Recommandation |
|---|---|---|---|
android. |
Utilisez les nouvelles interfaces DSL, sans exposer les anciennes implémentations du bloc android.Cela signifie également que l'ancienne API de variante, telle que android.applicationVariants, n'est plus accessible.
|
false → true |
Vous pouvez désactiver cette option en définissant android.newDsl=false.Une fois que tous les plug-ins et la logique de compilation utilisés par votre projet sont compatibles, supprimez l'option de désactivation. |
android. |
Active le Kotlin intégré. | false → true |
Migrez vers Kotlin intégré si possible ou désactivez l'option. |
android. |
Impose que chaque bibliothèque ait un nom de package distinct. | false → true |
Spécifiez des noms de package uniques pour toutes les bibliothèques de votre projet. Si ce n'est pas possible, vous pouvez désactiver cette option pendant la migration. |
android. |
Utilisez les dépendances androidx par défaut.
|
false → true |
Adoptez les dépendances androidx.
|
android. |
Exécutez des tests sur l'appareil avec la classe androidx.test.runner.AndroidJUnitRunner par défaut, en remplaçant la classe InstrumentationTestRunner obsolète par défaut pour
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Adoptez AndroidJUnitRunner ou spécifiez explicitement votre testInstrumentationRunner personnalisé.
|
android. |
Contrôle l'utilisation des contraintes de dépendance entre les configurations. La valeur par défaut dans AGP 9.0 est false, qui n'utilise des contraintes que dans les tests d'appareil d'application (AndroidTest).
Si vous définissez cette option sur true, le comportement de la version 8.13 sera rétabli.
|
true → false |
N'utilisez pas de contraintes de dépendance partout, sauf si vous en avez besoin. En acceptant la nouvelle valeur par défaut de cet indicateur, vous activez également les optimisations du processus d'importation du projet, ce qui devrait réduire le temps d'importation des builds comportant de nombreux sous-projets de bibliothèque Android. |
android. |
Compilez le code dans les applications par rapport à une classe R non finale, en alignant la compilation de l'application sur celle de la bibliothèque. Cela améliore l'incrémentalité et ouvre la voie à de futures optimisations des performances du flux de traitement des ressources. |
false → true |
De nombreux projets peuvent simplement adopter le nouveau comportement sans modifier la source. Si les champs de la classe R sont utilisés dans un emplacement nécessitant une constante, comme les instructions switch, refactorisez-les pour utiliser des instructions if enchaînées. |
android. |
Utilise la version du SDK de compilation comme valeur par défaut pour la version du SDK cible dans les applications et les tests. Avant cette modification, la version du SDK cible était définie par défaut sur la version minimale du SDK. |
false → true |
Spécifiez explicitement la version du SDK cible pour les applications et les tests. |
android. |
Crée uniquement des composants de test unitaire pour le type de compilation testé. Dans le projet par défaut, cela entraîne un seul test unitaire pour le débogage, alors que le comportement précédent consistait à exécuter des tests unitaires pour le débogage ou la version. |
false → true |
Si votre projet ne nécessite pas l'exécution de tests pour le débogage et la publication, aucune modification n'est requise. |
android. |
Échoue la compilation avec une erreur si l'un des fichiers de conservation spécifiés dans le DSL AGP n'existe pas sur le disque. Avant cette modification, les fautes de frappe dans les noms de fichiers entraînaient l'ignorance silencieuse des fichiers. | false → true |
Supprimez toutes les déclarations de fichiers ProGuard non valides. |
android. |
Permet à R8 de conserver moins de ressources Android en considérant les classes et les ressources Android ensemble. | false → true |
Si les règles de conservation de votre projet sont déjà complètes, aucune modification n'est requise. |
android. |
Permet à R8 de conserver moins d'éléments en ne conservant pas implicitement le constructeur par défaut lorsqu'une classe est conservée.
Autrement dit, -keep class A n'implique plus -keep class A { <init>(); }. |
false → true |
Si les règles de conservation de votre projet sont déjà complètes, aucune modification n'est requise.
Remplacez -keep class A par -keep class A { <init>(); } dans les règles de conservation de votre projet lorsque vous devez conserver le constructeur par défaut.
|
android. |
Active resValues dans tous les sous-projets.
|
true → false |
Activez resValues uniquement dans les sous-projets qui en ont besoin en définissant les éléments suivants dans les fichiers de compilation Gradle de ces projets :
android {
buildFeatures {
resValues = true
}
} |
android. |
Active la compilation du nuanceur dans tous les sous-projets. | true → false |
Activez la compilation des nuanceurs uniquement dans les sous-projets contenant des nuanceurs à compiler en définissant les éléments suivants dans les fichiers de compilation Gradle de ces projets :
android {
buildFeatures {
shaders = true
}
} |
android. |
Dans AGP 9.0, getDefaultProguardFile() n'acceptera que proguard-android-optimize.txt au lieu de proguard-android.txt. Cela permet d'éviter l'utilisation accidentelle de l'option dontoptimize, qui est incluse dans proguard-android.txt.
|
false → true |
Vous pouvez spécifier explicitement dontoptimize dans un fichier proguardFile personnalisé si vous souhaitez éviter l'optimisation, tout en utilisant proguard-android-optimize.txt. Si possible, veillez à supprimer l'option dontoptimize de ce fichier, car elle réduit les avantages de l'optimisation R8. Sinon, désactivez-la en définissant android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
À partir d'AGP 9.0, la publication de bibliothèques Android et de modules de fonctionnalités échouera si les fichiers de conservation des consommateurs contiennent des configurations Proguard problématiques. Les fichiers de conservation Consumer qui incluent des options globales telles que dontoptimize ou dontobfuscate ne doivent être utilisés que dans les modules d'application et peuvent réduire les avantages de l'optimisation pour les utilisateurs de la bibliothèque. La compilation du module d'application Android ignorera silencieusement ces options globales si elles sont intégrées dans une dépendance précompilée (JAR ou AAR). Pour savoir quand cela se produit, recherchez des commentaires tels que # REMOVED CONSUMER RULE: dontoptimize dans le fichier configuration.txt (généralement situé dans un chemin d'accès comme <app_module>/build/outputs/mapping/<build_variant>/configuration.txt).
|
false → true |
Les bibliothèques publiées doivent supprimer toutes les règles incompatibles. Les bibliothèques internes doivent déplacer toutes les règles incompatibles mais requises vers un fichier proguardFile dans un module d'application. Désactivez cette option en définissant android.r8.globalOptionsInConsumerRules.disallowed=false. Une fois que tous vos fichiers Keep personnels sont compatibles, supprimez l'option de désactivation.
|
android. |
Interdire la transmission de fournisseurs pour les sources générées à l'aide du DSL AndroidSourceSet.
|
false → true |
Utilisez l'API Sources sur androidComponents pour enregistrer les sources générées.
|
android. |
Nécessite que le chemin d'accès au compilateur de nuanceurs soit explicitement défini dans local.properties si la compilation de nuanceurs est activée.
|
false → true |
Ajoutez glslc.dir=/path/to/shader-tools au fichier local.properties de votre projet.
|
Fonctionnalités supprimées
Le plug-in Android Gradle 9.0 supprime les fonctionnalités suivantes :
- Compatibilité avec les applications Wear OS intégrées
AGP 9.0 supprime la compatibilité avec l'intégration d'applications Wear OS, qui n'est plus compatible avec Play. Cela inclut la suppression des configurationswearAppet du DSLAndroidSourceSet.wearAppConfigurationName. Pour savoir comment publier votre application sur Wear OS, consultez Distribuer votre application sur Wear OS. - Tâche de rapport
androidDependenciesetsourceSets - Prise en charge des APK divisés par densité
AGP 9.0 ne permet plus de créer des APK divisés en fonction de la densité de l'écran. La fonctionnalité et les API associées ont été supprimées. Pour diviser les APK en fonction de la densité de l'écran à l'aide d'AGP 9.0 ou version ultérieure, utilisez des app bundles.
DSL modifié
Le plug-in Android Gradle 9.0 comporte les modifications destructives suivantes du DSL :
La paramétrisation de
CommonExtensiona été supprimée.En soi, il s'agit d'une modification destructive au niveau de la source pour éviter d'autres modifications destructives au niveau de la source à l'avenir. Cela signifie également que les méthodes de bloc doivent passer de
CommonExtensionàApplicationExtension,LibraryExtension,DynamicFeatureExtensionetTestExtension.Lorsque vous mettez à niveau votre projet vers AGP 9.0, refactorisez le code du plug-in Gradle qui utilise ces paramètres ou les méthodes de bloc. Par exemple, le plug-in suivant est mis à jour pour supprimer le paramètre de type et ne pas s'appuyer sur les méthodes de bloc supprimées :
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Pour les plug-ins qui ciblent une plage de versions d'AGP, l'utilisation directe du getter est compatible au niveau binaire avec les versions d'AGP antérieures à la version 9.0.
DSL supprimé
Le plug-in Android Gradle 9.0 supprime les éléments suivants :
AndroidSourceSet.jni, car elle ne fonctionnait pas.AndroidSourceSet.wearAppConfigurationName, car elle est liée à la suppression de la compatibilité avec les applications Wear OS intégrées.BuildType.isRenderscriptDebuggable, car elle ne fonctionnait pas.DependencyVariantSelection. Il est remplacé parDependencySelection, qui est exposé en tant quekotlin.android.localDependencySelection.Installation.installOptions(String). Elle est remplacée par la propriété modifiable deInstallation.installOptions.Le bloc
PostProcessingexpérimental, mais jamais stabilisé.ProductFlavor.setDimension, qui est remplacé par la propriétédimensionLanguageSplitOptions, qui n'était utile que pour Google Play Instant, qui est obsolète.DensitySplit, car la fonctionnalité n'est plus disponible. La solution de remplacement consiste à utiliser des app bundles.
API supprimées
Le plug-in Android Gradle 9.0 supprime les éléments suivants :
AndroidComponentsExtension.finalizeDSl. Il est remplacé parfinalizeDsl.Component.transformClassesWith. Il est remplacé parInstrumentation.transformClassesWith.Component.setAsmFramesComputationMode. Il est remplacé parInstrumentation.setAsmFramesComputationMode.ComponentBuilder.enabled. Il est remplacé parComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Il est remplacé parincludeInApk.DependenciesInfoBuilder.includedInBundle. Il est remplacé parincludeInBundle.GeneratesApk.targetSdkVersion: remplacé partargetSdk.Variant.minSdkVersion. Il est remplacé parminSdk.Variant.maxSdkVersion: remplacé parmaxSdk.Variant.targetSdkVersion. Il est remplacé partargetSdk.Variant.unitTest, car elle n'était pas applicable au plug-incom.android.test.unitTestest disponible sur les sous-typesVariantBuilderétendantHasUnitTest.VariantBuilder.targetSdkettargetSdkPreview, car ils n'étaient pas pertinents dans les bibliothèques. Utilisez plutôtGeneratesApkBuilder.targetSdkouGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, car elle n'était pas applicable au plug-incom.android.test.enableUnitTestest disponible sur les sous-typesVariantBuilderqui étendentHasUnitTestBuilder.VariantBuilder.unitTestEnabledest supprimé au profit deenableUnitTest, dont le nom est plus cohérent, sur les sous-typesVariantBuilderqui étendentHasUnitTestBuilder.VariantOutput.enable. Il est remplacé parenabled.Les éléments
FeaturePluginetFeatureExtensionobsolètes et désactivés.Les API
BaseExtension.registerTransformobsolètes et désactivées, qui n'étaient conservées que pour permettre la compilation avec la dernière version d'AGP tout en ciblant l'exécution sur AGP 4.2 ou version antérieure.
Propriétés Gradle supprimées
Les propriétés Gradle suivantes ont été initialement ajoutées pour désactiver globalement les fonctionnalités activées par défaut.
Ces fonctionnalités sont désactivées par défaut depuis AGP 8.0 ou version antérieure. Activez ces fonctionnalités uniquement dans les sous-projets qui les utilisent pour une compilation plus efficace.
| Propriété | Fonction | Remplacement |
|---|---|---|
android. |
Active la compilation AIDL dans tous les sous-projets. |
Activez la compilation AIDL uniquement dans les sous-projets contenant des sources AIDL en définissant la propriété suivante dans les fichiers de compilation Gradle de ces projets :
android {
buildFeatures {
aidl = true
}
} |
android. |
Active la compilation RenderScript dans tous les sous-projets. |
Activez la compilation Renderscript uniquement dans les sous-projets contenant des sources Renderscript en définissant la propriété suivante dans les fichiers de compilation Gradle de ces projets :
android {
buildFeatures {
renderScript = true
}
} |
Propriétés Gradle appliquées
AGP 9.0 génère une erreur si vous définissez les propriétés Gradle suivantes.
L'assistant de mise à niveau du plug-in Android Gradle ne mettra pas à niveau vers AGP 9.0 les projets qui utilisent ces propriétés.
| Propriété | Fonction |
|---|---|
android. |
La réduction des ressources est désormais toujours exécutée dans le cadre de R8. L'implémentation précédente a été supprimée. |
android. |
La réduction des ressources utilise désormais toujours une réduction précise des ressources, ce qui permet d'en supprimer davantage. |
Modifications de R8
Les modifications suivantes de R8 sont incluses dans AGP 9.0.0.
Nouvelle option de configuration -processkotlinnullchecks
Nous avons ajouté la nouvelle option R8 -processkotlinnullchecks pour configurer R8 afin de traiter les vérifications de valeurs nulles Kotlin. L'option accepte un argument obligatoire qui doit correspondre à l'une des trois valeurs suivantes : keep, remove_message et remove.
L'option traite les vérifications de valeurs nulles suivantes ajoutées par le compilateur Kotlin :
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Les valeurs d'option, classées de la plus faible à la plus forte, ont l'effet suivant :
keepne modifie pas les vérifications.remove_messageréécrit chaque appel de méthode de vérification en un appel àgetClass()sur le premier argument de l'appel (en conservant la vérification de la valeur nulle, mais sans message).removesupprime complètement les vérifications.
Par défaut, R8 utilise remove_message. Toute spécification de -processkotlinnullchecks remplacera cette valeur. Si elle est spécifiée plusieurs fois, la valeur la plus forte est utilisée.
Arrêter de propager les informations de conservation aux méthodes associées
Lorsque les règles de conservation correspondaient à des méthodes d'interface soumises à la désucration, R8 transférait auparavant en interne les bits interdire l'optimisation et interdire la minification aux méthodes complémentaires synthétisées.
À partir d'AGP 9.0, les règles de conservation ne s'appliquent plus aux méthodes associées. Cela est cohérent avec le fait que les règles de conservation ne s'appliquent pas aux autres champs/méthodes/classes synthétisés par le compilateur.
En transférant les bits disallow optimization et disallow shrinking vers les méthodes associées, le cas d'utilisation suivant était auparavant accepté :
- Compilez une bibliothèque avec des méthodes d'interface
default/static/privatevers DEX avecminSdk< 24 et des règles qui conservent les méthodes d'interface. - Compilez une application avec la bibliothèque sur le chemin de classe et
-applymapping. - Fusionnez l'application et la bibliothèque.
Notez que cela ne fonctionne qu'avec -applymapping, car le bit disallow
obfuscation n'est pas transféré aux méthodes associées. Autrement dit, les classes associées générées à l'étape 1 auraient des noms de méthode obscurcis.
À l'avenir, ce cas d'utilisation ne sera plus pris en charge pour minSdk < 24. Pour contourner ce problème, procédez comme suit :
- Désucrez la bibliothèque avec les méthodes d'interface
default/static/privatepour classer les fichiers avecminSdk< 24. - Compilez l'artefact désucré à l'aide de R8 et des règles qui conservent les méthodes d'interface sur les classes associées.
- Compilez l'application avec la bibliothèque sur le chemin de classe.
- Fusionnez l'application et l'artefact désucré.
Autre effet secondaire : il n'est plus possible de conserver les attributs de classe interne et de méthode englobante pour les classes anonymes et locales dans les méthodes d'interface associées.
Remplacez le fichier source d'émission par défaut par r8-map-id-<MAP_ID>.
Cette modification est disponible dans AGP à partir de la version 8.12.0.
L'attribut de fichier source émis par défaut pour une classe passe de SourceFile à r8-map-id-<MAP_ID> lorsqu'un retraçage est requis (c'est-à-dire lorsque l'obscurcissement ou l'optimisation est activé).
À partir d'une trace de la pile obscurcie, le nouvel attribut de fichier source permet d'extraire l'ID du fichier de mappage requis pour le retraçage, qui peut être utilisé pour permettre le retraçage automatisé des traces de la pile dans Logcat.
Si un attribut de fichier source personnalisé est utilisé (-renamesourcefileattribute), il continue d'avoir la priorité.
En mode de compatibilité ProGuard (lorsque gradle.properties contient android.enableR8.fullMode=false), l'émission d'un attribut de fichier source de r8-map-id-<MAP_ID> ne prend effet que si l'attribut SourceFile n'est pas conservé. Les applications qui utilisent le mode de compatibilité ProGuard et souhaitent inclure l'ID du fichier de mappage dans leurs traces de la pile doivent supprimer -keepattributes SourceFile (ou migrer vers le mode complet R8).
L'ID de carte utilisé dans r8-map-id-<MAP_ID> est le hachage complet de la carte, et non un préfixe de sept caractères du hachage de la carte, qui était utilisé auparavant.
Activer l'utilisation de noms synthétiques minimisés dans le désucrage L8
Le nom des classes synthétiques générées par D8 contient normalement la sous-chaîne $$ExternalSynthetic, qui vous indique qu'il s'agit d'un élément synthétique généré par D8.
De plus, le nom de l'élément synthétique encode également le type synthétique (par exemple, Backport, Lambda). Cela a un impact négatif sur la taille du fichier DEX obtenu, car les noms de classe occupent plus d'espace dans le pool de chaînes.
AGP 9.0 configure L8 (désucrage de la bibliothèque principale) de sorte que le fichier DEX contenant toutes les classes j$ utilise un nouveau format de nom de classe raccourci pour les classes synthétiques. Le nouveau nom de la classe utilise un ID numérique (par exemple, $1).
Supprimer la compatibilité avec -addconfigurationdebugging
AGP 9.0 ne prend plus en charge -addconfigurationdebugging. Le compilateur affiche désormais un avertissement si l'option est utilisée.
Suppression de la prise en charge de la génération de règles L8 à partir de D8/R8
Cette modification ne concerne que les développeurs qui utilisent directement la ligne de commande ou les API D8/R8.
R8 9.0 ne permet plus de générer des règles de conservation pour L8 à partir de D8 et R8.
Utilisez plutôt TraceReferences à cette fin.
Plus précisément, les méthodes D8Command.builder.setDesugaredLibraryKeepRuleConsumer et R8Command.Builder.setDesugaredLibraryKeepRuleConsumer sont supprimées, et la compatibilité avec --desugared-lib-pg-conf-output est supprimée des options de ligne de commande de D8 et R8.
Problèmes résolus
Plug-in Android Gradle 9.0.0
| Problèmes résolus | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Plug-in Android Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Intégration de Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Réducteur de code (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||