Android Gradle-Plug-in 3.6.0 (Februar 2020)

Für diese Version des Android-Plug-ins ist Folgendes erforderlich:

Neue Funktionen

Diese Version des Android-Gradle-Plug-ins enthält die folgenden neuen Funktionen.

Bindung ansehen

Eine Ansichtsbindung bietet Sicherheit bei der Kompilierungszeit, wenn in Ihrem Code auf Ansichten verwiesen wird. Sie können jetzt findViewById() durch die automatisch generierte Bindungsklassenreferenz ersetzen. Fügen Sie der Datei build.gradle jedes Moduls Folgendes hinzu, um mit der Ansichtsbindung zu beginnen:

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

Weitere Informationen finden Sie in der Dokumentation zur Ansichtsbindung.

Unterstützung für das Maven Publish-Plug-in

Das Android-Gradle-Plug-in unterstützt das Maven Publish Gradle-Plug-in, mit dem Sie Build-Artefakte in einem Apache Maven-Repository veröffentlichen können. Das Android-Gradle-Plug-in erstellt eine Komponente für jedes Build-Variantenartefakt in Ihrer App oder Ihrem Bibliotheksmodul. Damit können Sie eine Publikation für ein Maven-Repository anpassen.

Weitere Informationen findest du auf der Seite zur Verwendung des Maven Publish-Plug-ins.

Neues Standardtool für die Paketerstellung

Beim Erstellen der Debug-Version Ihrer App verwendet das Plug-in ein neues Paketerstellungstool namens zipflinger, um Ihr APK zu erstellen. Dieses neue Tool sollte die Build-Geschwindigkeit verbessern. Wenn das neue Paketerstellungstool nicht wie erwartet funktioniert, melde den Fehler. Du kannst zum alten Paketerstellungstool zurückkehren. Füge dazu Folgendes in die Datei gradle.properties ein:

        android.useNewApkCreator=false
      

Attribution für native Builds

Sie können jetzt bestimmen, wie lange Clang zum Erstellen und Verknüpfen der einzelnen C-/C++-Dateien in Ihrem Projekt benötigt. Gradle kann ein Chrome-Trace ausgeben, das Zeitstempel für diese Compiler-Ereignisse enthält, damit Sie die für die Erstellung Ihres Projekts erforderliche Zeit besser nachvollziehen können. So geben Sie diese Build-Attributionsdatei aus:

  1. Fügen Sie das Flag -Pandroid.enableProfileJson=true hinzu, wenn Sie einen Gradle-Build ausführen. Beispiele:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Öffnen Sie den Chrome-Browser und geben Sie chrome://tracing in die Suchleiste ein.

  3. Klicken Sie auf die Schaltfläche Load (Laden) und gehen Sie zu <var>project-root</var>/build/android-profile, um die Datei zu finden. Die Datei heißt profile-<var>timestamp</var>.json.gz.

Die Attributionsdaten des nativen Builds werden oben im Viewer angezeigt:

Nativer Build-Attributions-Trace in Chrome

Änderungen des Verhaltens

Wenn Sie diese Version des Plug-ins verwenden, kann es zu folgenden Verhaltensänderungen kommen.

Native Bibliotheken, die standardmäßig unkomprimiert verpackt sind

Wenn Sie Ihre Anwendung erstellen, setzt das Plug-in extractNativeLibs jetzt standardmäßig auf "false". Das heißt, Ihre nativen Bibliotheken sind auf der Seite ausgerichtet und unkomprimiert gepackt. Dies führt zwar zu einer größeren Uploadgröße, aber Ihre Nutzer profitieren von folgenden Vorteilen:

  • Kleinere App-Installationsgrößen, da die Plattform direkt über das installierte APK auf native Bibliotheken zugreifen kann, ohne eine Kopie der Bibliotheken zu erstellen.
  • Kleinere Downloadgröße, da die Play Store-Komprimierung in der Regel besser ist, wenn du unkomprimierte native Bibliotheken in dein APK oder Android App Bundle einbindest.

Wenn Sie möchten, dass das Android-Gradle-Plug-in stattdessen komprimierte native Bibliotheken verpackt, fügen Sie Folgendes in das Manifest Ihrer App ein:

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

Hinweis:Das Manifestattribut extractNativeLibs wurde durch die DSL-Option useLegacyPackaging ersetzt. Weitere Informationen finden Sie im Versionshinweis Mit DSL komprimierte native Bibliotheken verpacken.

NDK-Standardversion

Wenn Sie mehrere Versionen des NDK herunterladen, wählt das Android-Gradle-Plug-in jetzt eine Standardversion zum Kompilieren Ihrer Quellcodedateien aus. Zuvor wurde vom Plug-in die zuletzt heruntergeladene Version des NDK ausgewählt. Verwenden Sie das Attribut android.ndkVersion in der Datei build.gradle des Moduls, um den vom Plug-in ausgewählten Standard zu überschreiben.

Vereinfachte Generierung von R-Klassen

Das Android-Gradle-Plug-in vereinfacht den Kompilierungsklassenpfad, indem nur eine R-Klasse für jedes Bibliotheksmodul in Ihrem Projekt generiert und diese R-Klassen für andere Modulabhängigkeiten freigegeben werden. Diese Optimierung sollte zu schnelleren Builds führen. Beachten Sie jedoch Folgendes:

  • Da der Compiler R-Klassen mit vorgelagerten Modulabhängigkeiten teilt, ist es wichtig, dass jedes Modul in Ihrem Projekt einen eindeutigen Paketnamen verwendet.
  • Die Sichtbarkeit der R-Klasse einer Bibliothek für andere Projektabhängigkeiten wird durch die Konfiguration bestimmt, die verwendet wird, um die Bibliothek als Abhängigkeit einzuschließen. Wenn Bibliothek A beispielsweise Bibliothek B als „api“-Abhängigkeit enthält, haben Bibliothek A und andere Bibliotheken, die von Bibliothek A abhängig sind, Zugriff auf die R-Klasse von Bibliothek B. Andere Bibliotheken haben jedoch möglicherweise keinen Zugriff auf die R-Klasse von Bibliothek B. Wenn Bibliothek A die Abhängigkeitskonfiguration implementation verwendet. Weitere Informationen finden Sie unter Abhängigkeitskonfigurationen.

Ressourcen entfernen, die aus der Standardkonfiguration fehlen

Wenn du bei Bibliotheksmodulen eine Ressource für eine Sprache einfügst, die nicht im Standardsatz von Ressourcen enthalten ist, z. B. hello_world als String-Ressource in /values-es/strings.xml, aber nicht in /values/strings.xml definiert ist, ist diese Ressource beim Kompilieren des Projekts nicht mehr im Android-Gradle-Plug-in enthalten. Diese Verhaltensänderung sollte zu weniger Resource Not Found-Laufzeitausnahmen und zu einer verbesserten Build-Geschwindigkeit führen.

D8 respektiert jetzt die Aufbewahrungsrichtlinie CLASS für Annotationen

Beim Kompilieren Ihrer Anwendung berücksichtigt D8 jetzt, wenn Annotationen eine CLASS-Aufbewahrungsrichtlinie anwenden, und diese Annotationen sind zur Laufzeit nicht mehr verfügbar. Dieses Verhalten tritt auch auf, wenn das Ziel-SDK der App auf API-Level 23 gesetzt wird, was bisher während der Laufzeit Zugriff auf diese Annotationen ermöglichte, wenn deine App mit älteren Versionen des Android-Gradle-Plug-ins und D8 kompiliert wurde.

Sonstige Verhaltensänderungen

  • Bei aaptOptions.noCompress wird die Groß-/Kleinschreibung nicht mehr auf allen Plattformen (sowohl für APK als auch Bundles) berücksichtigt und Pfade, in denen Großbuchstaben verwendet werden, berücksichtigt.
  • Die Datenbindung ist jetzt standardmäßig inkrementell. Weitere Informationen finden Sie unter Problem #110061530.

  • Alle Einheitentests, einschließlich Roboelektrischer Einheitentests, können jetzt vollständig im Cache gespeichert werden. Weitere Informationen finden Sie unter Problem #115873047.

Fehlerkorrekturen

Diese Version des Android-Gradle-Plug-ins enthält die folgenden Fehlerkorrekturen:

  • Robolectric-Einheitentests werden jetzt in Bibliotheksmodulen unterstützt, die Datenbindung verwenden. Weitere Informationen finden Sie unter Problem #126775542.
  • Sie können jetzt connectedAndroidTest-Aufgaben in mehreren Modulen ausführen, während der parallele Ausführungsmodus in Gradle aktiviert ist.

Bekannte Probleme

In diesem Abschnitt werden bekannte Probleme im Android-Gradle-Plug-in 3.6.0 beschrieben.

Langsame Leistung der Android Lint-Aufgabe

Android Lint kann bei einigen Projekten aufgrund einer Regression in der Parsing-Infrastruktur viel länger dauern, was die Berechnung abgeleiteter Typen für Lambdas in bestimmten Codekonstrukten verlangsamt.

Das Problem wird als Fehler in IDEA gemeldet und in Android Gradle-Plug-in 4.0 behoben.

Fehlende Manifestklasse {:#agp-missing-manifest}

Wenn deine App im Manifest benutzerdefinierte Berechtigungen definiert, generiert das Android-Gradle-Plug-in normalerweise eine Manifest.java-Klasse, die deine benutzerdefinierten Berechtigungen als Stringkonstanten enthält. Das Plug-in verpackt diese Klasse mit Ihrer App, sodass Sie diese Berechtigungen während der Laufzeit einfacher referenzieren können.

Das Generieren der Manifestklasse ist im Android-Gradle-Plug-in 3.6.0 nicht möglich. Wenn Sie Ihre App mit dieser Version des Plug-ins erstellen und sie auf die Manifestklasse verweist, wird möglicherweise die Ausnahme ClassNotFoundException angezeigt. Führen Sie einen der folgenden Schritte aus, um das Problem zu beheben:

  • Verweisen Sie mit ihrem voll qualifizierten Namen auf Ihre benutzerdefinierten Berechtigungen. Beispiel: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Definieren Sie Ihre eigenen Konstanten, wie unten dargestellt:

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