Android Gradle Plugin 3.6.0 (Februar 2020)

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

Mindestversion Standardversio Hinweise
Gradle 5.6.4 5.6.4 Weitere Informationen finden Sie unter Gradle aktualisieren.
SDK-Build-Tools 28.0.3 28.0.3 Installieren oder konfigurieren Sie die SDK-Build-Tools.

Neue Funktionen

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

Bindung ansehen

Die View-Bindung bietet Sicherheit bei der Kompilierung, wenn in Ihrem Code auf Ansichten verwiesen wird. Sie können findViewById() jetzt durch die automatisch generierte Bindungsklassenreferenz ersetzen. Wenn Sie die Ansichtsbindung verwenden möchten, fügen Sie der build.gradle-Datei jedes Moduls Folgendes hinzu:

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

Weitere Informationen finden Sie in der Dokumentation zur Bindung.

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 für jedes Buildvarianten-Artefakt in Ihrem App- oder Bibliotheksmodul eine Komponente, mit der Sie eine Veröffentlichung für ein Maven-Repository anpassen können.

Weitere Informationen finden Sie auf der Seite Maven Publish-Plug-in verwenden.

Neues Standard-Paketierungstool

Beim Erstellen der Debugversion Ihrer App verwendet das Plug-in ein neues Verpackungstool namens zipflinger, um Ihr APK zu erstellen. Dieses neue Tool sollte die Buildgeschwindigkeit verbessern. Wenn das neue Tool zum Verpacken nicht wie erwartet funktioniert, melden Sie bitte einen Fehler. Sie können zum alten Verpackungstool zurückkehren, indem Sie Folgendes in Ihre gradle.properties-Datei einfügen:

        android.useNewApkCreator=false
      

Attribution für native Builds

Sie können jetzt die Zeitspanne ermitteln, die Clang für das Erstellen und Verknüpfen jeder C/C++-Datei in Ihrem Projekt benötigt. Gradle kann einen Chrome-Trace mit Zeitstempeln für diese Compilerereignisse ausgeben, damit Sie die für den Build Ihres Projekts erforderliche Zeit besser nachvollziehen können. So geben Sie diese Datei mit den Attributionsdaten für den Build 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. Öffnen Sie den Chrome-Browser und geben Sie chrome://tracing in die Suchleiste ein.

  3. Klicken Sie auf die Schaltfläche 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 für native Apps werden oben im Viewer angezeigt:

Native Attributions-Spuren für Builds in Chrome

Geändertes Verhalten

Bei Verwendung dieser Version des Plug-ins können die folgenden Verhaltensänderungen auftreten.

Native Bibliotheken, die standardmäßig unkomprimiert verpackt sind

Wenn Sie Ihre App erstellen, wird extractNativeLibs jetzt standardmäßig vom Plug-in auf "false" gesetzt. Das bedeutet, dass Ihre nativen Bibliotheken seitenausgerichtet und unkomprimiert verpackt sind. Das führt zwar zu einer größeren Uploadgröße, Ihre Nutzer profitieren aber von folgenden Vorteilen:

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

Wenn das Android Gradle-Plug-in stattdessen komprimierte native Bibliotheken verpacken soll, 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 in der Anmerkung zur Version.

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 wurde vom Plug-in die zuletzt heruntergeladene Version des NDK ausgewählt. Verwenden Sie das Attribut android.ndkVersion in der build.gradle-Datei des Moduls, um die vom Plug-in ausgewählte Standardeinstellung zu überschreiben.

Vereinfachte R-Klassenerstellung

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

  • Da der Compiler R-Klassen mit Upstream-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, mit der die Bibliothek als Abhängigkeit eingeschlossen wurde. Wenn Bibliothek A beispielsweise Bibliothek B als „api“-Abhängigkeit enthält, haben Bibliothek A und andere Bibliotheken, die von Bibliothek A abhängen, 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 implementation-Abhängigkeitskonfiguration verwendet. Weitere Informationen finden Sie unter Abhängigkeitskonfigurationen.

Ressourcen entfernen, die in der Standardkonfiguration fehlen

Wenn Sie für Bibliotheksmodule eine Ressource für eine Sprache angeben, die nicht in den Standardressourcen enthalten ist, wird diese Ressource beim Kompilieren Ihres Projekts nicht mehr vom Android Gradle-Plug-in berücksichtigt. Das ist beispielsweise der Fall, wenn Sie hello_world als Stringressource in /values-es/strings.xml angeben, sie aber nicht in /values/strings.xml definieren. Diese Verhaltensänderung sollte zu weniger Resource Not Found-Laufzeitausnahmen und einer verbesserten Buildgeschwindigkeit führen.

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

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 tritt auch auf, wenn Sie das Ziel-SDK der App auf API-Level 23 festlegen. Bisher war bei der Kompilierung Ihrer App mit älteren Versionen des Android Gradle-Plug-ins und D8 der Zugriff auf diese Anmerkungen während der Laufzeit möglich.

Weitere Verhaltensänderungen

  • aaptOptions.noCompress ist auf allen Plattformen (sowohl für APKs als auch für Bundles) nicht mehr groß- und kleinschreibungsempfindlich und berücksichtigt Pfade mit Großbuchstaben.
  • Die Datenbindung ist jetzt standardmäßig inkrementell. Weitere Informationen finden Sie unter Problem 110061530.

  • Alle Unittests, einschließlich Roboelectric-Unittests, 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-Unit-Tests 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, wenn 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

Bei einigen Projekten kann die Ausführung von Android Lint aufgrund einer Regression der Parseinfrastruktur viel länger dauern. Dies führt zu einer langsameren Berechnung der abgeleiteten Typen für Lambdas in bestimmten Codekonstrukten.

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

Fehlende Manifest-Klasse {:#agp-missing-manifest}

Wenn Ihre App benutzerdefinierte Berechtigungen in ihrem Manifest definiert, generiert das Android Gradle-Plug-in normalerweise eine Manifest.java-Klasse, die Ihre benutzerdefinierten Berechtigungen als Stringkonstanten enthält. Das Plug-in verpackt diese Klasse mit Ihrer App, damit Sie diese Berechtigungen bei der Laufzeit leichter referenzieren können.

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

  • Geben Sie Ihre benutzerdefinierten Berechtigungen mit ihrem vollständig qualifizierten Namen an. 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";
                  }
                }