Plug-in Android Gradle 3.6.0 (février 2020)

Cette version du plug-in d'Android nécessite les éléments suivants :

Nouvelles fonctionnalités

Cette version du plug-in d'Android Gradle inclut les nouvelles fonctionnalités suivantes.

Liaison de vue

La liaison de vue offre une sécurité au moment de la compilation lorsque vous référencez des vues dans votre code. Vous pouvez maintenant remplacer findViewById() par la référence de la classe de liaison générée automatiquement. Pour commencer à utiliser la liaison de vue, incluez les éléments suivants dans le fichier build.gradle de chaque module :

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Pour en savoir plus, consultez les documents sur la liaison de vue.

Prise en charge du plug-in Maven Publish

Le plug-in Android Gradle est compatible avec le plug-in Gradle Maven Publish qui vous permet de publier des artefacts de compilation dans un dépôt Maven Apache. Le plug-in Android Gradle crée un composant pour chaque artefact de variante de compilation dans votre module d'application ou de bibliothèque, que vous pouvez utiliser pour personnaliser une publication dans un dépôt Maven.

Pour en savoir plus, consultez la page décrivant l'utilisation du plug-in Maven Publish.

Nouvel outil de packaging par défaut

Lors de la création de la version de débogage de votre application, le plug-in utilise un nouvel outil de packaging, appelé zipflinger, pour compiler votre APK. Ce nouvel outil devrait permettre d'améliorer la vitesse de compilation. Si le nouvel outil de packaging ne fonctionne pas comme prévu, veuillez signaler un bug. Vous pouvez revenir à l'ancien outil de packaging en incluant ce qui suit dans votre fichier gradle.properties :

        android.useNewApkCreator=false
      

Attribution de build natif

Vous pouvez maintenant déterminer le temps nécessaire à Clang pour compiler et lier chaque fichier C/C++ dans votre projet. Gradle peut générer une trace Chrome contenant des codes temporels pour ces événements de compilation afin que vous puissiez mieux comprendre le temps nécessaire pour compiler votre projet. Pour générer ce fichier d'attribution de build, procédez comme suit :

  1. Ajoutez l'indicateur -Pandroid.enableProfileJson=true lors de l'exécution d'un build Gradle. Par exemple :

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Ouvrez le navigateur Chrome et saisissez chrome://tracing dans la barre de recherche.

  3. Cliquez sur le bouton Load (Charger) et accédez à <var>project-root</var>/build/android-profile pour trouver le fichier. Le fichier se nomme profile-<var>timestamp</var>.json.gz.

Les données d'attribution du build natif s'affichent en haut de la visionneuse :

Trace d&#39;attribution de build natif dans Chrome

Changements de comportement

Si vous utilisez cette version du plug-in, vous pouvez observer les changements de comportement suivants.

Bibliothèques natives empaquetées non compressées par défaut

Lorsque vous compilez votre application, le plug-in définit maintenant extractNativeLibs sur "false" par défaut. Autrement dit, vos bibliothèques natives sont alignées sur la page et empaquetées sans être compressées. Bien que la taille d'importation soit plus importante, vos utilisateurs profiteront des avantages suivants :

  • Taille d'installation de l'application réduite, car la plate-forme peut accéder directement aux bibliothèques natives à partir de l'APK installé, sans créer de copie des bibliothèques.
  • Taille de téléchargement réduite, car la compression du Play Store est généralement préférable lorsque vous incluez des bibliothèques natives non compressées dans votre APK ou votre Android App Bundle.

Si vous souhaitez que le plug-in Android Gradle empaquette à la place les bibliothèques natives compressées, incluez ce qui suit dans le fichier manifeste de votre application :

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Remarque : L'attribut de fichier manifeste extractNativeLibs a été remplacé par l'option DSL useLegacyPackaging. Pour en savoir plus, consultez la note de version sur l'utilisation du langage DSL pour empaqueter des bibliothèques natives compressées.

Version par défaut de NDK

Si vous téléchargez plusieurs versions de NDK, le plug-in Android Gradle sélectionne désormais une version par défaut à utiliser pour compiler vos fichiers de code source. Auparavant, le plug-in sélectionnait la dernière version téléchargée de NDK. Utilisez la propriété android.ndkVersion dans le fichier build.gradle du module pour remplacer la valeur par défaut sélectionnée par le plug-in.

Génération de classe R simplifiée

Le plug-in Android Gradle simplifie le classpath de compilation en générant une seule classe R pour chaque module de bibliothèque de votre projet et en partageant ces classes R avec d'autres dépendances de module. Cette optimisation devrait permettre d'accélérer les compilations. Vous devez toutefois tenir compte des éléments suivants :

  • Étant donné que le compilateur partage les classes R avec les dépendances de module en amont, il est important que chaque module de votre projet utilise un nom de package unique.
  • La visibilité de la classe R d'une bibliothèque par rapport aux autres dépendances du projet est déterminée par la configuration utilisée pour inclure la bibliothèque en tant que dépendance. Par exemple, si la bibliothèque A inclut la bibliothèque B en tant que dépendance "API", la bibliothèque A et les autres bibliothèques qui en dépendent ont accès à la classe R de la bibliothèque B. Toutefois, il est possible que d'autres bibliothèques n'aient pas accès à la classe R de la bibliothèque B. si la bibliothèque A utilise la configuration de dépendance implementation. Pour en savoir plus, consultez Configurations de dépendance.

Supprimer les ressources manquantes de la configuration par défaut

Pour les modules de bibliothèque, si vous incluez une ressource pour un langage que vous n'incluez pas dans l'ensemble de ressources par défaut (par exemple si vous incluez hello_world en tant que ressource de chaîne dans /values-es/strings.xml, mais que vous ne définissez pas cette ressource dans /values/strings.xml), le plug-in Android Gradle n'inclut plus cette ressource lors de la compilation de votre projet. Ce changement de comportement devrait réduire le nombre d'exceptions d'exécution Resource Not Found et accélérer la compilation.

D8 respecte désormais les règles de conservation CLASS pour les annotations

Lors de la compilation de votre application, D8 respecte désormais les règles de conservation CLASS et ces annotations ne sont plus disponibles au moment de l'exécution. Il s'agit également du comportement qui est observé lors de la définition du SDK cible de l'application sur le niveau d'API 23, ce qui permettait auparavant d'accéder à ces annotations au moment de l'exécution, lors de la compilation de votre application à l'aide d'anciennes versions du plug-in Android Gradle et de D8.

Autres changements de comportement

  • aaptOptions.noCompress n'est plus sensible à la casse sur toutes les plates-formes (tant pour les APK que pour les bundles) et accepte les chemins avec des majuscules.
  • La liaison de données est désormais incrémentielle par défaut. Pour en savoir plus, consultez le problème 126775542.

  • Tous les tests unitaires, y compris les tests unitaires RoboElectric, peuvent désormais être mis entièrement en cache. Pour en savoir plus, consultez le problème 126775542.

Correction de bugs

Cette version du plug-in Android Gradle inclut les corrections de bugs suivantes :

  • Les tests unitaires RoboElectric sont désormais pris en charge dans les modules de bibliothèque qui utilisent la liaison de données. Pour en savoir plus, consultez le problème 126775542.
  • Vous pouvez désormais exécuter des tâches connectedAndroidTest sur plusieurs modules lorsque le mode d'exécution parallèle de Gradle est activé.

Problèmes connus

Cette section décrit les problèmes connus du plug-in Android Gradle version 3.6.0.

Performances des tâches Android Lint ralenties

Android Lint peut prendre beaucoup plus de temps pour achever certains projets en raison d'une régression dans son infrastructure d'analyse, ce qui ralentit les calculs des types déduits pour les lambdas dans certaines constructions de code.

Le problème est signalé comme bug dans IDEA et sera corrigé dans le plug-in Android Gradle version 4.0.

Classe Manifest manquante {:#agp-missing-manifest}

En général, si votre application définit des autorisations personnalisées dans son fichier manifeste, le plug-in Android Gradle génère une classe Manifest.java qui inclut vos autorisations personnalisées en tant que constantes de chaîne. Le plug-in empaquette cette classe dans votre application, ce qui vous permet de référencer plus facilement ces autorisations au moment de l'exécution.

La génération de la classe Manifest ne fonctionne pas dans la version 3.6.0 du plug-in Android Gradle. Si vous compilez votre application avec cette version du plug-in et qu'elle fait référence à la classe Manifest, vous pouvez voir une exception ClassNotFoundException. Pour résoudre ce problème, effectuez l'une des opérations suivantes :

  • Référencez vos autorisations personnalisées par leur nom complet. Exemple : "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Définissez vos propres constantes, comme indiqué ci-dessous :

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }