Android Gradle 外掛程式 7.0.0 (2021 年 7 月)

Android Gradle 外掛程式 7.0.0 是主要版本,其中包含多項 新功能和改善項目

7.0.1 (2021 年 8 月)

這項次要更新修正了多項錯誤。如要查看重要錯誤修正清單,請參閱 版本更新網誌

相容性

最低版本 預設版本
Gradle 7.0.2 7.0.2
SDK 版本工具 30.0.2 30.0.2
NDK 不適用 21.4.7075529
JDK 11 11

若要執行 AGP 7.0,須使用 JDK 11

使用 Android Gradle 外掛程式 7.0 建構應用程式時,JDK 11 現在已經 執行 Gradle 所需的程式碼Android Studio Arctic Fox 隨附 JDK 11 和 會將 Gradle 設為預設使用,也就是說大部分的 Android Studio 無需對專案進行任何設定變更。

如果您需要手動設定 Android Studio 中 AGP 使用的 JDK 版本,您必須使用 JDK 11 或更高版本。

使用獨立於 Android Studio 之外的 AGP 時,請將 JDK 版本升級到 設定 JAVA_HOME 環境變數-Dorg.gradle.java.home 指令列選項 貼進 JDK 11 安裝目錄。

請注意,SDK Manager 和 AVD Manager 位於已淘汰的 SDK 工具套件中 不支援 JDK 11如要繼續使用 SDK Manager 和 AVD Manager 針對 AGP 7.0 以上版本,您需要從 目前 Android SDK 指令列工具 套件

Variant API 穩定版

新的 Variant API 現在可以穩定運作了。查看新介面的 com.android.build.api.variant 套件中的範例 「gradle-recipes」GitHub 專案。新的 Variant API 中,我們提供多種中繼檔案,稱為 並經由 成果 存取 API這些構件如同合併的資訊清單,可以安全取得 並使用第三方外掛程式和程式碼進行自訂

我們會持續新增功能來擴充 Variant API 並改進我們提供給 。

Lint 行為變更

本節介紹 Android Gradle 中的多項 Lint 行為變更 外掛程式 7.0.0。

改善程式庫依附性的程式碼檢查

現在用 checkDependencies = true 執行 Lint 的速度已加快 比以往更大適用於由應用程式內含程式庫的 Android 專案 依附元件時,建議您將 checkDependencies 設為 true (如下所示),並透過 ./gradlew :app:lint,會分析所有依附元件 並產生一份報表,內含 及其所有依附元件

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

Lint 工作現在可以保持最新狀態

如果模組的來源和資源並未變更,Lint 分析 模組工作就不需要再次執行。發生這種情況時 工作的執行作業顯示為「UP-TO-DATE」在 Gradle 中 輸出內容這項變更生效後,使用 checkDependencies = true 在應用程式模組執行 Lint 時,只有已變更的模組會 以及執行他們的分析Lint 因此得以進一步提高執行速度。

如果輸入內容不具任何程式碼,也不需要執行 Lint 報告工作 已變更。相關的已知問題是沒有 Lint 當 Lint 工作顯示「UP-TO-DATE」時,文字輸出會輸出至 stdout (問題 #191897708)。

在動態功能模組執行程式碼檢查

AGP 不再支援透過動態功能模組執行 Lint。 從對應的應用程式模組執行 Lint 將在以下裝置上執行 Lint 其動態功能模組,並在應用程式的 Lint 中納入所有問題 報表。相關已知問題是指執行 Lint 時 透過應用程式模組中的 checkDependencies = true 除非動態功能程式庫依附元件也是應用程式,否則系統不會檢查這些項目 依附元件 (問題 #191977888)。

僅用預設變數執行程式碼檢查

現在執行 ./gradlew :app:lint 只會針對 預設變化版本。在舊版 AGP 中,這樣做會對所有項目執行 Lint 子類

R8 縮減器缺少類別警示

R8 不僅更加精確, 持續處理缺少類別及 -dontwarn 選項的問題。 因此,建議您著手評估發出的缺少類別警告 R8。

當 R8 遇到未在應用程式中定義的類別參照時,或 其中一個依附元件,便會在建構作業中發出警示 輸出內容例如:

R8: Missing class: java.lang.instrument.ClassFileTransformer

這項警告表示類別定義 找不到 java.lang.instrument.ClassFileTransformer 來分析應用程式程式碼雖然這通常代表發生錯誤 您可能需要忽略這則警告兩個常見原因 如何忽略警告:

  1. 針對 JVM 的程式庫和缺少的類別都屬於 JVM 程式庫型別 (如上例所示)。

  2. 其中一個依附元件使用僅有編譯時間的 API。

您可以新增 -dontwarn,忽略缺少類別警告 請先指定 proguard-rules.pro 檔案。例如:

-dontwarn java.lang.instrument.ClassFileTransformer

為了使用方便,AGP 會產生檔案,並在檔案中納入所有 請將規則寫入檔案路徑,如下所示: app/build/outputs/mapping/release/missing_rules.txt。將 proguard-rules.pro 檔案中的規則,忽略警告。

在 AGP 7.0 中,缺少的類別訊息會顯示為警告,您可以 建立錯誤 android.r8.failOnMissingClasses = true 英吋 gradle.properties。在 AGP 8.0 中,這類警告會變成 導致建構失敗的錯誤如要保留 AGP 7.0 的行為 將 -ignorewarnings 選項加進 proguard-rules.pro 檔案,但不建議這麼做。

移除 Android Gradle 外掛程式建構快取

AGP 4.1 版已移除 AGP 建構快取。先前在 AGP 中推出 2.3 與 Gradle 建構快取補充,AGP 建構快取已取代 完全由 Gradle 建構快取執行。這項異動不會影響 建構時間

在 AGP 7.0 中,android.enableBuildCache 屬性 android.buildCacheDir 屬性,以及 已移除 cleanBuildCache 項工作。

在專案中使用 Java 11 原始碼

您現在可以在應用程式專案中編譯 Java 11 原始碼,藉此啟用 例如使用私人介面方法、鑽石級 運算子,以及 lambda 參數的本機變數語法。

如要啟用這項功能,請將 compileOptions 設為所需用途 Java 版本,並將 compileSdkVersion 設為 30 以上:

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

移除依附元件設定

在 AGP 7.0 中,下列設定 (或依附元件範圍) 已 已移除:

  • compile
    視用途而定,已由 api 取代。 或 implementation
    也適用於「*Compile」變數,例如:debugCompile
  • provided
    已由 compileOnly 取代。
    也適用於「*Provided」變數,例如: releaseProvided
  • apk
    已由 runtimeOnly 取代。
  • publish
    已由 runtimeOnly 取代。

在大多數情況下,AGP 升級助理會自動將專案遷移至新的 儲存空間設定

針對 Android 進行編譯時,類別路徑會變動 Gradle 外掛程式

對 Android Gradle 外掛程式進行編譯時, classpath 可能會變更。因為 AGP 現在使用 api/implementation 部分構件可能會從編譯作業中移除 Classpath。如果您在編譯時需要使用 AGP 依附元件,請務必 並新增為明確的依附元件

在 Java 資源中加入原生程式庫 不支援資料夾

您之前可以在 Java 資源資料夾中加入原生程式庫 使用 android.sourceSets.main.resources.srcDirs 註冊資料夾,以便擷取原生程式庫並新增至最終 APK。從 AGP 7.0 開始,系統不再支援此方式,且 系統會忽略 Java 資源資料夾。請改為使用 原生資料庫,android.sourceSets.main.jniLibs.srcDirs。適用對象 如需更多資訊,請參閱 如何設定 來源集

已知問題

本節說明 Android Gradle 外掛程式的已知問題 7.0.0。

1.4.x Kotlin Multiplatform 外掛程式不相容性

Android Gradle 外掛程式 7.0.0 與 Kotlin Multiplatform 外掛程式 1.5.0 以上版本。使用 Kotlin 的專案 多平台支援功能必須更新至 Kotlin 1.5.0 版,才能使用 Android Gradle 外掛程式 7.0.0。如要解決這個問題,您可以將 Android Gradle 外掛程式降級 變更為 4.2.x,但我們並不建議使用

若需更多資訊,請參閲 KT-43944

缺少程式碼檢查輸出內容

當 Lint 工作處於以下狀態時,stdout 不會輸出 Lint 文字輸出內容 最新 (問題 #191897708) 詳情請參閱 Lint 行為變更。本期 Android Gradle 外掛程式 7.1 會修正這個問題。

並非所有動態功能程式庫依附元件皆有進行程式碼檢查

透過 checkDependencies = true 執行 Lint 時 應用程式模組,除非系統並未檢查動態功能程式庫依附元件, 也便是應用程式依附元件 (問題 #191977888)。 您可以在這些程式庫執行程式碼檢查工作,藉此解決問題。如需更多背景資訊 請參閱「Lint 行為變更」。