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

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

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

Weitere Informationen finden Sie in der Dokumentation zur Bindung ansehen.

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 Anwendung oder Ihrem Bibliotheksmodul, mit der Sie eine Publikation für ein Maven-Repository anpassen können.

Weitere Informationen finden Sie auf der Seite zur Verwendung des Maven Publish-Plug-ins.

Neues standardmäßiges Tool für die Paketerstellung

Beim Erstellen der Debug-Version deiner App verwendet das Plug-in ein neues Paketerstellungstool namens zipflinger, um dein APK zu erstellen. Das neue Tool sollte die Build-Geschwindigkeit verbessern. Wenn das neue Tool zur Paketerstellung nicht wie erwartet funktioniert, melde bitte einen Fehler. Du kannst zum alten Tool zurückwechseln, indem du Folgendes in deine gradle.properties-Datei einfügst:

        android.useNewApkCreator=false
      

Attribution für native Builds

Sie können jetzt festlegen, 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. Beispiel:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Öffne den Chrome-Browser und gib chrome://tracing in die Suchleiste ein.

  3. Klicken Sie auf die Schaltfläche Laden und wechseln 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 Trace für die Build-Attribution in Chrome

Verhaltensänderungen

Bei Verwendung dieser Plug-in-Version können folgende Verhaltensänderungen auftreten.

Native Bibliotheken, die standardmäßig unkomprimiert sind

Wenn Sie Ihre Anwendung erstellen, legt das Plug-in extractNativeLibs jetzt standardmäßig auf "false" fest. Das heißt, Ihre nativen Bibliotheken sind auf Seiten ausgerichtet und werden unkomprimiert gepackt. Dadurch wird zwar die Uploadgröße erhöht, aber Ihre Nutzer profitieren von folgenden Vorteilen:

  • Die App-Installationsgröße ist geringer, da die Plattform direkt über das installierte APK auf die nativen Bibliotheken zugreifen kann, ohne eine Kopie der Bibliotheken erstellen zu müssen.
  • 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 aufnimmst.

Wenn das Android-Gradle-Plug-in stattdessen komprimierte native Bibliotheken verpacken soll, füge Folgendes in das Manifest deiner App ein:

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

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

Standard-NDK-Version

Wenn Sie mehrere Versionen des NDK herunterladen, wählt das Android-Gradle-Plug-in jetzt eine Standardversion für die Kompilierung Ihrer Quellcodedateien aus. Bisher wählte das Plug-in die neueste heruntergeladene Version des NDK aus. Verwenden Sie das Attribut android.ndkVersion in der Datei build.gradle des Moduls, um den vom Plug-in ausgewählten Standardwert zu überschreiben.

Vereinfachte Generierung von R-Klassen

Das Android-Gradle-Plug-in vereinfacht den Kompilierungsklassenpfad. Es generiert nur eine R-Klasse für jedes Bibliotheksmodul in Ihrem Projekt und teilt diese R-Klassen mit anderen Modulabhängigkeiten. Diese Optimierung sollte zu schnelleren Builds führen, aber Sie sollten Folgendes beachten:

  • 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 aufzunehmen. Wenn Bibliothek A beispielsweise Bibliothek B als API-Abhängigkeit enthält, haben Bibliothek A und andere von Bibliothek A abhängige Bibliotheken 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.

Fehlende Ressourcen aus der Standardkonfiguration entfernen

Wenn Sie für Bibliotheksmodule eine Ressource für eine Sprache angeben, die Sie nicht in den Standardressourcensatz aufnehmen, z. B. hello_world als Stringressource in /values-es/strings.xml, diese Ressource aber nicht in /values/strings.xml definieren, enthält das Android-Gradle-Plug-in diese Ressource beim Kompilieren Ihres Projekts nicht mehr. Diese Verhaltensänderung sollte zu weniger Resource Not Found-Laufzeitausnahmen und einer verbesserten Build-Geschwindigkeit führen.

D8 berücksichtigt jetzt die CLASS-Aufbewahrungsrichtlinie für Annotationen

Beim Kompilieren Ihrer App berücksichtigt D8 jetzt, wenn Anmerkungen eine CLASS-Aufbewahrungsrichtlinie anwenden. Diese Anmerkungen sind dann zur Laufzeit nicht mehr verfügbar. Dieses Verhalten besteht auch, wenn das Ziel-SDK der App auf API-Level 23 festgelegt wird, das zuvor den Zugriff auf diese Annotationen während der Laufzeit 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ß- und Kleinschreibung nicht mehr auf allen Plattformen (sowohl für APKs als auch für Bundles) berücksichtigt. Pfade, die Großbuchstaben enthalten, werden berücksichtigt.
  • Die Datenbindung ist jetzt standardmäßig inkrementell. Weitere Informationen finden Sie unter Problem #110061530.

  • Alle Einheitentests, einschließlich Roboelectric-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 über mehrere Module hinweg ausführen, wobei der parallele Ausführungsmodus von 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

Die Ausführung von Android Lint kann bei einigen Projekten aufgrund einer Regression in der Parsing-Infrastruktur viel länger dauern, was zu einer langsameren Berechnung der abgeleiteten Typen für Lambdas in bestimmten Codekonstruktionen führt.

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

Manifestklasse {:#agp-missing-manifest} fehlt

Wenn im Manifest Ihrer App benutzerdefinierte Berechtigungen definiert sind, generiert das Android-Gradle-Plug-in in der Regel eine Manifest.java-Klasse, die Ihre benutzerdefinierten Berechtigungen als Stringkonstanten enthält. Das Plug-in bündelt diese Klasse mit Ihrer Anwendung, sodass Sie diese Berechtigungen zur Laufzeit einfacher referenzieren können.

Das Generieren der Manifestklasse funktioniert im Android-Gradle-Plug-in 3.6.0 nicht. Wenn Sie Ihre Anwendung mit dieser Version des Plug-ins erstellen und diese 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 auf Ihre benutzerdefinierten Berechtigungen mit dem voll qualifizierten Namen. Beispiel: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Definieren Sie Ihre eigenen Konstanten, wie unten gezeigt:

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