Android-Gradle-Plug-in 4.0.0 (April 2020)

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

4.0.1 (Juli 2020)

<ph type="x-smartling-placeholder"></ph> Dieses kleine Update unterstützt die Kompatibilität mit neuen Standardeinstellungen und Funktionen für das Paket Sichtbarkeit in Android 11.

In früheren Android-Versionen war es möglich, eine Liste aller Apps, die auf einem Gerät installiert sind. Ab Android 11 (API-Level 30) Standard-Apps haben nur Zugriff auf eine gefilterte Liste installierter Pakete. Um eine umfassendere Liste der Apps im System zu sehen, müssen Sie jetzt hinzufügen <queries>-Element im Android-Manifest.

Das Android-Gradle-Plug-in ab Version 4.1 ist bereits mit dem neuen <queries>-Deklaration. Ältere Versionen sind jedoch nicht kompatibel sind. Wenn Sie das Element <queries> hinzufügen oder eine Bibliothek oder ein SDK nutzen, das die Ausrichtung auf Android 11 unterstützt, kann es beim Erstellen Ihrer App zu Fehlern beim Zusammenführen von Manifesten kommen.

Um dieses Problem zu beheben, veröffentlichen wir eine Reihe von Patches für AGP 3.3 und höher liegen. Wenn Sie eine ältere Version von AGP verwenden, Upgrade auf eine der folgenden Versionen:

Wenn Sie
AGP-Version...
...Upgrade auf:
4.0* 4.0.1
3,6* 3.6.4
3,5* 3.5.4
3,4* 3.4.3
3.3* 3.3.3

Weitere Informationen zu dieser neuen Funktion finden Sie unter Paketsichtbarkeit für Android 11.

Neue Funktionen

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

Unterstützung für Android Studio Build Analyzer

Im Fenster Build Analyzer können Sie Probleme mit Ihrem Build-Prozess wie deaktivierte Optimierungen und falsch konfigurierte Aufgaben. Diese Funktion ist verfügbar, wenn Sie Android Studio 4.0 und höher mit Android-Gradle-Plug-in 4.0.0 und höher. Sie können das Build Analyzer öffnen aus Android Studio:

  1. Erstellen Sie Ihre App, falls Sie dies noch nicht getan haben, indem Sie Build > Marke Projekt aus.
  2. Wählen Sie Ansicht > Tool-Fenster > Build aus.
  3. Öffnen Sie im Fenster Build das Fenster Build Analyzer in einem der auf folgende Arten: <ph type="x-smartling-placeholder">
      </ph>
    • Nachdem Android Studio Ihr Projekt erstellt hat, klicken Sie auf die Schaltfläche Build Analysieren.
    • Nachdem Android Studio Ihr Projekt erstellt hat, klicken Sie auf den Link auf der rechten Seite des Fensters Build Output (Build-Ausgabe).

Im Fenster Build Analyzer werden mögliche Build-Probleme in einer Baumstruktur im hat den Chat verlassen. Sie können jedes Problem überprüfen und darauf klicken, um die Details im auf der rechten Seite. Wenn Android Studio Ihren Build analysiert, wird der Satz von Aufgaben, die die Dauer des Builds bestimmen und den Nutzern eine helfen Ihnen, die Auswirkungen jeder dieser Aufgaben zu verstehen. Sie können auch Details bei Warnungen durch Erweitern des Knotens Warnings.

Weitere Informationen finden Sie unter Regressionen der Build-Geschwindigkeit erkennen.

Desugaring der Java 8-Bibliothek in D8 und R8

Das Android-Gradle-Plug-in unterstützt jetzt die Verwendung verschiedener Java 8-Versionen Sprach-APIs verwenden, ohne dass für Ihre App ein Mindest-API-Level erforderlich ist.

Der DEX-Compiler D8 in Android Studio wird mithilfe eines Prozesses namens Desugaring ausgeführt. 3.0 und höher bieten bereits eine erhebliche Unterstützung für Java 8-Sprachfunktionen (z. B. Lambda-Ausdrücke, Standard-Schnittstellenmethoden, versuchen Sie es mit Ressourcen und mehr). In Android Studio 4.0 wurde die Desugaring-Engine erweitert, sodass und Desugar-Java-APIs. Das bedeutet, dass Sie jetzt Standard-Properties Sprach-APIs, die nur in neueren Android-Versionen verfügbar waren, z. B. java.util.streams) in Apps ein, die ältere Android-Versionen unterstützen.

Die folgenden APIs werden in dieser Version unterstützt:

  • Sequenzielle Streams (java.util.stream)
  • Eine Teilmenge von java.time
  • java.util.function
  • Kürzlich hinzugefügte Elemente in java.util.{Map,Collection,Comparator}
  • Optionale (java.util.Optional, java.util.OptionalInt und java.util.OptionalDouble) und einige andere neue Klassen, die für die obigen Funktionen nützlich sind APIs
  • Einige Ergänzungen zu java.util.concurrent.atomic (neue Methoden zu AtomicInteger, AtomicLong und AtomicReference)
  • ConcurrentHashMap (mit Fehlerkorrekturen für Android 5.0)

Zur Unterstützung dieser Sprach-APIs kompiliert D8 eine separate Bibliotheks-DEX-Datei, die enthält eine Implementierung der fehlenden APIs und fügt sie in Ihre App ein. Die Beim Entsauerungsvorgang wird der Code Ihrer Anwendung umgeschrieben, um stattdessen diese Bibliothek unter Laufzeit.

Damit diese Sprach-APIs unterstützt werden, musst du Folgendes in deine build.gradle-Datei des App-Moduls:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' }

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled = true
  }

compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4") }

Möglicherweise müssen Sie das obige Code-Snippet auch build.gradle-Datei des Bibliotheksmoduls, wenn

  • Die instrumentierten Tests des Bibliotheksmoduls verwenden diese Sprach-APIs (entweder direkt oder über das Bibliotheksmodul oder dessen Abhängigkeiten). Dadurch wird Die fehlenden APIs werden für das instrumentierte Test-APK bereitgestellt.

  • Sie möchten Lint isoliert für das Bibliotheksmodul ausführen. Dies soll helfen, „Lint“ erkennt gültige Nutzungen der Sprach-APIs und verhindert, dass falsche Angaben gemacht werden Warnungen.

Neue Optionen zum Aktivieren oder Deaktivieren von Build-Funktionen

Mit Version 4.0.0 des Android-Gradle-Plug-ins können Sie auf ganz neue Weise steuern, welche Build-Funktionen Sie verwenden möchten die Sie aktivieren und deaktivieren möchten, z. B. Ansichts- und Datenbindung. Neue Funktionen werden standardmäßig deaktiviert. Sie können Aktivieren Sie mit dem buildFeatures-Block nur die gewünschten Funktionen hilft Ihnen, die Build-Leistung für Ihr Projekt zu optimieren. Sie können die Optionen für jedes Modul in der Datei build.gradle auf Modulebene:

android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}
android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}

Sie können auch die Standardeinstellung für diese Funktionen in allen Modulen festlegen. in einem Projekt, indem Sie eines oder mehrere der folgenden Elemente in die gradle.properties-Datei, wie unten gezeigt. Beachten Sie, dass Sie den buildFeatures-Block in der Datei build.gradle auf Modulebene, um diese zu überschreiben projektweiten Standardeinstellungen.

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

Funktionsabhängigkeiten

In früheren Versionen des Android-Gradle-Plug-ins waren alle Funktionsmodule nur vom Basismodul der App abhängen kann. Mit dem Android-Gradle-Plug-in 4.0.0 wurde ein Funktionsmodul hinzugefügt, das von einer anderen Funktion abhängig ist. -Modul. Das heißt, eine :video-Funktion kann vom :camera-Funktion, die vom Basismodul abhängt, wie hier gezeigt. wie in der Abbildung unten dargestellt.

Feature in Funktionsabhängigkeiten

Funktionsmodul :video hängt von Funktion ab :camera, die vom :app-Basismodul abhängt.

Wenn deine App das Herunterladen eines Funktionsmoduls anfordert, App lädt auch andere Funktionsmodule herunter, von denen sie abhängig ist. Nachdem Sie erstellen Funktionsmodule für Ihre App können Sie eine Funktionsabhängigkeit im Modul build.gradle-Datei. Beispielsweise deklariert das Modul :video eine Abhängigkeit von :camera so:

// In the build.gradle file of the ':video' module.
dependencies {
  // All feature modules must declare a dependency
  // on the base module.
  implementation project(':app')
  // Declares that this module also depends on the 'camera'
  // feature module.
  implementation project(':camera')
  ...
}
// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation(project(":app"))
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation(project(":camera"))
    ...
}

Außerdem sollten Sie die Funktion für die Funktionsabhängigkeit in Android Studio (zur Unterstützung der Funktion beim Bearbeiten der Ausführungskonfiguration, für indem Sie auf Hilfe > Edit Custom VM Options (Benutzerdefinierte VM-Optionen bearbeiten) aus der Menüleiste und einschließlich der folgenden:

-Drundebug.feature.on.feature=true

Abhängigkeitsmetadaten

Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 4.0.0 und höher erstellen, enthält Metadaten, die die Abhängigkeiten beschreiben, die in Ihre Beim Hochladen deiner App prüft die Play Console diese Metadaten, um und bietet Ihnen folgende Vorteile:

  • Benachrichtigungen zu bekannten Problemen mit SDKs und Abhängigkeiten, die deine App verwendet
  • Umsetzbares Feedback zur Lösung dieser Probleme erhalten

Die Daten werden komprimiert, mit einem Google Play-Signaturschlüssel verschlüsselt und in den Signaturblock deiner Release-App. Sie können die Metadaten in den lokalen Build-Zwischendateien im folgenden Verzeichnis: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt

Wenn Sie diese Informationen nicht teilen möchten, können Sie dies durch Einfügen der Folgendes in der Datei build.gradle Ihres Moduls:

android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}
android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}

Native Bibliotheken aus AAR-Abhängigkeiten importieren

Sie können jetzt C/C++-Bibliotheken importieren. von den AAE-Abhängigkeiten Ihrer App ausschließen. Wenn Sie die Konfigurationsschritte ausführen wie unten beschrieben, stellt Gradle diese nativen Bibliotheken automatisch für mit Ihrem externen nativen Build-System wie CMake verwenden können. Beachten Sie, dass nur Gradle stellt diese Bibliotheken für Ihren Build zur Verfügung. müssen Sie Ihren Scripts erstellen, um sie zu verwenden.

Bibliotheken werden im Prefab-Paketformat exportiert.

Jede Abhängigkeit kann höchstens ein Prefab-Paket bereitstellen, das ein oder weitere Module. Ein Prefab-Modul ist eine einzelne Bibliothek, die entweder statische oder reine Header-Bibliothek.

In der Regel stimmt der Paketname mit dem Namen des Maven-Artefakts und dem Modulnamen überein entspricht dem Namen der Bibliothek. Dies ist jedoch nicht immer der Fall. Weil Sie wissen müssen, Paket- und Modulnamen der Bibliotheken finden Sie im der Abhängigkeitsdokumentation, um die jeweiligen Namen zu ermitteln.

Externes natives Build-System konfigurieren

Führen Sie die folgenden Schritte für das externe native Build-System aus, um zu sehen, welche Schritte Sie ausführen müssen die Sie verwenden möchten.

Jede AAE-Abhängigkeit Ihrer Anwendung, die nativen Code enthält, stellt ein Android.mk-Datei, die Sie in Ihr ndk-build-Projekt importieren müssen. Sie importieren Datei mit dem Befehl import&endash;module, der die Pfade durchsucht, mithilfe des Attributs import&endash;add&endash;path im Projekt „ndk-build“ angeben. Für Wenn Ihre Anwendung beispielsweise libapp.so definiert und curl verwendet, Ihre Android.mk-Datei sollte Folgendes enthalten:

  1. Für CMake:

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. Für ndk-build:

    include $(CLEAR_VARS)
    LOCAL_MODULE := libapp
    LOCAL_SRC_FILES := app.cpp
    # Link libcurl from the curl AAR.
    LOCAL_SHARED_LIBRARIES := curl
    include $(BUILD_SHARED_LIBRARY)

    # If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif

    # Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)

Native Abhängigkeiten, die in einem AAE enthalten sind, werden für Ihr CMake-Projekt über die CMAKE_FIND_ROOT_PATH{: .external} verwenden. Dieser Wert wird automatisch von Gradle festgelegt, wenn CMake wird aufgerufen. Wenn Ihr Build-System diese Variable ändert, müssen Sie also anstatt ihr zuzuweisen.

Durch jede Abhängigkeit wird Ihrem CMake-Build ein config-file-Paket{: .external} zur Verfügung gestellt, das Sie mit dem Befehl find_package{: .external} importieren. Dieser Befehl sucht nach „config-file“ Pakete, die dem angegebenen Paketnamen und der angegebenen Version entsprechen und die zugehörigen Ziele verfügbar machen definiert, was in Ihrem Build verwendet werden soll. Wenn in Ihrer App beispielsweise libapp.so und verwendet curl, sollten Sie Folgendes in Ihre CMakeLists.txt-Datei:


add_library(app SHARED app.cpp)

# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

Sie können jetzt #include "curl/curl.h" in app.cpp angeben. Wenn Sie Ihr Projekt erstellen, verknüpft Ihr externes natives Build-System automatisch libapp.so mit libcurl.so und Paketen libcurl.so im APK oder App Bundle. Für Weitere Informationen finden Sie im curl-prefab-Beispiel {:.external}.

Verhaltensänderungen

Bei Verwendung dieser Plug-in-Version ergeben sich möglicherweise folgende Änderungen: im Verhalten.

Aktualisierungen der Signaturkonfiguration v1/v2

Das Verhalten für App-Signaturkonfigurationen im signingConfig-Block hat wie folgt geändert:

v1-Signatur

  • Wenn v1SigningEnabled explizit aktiviert ist, führt AGP eine v1-App-Signatur aus.
  • Wenn v1SigningEnabled vom Nutzer explizit deaktiviert wird, gilt für die v1-App-Signatur nicht durchgeführt wurde.
  • Wenn der Nutzer die v1-Signatur nicht explizit aktiviert hat, kann dies automatisch aufgrund von minSdk und targetSdk deaktiviert.

v2-Signatur

  • Wenn v2SigningEnabled explizit aktiviert ist, führt AGP eine v2-App-Signatur aus.
  • Wenn v2SigningEnabled vom Nutzer explizit deaktiviert wird, gilt für die v2-App-Signatur nicht durchgeführt wurde.
  • Wenn der Nutzer die v2-Signatur nicht explizit aktiviert hat, kann dies automatisch aufgrund von targetSdk deaktiviert.

Durch diese Änderungen kann AGP Builds durch Deaktivierung des Signaturmechanismus optimieren. je nachdem, ob der Nutzer diese Flags explizit aktiviert hat. Vorher veröffentlicht haben, konnten v1Signing auch dann deaktiviert werden, wenn sie explizit aktiviert, was verwirrend sein könnte.

Android-Gradle-Plug-ins feature und instantapp entfernt

Android-Gradle-Plug-in 3.6.0 hat Feature-Plug-in eingestellt (com.android.feature) und das Instant App-Plug-in (com.android.instantapp) in Bevorzugung der Verwendung des Plug-ins für dynamische Funktionen (com.android.dynamic-feature) zum Erstellen und Packen Ihres Instant-Apps mithilfe von Android App Bundles nutzen.

Im Android-Gradle-Plug-in 4.0.0 und höher sind diese eingestellten Plug-ins vollständig entfernt. Um das neueste Android-Gradle-Plug-in verwenden zu können, müssen Sie also migrieren, Deine Instant-App zur Unterstützung der Android-App Sets: Wenn du deine Instant Apps migrierst, kannst du die Vorteile und vereinfachen Sie die modularen Design.

Hinweis: So öffnen Sie Projekte, die die entfernten Plug-ins verwenden, in Android Studio 4.0 und höher, für das Projekt muss das Android-Gradle-Plug-in verwendet werden 3.6.0 oder niedriger.

Funktion zur Verarbeitung separater Anmerkungen entfernt

Die Möglichkeit, die Verarbeitung von Anmerkungen in eine bestimmte Aufgabe zu unterteilen, entfernt. Diese Option wurde verwendet, um inkrementelle Java-Kompilierung, wenn nicht-inkrementelle Annotationsprozessoren die in reinen Java-Projekten verwendet werden; wurde es aktiviert, indem android.enableSeparateAnnotationProcessing bis true in der gradle.properties-Datei, die nicht mehr funktioniert.

Stattdessen sollten Sie zu inkrementellen Annotationen migrieren. Prozessoren, um die Leistung Ihrer Website zu verbessern.

includeCompileClasspath wird nicht mehr unterstützt

Das Android-Gradle-Plug-in prüft nicht mehr auf Annotationsprozessoren oder enthält sie nicht mehr die Sie im Compiler-Klassenpfad deklarieren, annotationProcessorOptions.includeCompileClasspath DSL-Property wurde nicht mehr Effekts. Wenn Sie Annotationsprozessoren in den Compiler-Klassenpfad einbeziehen, erhalten Sie möglicherweise den folgenden Fehler:

Error: Annotation processors must be explicitly declared now.

Um dieses Problem zu beheben, müssen Sie Annotationsprozessoren in Ihr build.gradle-Dateien mit der annotationProcessor-Abhängigkeitskonfiguration. Weitere Informationen finden Sie unter Anmerkung hinzufügen Prozessoren.

Automatisches Packen vordefinierter Abhängigkeiten von CMake verwendet

Bei früheren Versionen des Android-Gradle-Plug-ins mussten Sie alle vordefinierten Bibliotheken, die von Ihrem externen nativen CMake-Build verwendet werden, zu verpacken, mit jniLibs. Möglicherweise haben Sie Bibliotheken in der src/main/jniLibs-Verzeichnis deines Moduls oder möglicherweise in einigen anderes in der Datei build.gradle konfiguriertes Verzeichnis:

sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.srcDirs = ['libs']
  }
}
sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.setSrcDirs(listOf("libs"))
  }
}

Mit dem Android-Gradle-Plug-in 4.0 ist die obige Konfiguration nicht mehr erforderlich. und führt zu einem Build-Fehler:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
  > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

Beim externen nativen Build werden diese jetzt automatisch verpackt Bibliotheken enthalten. Das explizite Verpacken der Bibliothek mit jniLibs führt daher zu einem Duplikat. Verschieben Sie die vordefinierte Bibliothek an einen Speicherort, um Build-Fehler zu vermeiden außerhalb von jniLibs oder entfernen Sie die jniLibs-Konfiguration aus Ihrem build.gradle -Datei.

Bekannte Probleme

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

Race-Bedingung im Gradle-Worker-Mechanismus

Änderungen im Android-Gradle-Plug-in 4.0 können eine Race-Bedingung in Gradle auslösen. mit &endash;&endash;no&endash;daemon und Versionen von Gradle 6.3 oder niedriger ausführen, Builds hängen, die nach Abschluss des Builds hängen bleiben.

Dieses Problem wird in Gradle 6.4 behoben.