Android-Gradle-Plug-in 3.6.0 (Februar 2020)

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

Mindestversion Standardversion 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 Ansichtsbindung bietet Sicherheit bei der Kompilierung, wenn in Ihrem Code auf Ansichten verwiesen wird. Sie können jetzt findViewById() 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 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 für jedes Build-Variantenartefakt in Ihrem App- oder Bibliotheksmodul eine Komponente, mit der Sie eine Veröffentlichung in einem Maven-Repository anpassen können.

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

Neues Standard-Paketerstellungstool

Beim Erstellen der Debug-Version Ihrer App verwendet das Plug-in ein neues Paketierungstool 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 das alte Verpackungstool wieder verwenden, indem Sie Folgendes in die Datei gradle.properties einfügen:

        android.useNewApkCreator=false
      

Attribution nativer Builds

Sie können jetzt feststellen, wie lange Clang braucht, um jede C/C++-Datei in Ihrem Projekt zu erstellen und zu verknüpfen. Gradle kann einen Chrome-Trace ausgeben, der Zeitstempel für diese Compiler-Ereignisse enthält. So können Sie die für die Erstellung Ihres Projekts erforderliche Zeit besser nachvollziehen. 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. Öffnen Sie den Chrome-Browser und geben Sie chrome://tracing in die Suchleiste ein.

  3. Klicken Sie auf den Button Laden und rufen Sie <var>project-root</var>/build/android-profile auf, um die Datei zu finden. Der Name der Datei lautet 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 der Verwendung dieser Version des Plug-ins können die folgenden Verhaltensänderungen auftreten.

Native Bibliotheken werden standardmäßig unkomprimiert verpackt

Wenn Sie Ihre Anwendung erstellen, setzt das Plug-in jetzt standardmäßig extractNativeLibs auf "false". Das bedeutet, dass deine nativen Bibliotheken seitenorientiert und unkomprimiert verpackt sind. Dies führt zwar zu einer größeren Uploadgröße, bietet Ihren Nutzern aber die folgenden Vorteile:

  • 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 Google Play Store in der Regel besser ist, wenn Sie unkomprimierte native Bibliotheken in Ihr APK oder Android App Bundle aufnehmen.

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

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

Hinweis:Das Manifestattribut extractNativeLibs wurde durch die DSL-Option useLegacyPackaging ersetzt. Weitere Informationen finden Sie in den Versionshinweisen unter Verwendung der DSL für das Verpacken komprimierter nativer Bibliotheken.

Standard-NDK-Version

Wenn Sie mehrere Versionen des NDK herunterladen, wählt das Android-Gradle-Plug-in jetzt eine Standardversion aus, die zum Kompilieren Ihrer Quellcodedateien verwendet wird. Zuvor hat das 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 Standardwert zu überschreiben.

Vereinfachte Generierung von R-Klassen

Das Android-Gradle-Plug-in vereinfacht den Kompilierungsklassenpfad, indem es für jedes Bibliotheksmodul in Ihrem Projekt nur eine R-Klasse generiert und diese R-Klassen mit anderen Modulabhängigkeiten teilt. 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, mit der die Bibliothek als Abhängigkeit eingebunden wird. Wenn beispielsweise Bibliothek A die 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 Abhängigkeitskonfiguration implementation verwendet. Weitere Informationen finden Sie unter Abhängigkeitskonfigurationen.

Ressourcen entfernen, die in der Standardkonfiguration fehlen

Wenn Sie bei 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), wird diese Ressource beim Kompilieren Ihres Projekts vom Android-Gradle-Plug-in nicht mehr berücksichtigt. 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 Annotationen eine CLASS-Aufbewahrungsrichtlinie anwenden. Diese Annotationen sind dann zur Laufzeit nicht mehr verfügbar. Dieses Verhalten tritt auch auf, wenn das Ziel-SDK der App auf API-Level 23 festgelegt wird. Dadurch war es zuvor möglich, während der Laufzeit auf diese Annotationen zuzugreifen, wenn die App mit älteren Versionen des Android Gradle-Plug-ins und D8 kompiliert wurde.

Weitere Verhaltensänderungen

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

  • Alle Unittests, einschließlich Roboelectric-Unittests, sind jetzt vollständig cachefähig. Weitere Informationen finden Sie unter Problem Nr. 115873047.

Fehlerkorrekturen

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

  • Robolectric-Unittests werden jetzt in Bibliotheksmodulen unterstützt, die die Datenbindung verwenden. Weitere Informationen finden Sie unter Problem 126775542.
  • Sie können jetzt connectedAndroidTest-Aufgaben über mehrere Module hinweg 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 Leistung der Android Lint-Aufgabe

Android Lint kann bei einigen Projekten aufgrund einer Regression in der Parsing-Infrastruktur viel länger dauern. Dies führt zu einer langsameren Berechnung abgeleiteter Typen für Lambdas in bestimmten Codekonstrukten.

Das Problem wird als Fehler in IDEA gemeldet und 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 verpackt diese Klasse mit Ihrer App, sodass Sie diese Berechtigungen zur Laufzeit leichter referenzieren können.

Das Generieren der Manifestklasse ist im Android-Gradle-Plug-in 3.6.0 fehlerhaft. 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 lösen:

  • 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";
                  }
                }