Android-Gradle-Plug-in 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.

View Binding

Die Ansichtsbindung bietet Typsicherheit zur Kompilierzeit, wenn Sie in Ihrem Code auf Ansichten verweisen. Sie können findViewById() jetzt durch die automatisch generierte Referenz der Bindungsklasse ersetzen. Wenn Sie View Binding verwenden möchten, fügen Sie in die build.gradle-Datei jedes Moduls Folgendes ein:

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

Weitere Informationen finden Sie in der Dokumentation zum Ansehen von Bindungen.

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

Das Android-Gradle-Plug-in unterstützt das Gradle-Plug-in für die Maven-Veröffentlichung, 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-Varianten-Artefakt in Ihrem App- oder Bibliotheksmodul, mit der Sie eine Veröffentlichung in einem Maven-Repository anpassen können.

Weitere Informationen finden Sie 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 Verpackungstool namens zipflinger, um Ihr APK zu erstellen. Dieses neue Tool sollte die Build-Geschwindigkeit verbessern. Wenn das neue Verpackungstool 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 Zeitdauer ermitteln, die Clang zum Erstellen und Verknüpfen jeder C/C++-Datei in Ihrem Projekt benötigt. Gradle kann einen Chrome-Trace ausgeben, der Zeitstempel für diese Compilerereignisse enthält. So können Sie besser nachvollziehen, wie viel Zeit für das Erstellen Ihres Projekts benötigt wird. So geben Sie diese Datei mit Build-Attributen 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 rufen Sie <var>project-root</var>/build/android-profile auf, um die Datei zu finden. Die Datei heißt profile-<var>timestamp</var>.json.gz.

Die Attributionsdaten für den nativen Build werden oben im Viewer angezeigt:

Attributions-Trace für native Builds in Chrome

Geändertes Verhalten

Bei Verwendung dieser Version des Plug-ins kann es zu den folgenden Verhaltensänderungen kommen.

Native Bibliotheken werden standardmäßig unkomprimiert verpackt

Wenn Sie Ihre App erstellen, wird extractNativeLibs vom Plug-in jetzt standardmäßig auf "false" gesetzt. Das bedeutet, dass Ihre nativen Bibliotheken seitenweise ausgerichtet und unkomprimiert verpackt sind. Dadurch wird zwar die Uploadgröße erhöht, aber Ihre Nutzer profitieren von Folgendem:

  • Die App-Installation ist kleiner, da die Plattform direkt über die installierte APK auf die nativen Bibliotheken zugreifen kann, ohne eine Kopie der Bibliotheken zu erstellen.
  • Die Downloadgröße ist geringer, da die Play Store-Komprimierung in der Regel besser ist, wenn Sie unkomprimierte native Bibliotheken in Ihr APK oder Android App Bundle einfügen.

Wenn das Android-Gradle-Plug-in stattdessen komprimierte native Bibliotheken verpacken soll, fügen Sie das Folgende 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 Release-Anmerkung DSL zum Verpacken komprimierter nativer Bibliotheken verwenden.

Standard-NDK-Version

Wenn Sie mehrere Versionen des NDK herunterladen, wählt das Android-Gradle-Plugin jetzt eine Standardversion aus, die zum Kompilieren Ihrer Quellcode-Dateien verwendet wird. Bisher wurde im 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-Klassengenerierung

Das Android-Gradle-Plugin vereinfacht den Kompilierungs-Classpath, indem es nur eine R-Klasse für jedes Bibliotheksmodul in Ihrem Projekt generiert und diese R-Klassen mit anderen Modulabhängigkeiten teilt. Diese Optimierung sollte zu schnelleren Builds führen. Dabei ist jedoch Folgendes zu beachten:

  • 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, die zum Einbinden der Bibliothek als Abhängigkeit verwendet wird. 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 in Bibliothek A die implementation-Abhängigkeitskonfiguration verwendet wird. Weitere Informationen finden Sie unter Abhängigkeitskonfigurationen.

Entfernen von Ressourcen, die in der Standardkonfiguration fehlen

Wenn Sie in Bibliotheksmodulen eine Ressource für eine Sprache einfügen, die nicht im Standardsatz von Ressourcen enthalten ist, z. B. wenn Sie hello_world als String-Ressource in /values-es/strings.xml einfügen, diese Ressource aber nicht in /values/strings.xml definieren, fügt das Android-Gradle-Plugin diese Ressource beim Kompilieren Ihres Projekts nicht mehr ein. Diese Verhaltensänderung sollte zu weniger Resource Not Found-Laufzeitfehlern und einer höheren Build-Geschwindigkeit führen.

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

Beim Kompilieren Ihrer App berücksichtigt D8 jetzt, wenn für Annotationen eine CLASS-Aufbewahrungsrichtlinie gilt. Diese Annotationen sind zur Laufzeit nicht mehr verfügbar. Dieses Verhalten tritt auch auf, wenn das Ziel-SDK der App auf API-Level 23 festgelegt wird. Bisher war der Zugriff auf diese Anmerkungen zur Laufzeit möglich, wenn die App mit älteren Versionen des Android-Gradle-Plug-ins und D8 kompiliert wurde.

Weitere Verhaltensänderungen

  • aaptOptions.noCompress ist auf allen Plattformen (sowohl für APKs als auch für App-Bundles) nicht mehr case-sensitive und berücksichtigt Pfade, in denen Großbuchstaben verwendet werden.
  • Die Datenbindung erfolgt jetzt standardmäßig inkrementell. Weitere Informationen finden Sie unter Problem 110061530.

  • Alle Unit-Tests, einschließlich Roboelectric-Unit-Tests, können jetzt vollständig im Cache gespeichert werden. Weitere Informationen finden Sie unter Problem Nr. 115873047.

Fehlerkorrekturen

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

  • Robolectric-Unit-Tests werden jetzt in Bibliotheksmodulen unterstützt, die 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 von Gradle aktiviert ist.

Bekannte Probleme

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

Langsame Ausführung der Android Lint-Aufgabe

Bei einigen Projekten kann es aufgrund einer Regression in der Parsing-Infrastruktur von Android Lint viel länger dauern, bis die Analyse abgeschlossen ist. 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 im Android-Gradle-Plug-in 4.0 behoben.

Fehlende Manifestklasse {:#agp-missing-manifest}

Wenn in Ihrer App benutzerdefinierte Berechtigungen im Manifest 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 packt diese Klasse mit Ihrer App, sodass Sie zur Laufzeit einfacher auf diese Berechtigungen verweisen 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:

  • Verweisen Sie auf Ihre benutzerdefinierten Berechtigungen mit ihrem vollständig 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";
                  }
                }