Android Gradle 外掛程式版本資訊

JCenter 存放區已於 2021 年 3 月 31 日設為唯讀狀態。詳情 請 參閱 JCenter 服務更新內容

Android Studio 建構系統以 Gradle 為基礎,Android Gradle 外掛程式則加入了建構 Android 應用程式專用的功能。雖然 Android 外掛程式一般會和 Android Studio 同步更新,但是外掛程式 (以及 Gradle 系統其他內容) 可獨立於 Android Studio 之外執行,也可另外更新。

本頁面會說明如何讓 Gradle 工具保持最新狀態,以及近期更新項目。

如需 Android Gradle 外掛程式即將推出的破壞性變更相關詳細摘要資訊,請參閱 Android Gradle 外掛程式藍圖

想進一步瞭解如何使用 Gradle 設定 Android 版本,請參閱下列頁面的相關說明:

如要進一步瞭解 Gradle 建構系統,請參閱 Gradle 使用手冊

更新 Android Gradle 外掛程式

更新 Android Studio 時,系統可能會要求自動將 Android Gradle 外掛程式 更新為可供使用的最新版本。您可以選擇接受更新,也可以根據專案的版本需求手動指定版本。

您可以透過 Android Studio 的「File」(檔案) >「Project Structure」(專案結構) >「Project」(專案) 選單,或頂層 build.gradle 檔案指定外掛程式版本。這個外掛程式版本會套用到所有該 Android Studio 專案內建的模組。以下範例會透過 build.gradle 檔案將外掛程式設定為 7.1.2 版:

Groovy

plugins {
    id 'com.android.application' version '7.1.2' apply false
    id 'com.android.library' version '7.1.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.5.31' apply false
}

Kotlin

plugins {
    id("com.android.application") version "7.1.2" apply false
    id("com.android.library") version "7.1.2" apply false
    id("org.jetbrains.kotlin.android") version "1.5.31" apply false
}

注意:請勿在版本編號中使用動態依附元件,例如 'com.android.tools.build:gradle:2.+'。使用這項功能可能會導致非預期的版本更新,從而難以解析版本差異。

如果您尚未下載指定的外掛程式版本,Gradle 會在您下次建構專案,或從 Android Studio 選單列中依序點選「File」(檔案) >「Sync Project with Gradle Files」(將專案與 Gradle 檔案同步處理) 時下載該版本。

更新 Gradle

更新 Android Studio 時,系統可能會要求同時將 Gradle 更新 為可供使用的最新版本。您可以選擇接受更新,也可以根據專案的版本需求手動指定版本。

下表列出各個 Android Gradle 外掛程式版本所需的 Gradle 版本。為獲得最佳效能,請務必使用最新版本的 Gradle 及外掛程式。

外掛程式版本所需 Gradle 版本
1.0.0 - 1.1.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1 - 3.5
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0 - 3.2.14.6+
3.3.0 - 3.3.34.10.1+
3.4.0 - 3.4.35.1.1+
3.5.0 - 3.5.45.4.1+
3.6.0 - 3.6.45.6.4+
4.0.0+6.1.1+
4.1.0+6.5+
4.2.0+6.7.1+
7.07.0+
7.17.2+
7.27.3+

只要透過 Android Studio 的「File」(檔案) >「Project Structure」(專案結構) >「Project」(專案) 選單,或編輯 gradle/wrapper/gradle-wrapper.properties 檔案內的 Gradle 發布參考資料,即可指定 Gradle 版本。以下範例會透過 gradle-wrapper.properties 檔案將 Gradle 版本設定為 7.4.2。

...
distributionUrl = "https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip"
...

版本編號方式變更 (2020 年 11 月)

我們正在變更 Android Gradle 外掛程式 (AGP) 的版本編號方式,讓版本號碼與基礎 Gradle 建構工具更為一致。

重要變更項目如下:

  • AGP 現在使用語意化版本編號, 主要更新將以破壞性變更為主。

  • 每年都會發布一次 AGP 的主要版本, 以便配合 Gradle 的主要版本。

  • AGP 4.2 之後發布的內容將為 7.0 版本, 並必須更新為 Gradle 7.x 版本。每次 AGP 主要版本都必須升級 基礎 Gradle 工具的主要版本。

  • 我們會在約一年前提早淘汰 API, 並會同時提供替代功能。已淘汰的 API 將在約一年後透過後續重大更新移除。

7.1.0 (2022 年 1 月)

Android Gradle 外掛程式 7.1.0 是主要版本,內含多種新功能及改善項目。

7.1.2 (2022 年 2 月)

這項次要更新修正了下列錯誤:

  • Android Gradle 外掛程式 7.1.0-rc01 在單元測試期間 無法執行 ASM 位元碼轉換作業
  • Gradle 同步處理失敗,並顯示 「無法載入類別 'com.android.build.api.extension.AndroidComponentsExtension'」
  • 無法在 Android Gradle 外掛程式 7.0.0 中 透過 Groovy DSL 使用部分新的 DSL 區塊
  • AGP 7.1 新發布的 API:已建立的 javadoc jar 未成功簽署
  • ClassesDataSourceCache 應該可以使用最新 Asm 版本了
  • Android Studio BumbleBee 不一定能夠部署最新變更項目

此版本的 完整修正錯誤清單 請參閱 Android Studio Bumblebee 修補程式 2 網誌文章

7.1.1 (2022 年 2 月)

本次要更新 配合 Android Studio Bumblebee 修補程式 1 版本。

此版本的 修正錯誤清單 請參閱 Android Studio Bumblebee 修補程式 1 網誌文章

相容性

最低版本 預設版本 附註
Gradle 7.2 7.2 詳情請參閱更新 Gradle
SDK 版本工具 30.0.3 30.0.3 安裝設定 SDK 版本工具。
NDK 21.4.7075529 安裝設定 NDK 其他版本。
JDK 11 11 詳情請參閱設定 JDK 版本

程式碼檢查分析作業現在可供快取了

AndroidLintAnalysisTask 現在可以 和 Gradle 版本快取相容了。如果您是透過在 gradle.properties 檔案中設定 org.gradle.caching=true 的方式啟用建構快取,則 Lint 分析工作會盡可能從建構快取中取得輸出內容。

與 Android Gradle 外掛程式搭配執行 Lint 時,最大的瓶頸通常在於 Lint 分析工作,因此在多數情況下,啟用建構快取可以提升執行 Lint 時的建構速度。比如說,如果您的專案含有多個模組,且您在持續整合伺服器執行 Lint 之前先清理過版本目錄,就應該會發現效能獲得大幅提升。

C/C++ 模組現在可以參照相同專案內的其他 C/C++ 模組了。

使用 C/C++ 程式碼的 Gradle Android 模組現在可以進行設定,以便參照其他 Gradle 模組內的標頭檔案和程式庫程式碼。不同 Gradle 模組之間的 標頭和程式庫需 使用 Prefab 通訊協定。

必要條件

  • 消耗模組必須為 CMake,而非 ndk-build。ndk 版本支援 須使用之後的 NDK 更新。發布模組必須 為 CMakendk-build

  • 消耗模組必須在 build.gradle 檔案中啟用 prefab

android {
  buildFeatures {
    prefab true
  }
}
  • 發布模組必須在 build.gradle 中啟用 prefabPublishing
android {
  buildFeatures {
    prefabPublishing true
  }
}
  • 消耗模組必須在 build.gradle 檔案中加入 dependencies 區塊,藉此參照發布模組。例如:
dependencies {
  implementation project(':mylibrary')
}
  • 發布模組必須曝露使用 prefab 區段的封裝。例如:
android {
  prefab {
    mylibrary {
      libraryName "libmylibrary"
      headers "src/main/cpp/include"
    }
  }
}
  • 消耗模組的 CMakeLists.txt 檔案得使用 find_package() 尋找 由生產模組發布的封裝。例如:
find_package(mylibrary REQUIRED CONFIG)
target_link_libraries(
        myapplication
        mylibrary::mylibrary)
   android {
defaultConfig {
        externalNativeBuild {
          cmake {
            arguments '-DANDROID_STL=c++_shared'
          }
        }
      }
    }

如需進一步瞭解如何用 AGP 設定原生 AAR 消耗與生產,請參閱 AGP 原生依附元件

settings.gradle 檔案內的存放區設定

透過 Android Studio Bumblebee 建立新專案後, 頂層 build.gradle 檔案會包含 plugins 區塊, 後方則是清理版本目錄的程式碼:

plugins {
    id 'com.android.application' version '7.1.0-beta02' apply false
    id 'com.android.library' version '7.1.0-beta02' apply false
    id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
}

task clean(type: Delete) {
  delete rootProject.buildDir
}

之前在頂層 build.gradle 檔案內的存放區設定 現在已移到 settings.gradle 檔案內:

pluginManagement {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }
}

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    google()
    mavenCentral()
  }
}
rootProject.name = 'GradleManagedDeviceTestingNew'
include ':app'

模組層級 build.gradle 檔案並未變更。因此,請利用頂層 build.gradle 檔案和 settings.gradle 檔案來定義會套用至專案所有模組的建構設定,或是會套用到 Gradle 自身的存放區和依附元件;您可以使用模組層級的 build.gradle 檔案來定義專案內特定模組專用的建構設定。

改善資源縮減器

Android Studio Bumblebee 內含改良過的資源縮減器, 可以幫助您減少應用程式大小。

支援動態功能應用程式

Android Gradle 外掛程式 7.1.0-alpha09 內已更新預設 實作的 Android 資源縮減器。這項新實作支援縮減有動態功能的 應用程式。

進一步縮減應用程式大小功能實驗

新的資源縮減器實作可以修改資源表格,以移除未使用的值資源和未使用的檔案資源參照,藉此進一步精簡縮減過的應用程式。新的資源縮減器可以完全刪除未使用的檔案資源, 為您進一步精簡應用程式大小。目前系統尚未預設啟用此行為,您可以在專案的 gradle.properties 檔案中新增實驗選項 android.experimental.enableNewResourceShrinker.preciseShrinking=true,自行選擇加入並試用此功能。

如果您發現這個新的資源縮減器或實驗旗標有任何問題,請不吝回報。如要協助診斷問題,或是做為暫時性解決方案,建議您在專案的 gradle.properties 中加入 android.enableNewResourceShrinker=false,藉此切換回先前的實作版本。新的縮減器會將未使用的檔案型資源替換為最小化的檔案,這類檔案與舊版資源縮減器所提供的有些微差異,但應該不會對執行階段造成任何影響。

舊的實作已排定於 Android Gradle 外掛程式 8.0.0 移除。

建構變數發布

Android Gradle 外掛程式 7.1.0 以上版本可設定欲發布至 Apache Maven 存放區的 建構變數。AGP 會建立元件, 元件會根據新的發布 DSL 設定單一或多個建構變數, 您可以用此元件自訂欲發布至 Maven 存放區的內容。與先前的版本相較,由於系統不會根據預設建立任何元件,因此能夠避免執行不必要的作業。詳情請參閱發布程式碼範例

發布 Javadoc JAR

您可利用 AGP 7.1.0 以上版本,透過 Java 與 Kotlin 來源產生 Javadoc,並發布 Javadoc JAR 檔案以及供程式庫專案自動套用的建議。POM 與 Gradle 模組中繼資料 檔案內已 新增此 Javadoc。在 singleVariantmultipleVariants 發布區塊內 加入 withJavadocJar() 即可啟用此功能。詳情請參閱 發布選項程式碼範例

發布來源 JAR

AGP 7.1.0 以上版本可讓您發布 Java 與 Kotlin 來源 JAR 檔案供程式庫專案使用。POM 與 Gradle 模組中繼資料 檔案內已新增這些來源。在 singleVariantmultipleVariants 發布區塊內 加入 withSourcesJar() 即可啟用 此功能。詳情請參閱發布選項程式碼範例

程式碼檢查區塊語意變更

用於覆寫特定問題嚴重性等級的所有程式碼檢查方法: enabledisable/ignoreinformationalwarningerrorfatal 現在會 遵守設定順序了。例如,在 finalizeDsl() 中 將問題設為嚴重錯誤, 在主要 DSL 中會覆寫禁用。詳情 請參閱 lint{} 區塊 參考文件 及 Android 建構流程和擴充點

移除 Navigation Safe Args Gradle 外掛程式 所依附的 AGP API。AGP 7.1 無法搭配 Navigation Safe Args 2.4.0-rc1 及 2.4.0 等 版本使用,但是可以搭配 2.5.0-alpha01 及 2.4.1 等 版本。目前您可以使用 AGP 7.1 搭配 Navigation Safe Args 的 快照版本:Navigation 2.5.0-SNAPSHOT,即可解決此問題。如要使用快照版本,請按照版本 ID #8054565 相關的快照操作說明進行。

另外,Navigation Safe Args 2.4.1 和 2.5.0 版本不再能夠 搭配 AGP 4.2 使用,如需使用這些 Safe Args 版本,您必須 使用 AGP 7.0 以上的版本。

停用自動元件建立功能

從 AGP 8.0 開始,系統預設會停用自動元件建立功能。AGP 7.1 現在會自動為每個建構變數建立元件,該元件會使用與建構變數相同的名稱,並且提供內含所有建構變數的 all 元件。之後,我們會停用這項自動元件建立功能。如果要改用新行為, 您應該將 android.disableAutomaticComponentCreation 設為 true., 以便手動停用自動元件建立功能。 詳情請參閱使用 Maven 發布外掛程式

Firebase Performance Monitoring 相容性

AGP 7.1 與 Firebase Performance Monitoring Gradle 外掛程式 1.4.0 以下的版本不相容。AGP Upgrade Assistant 不會自動更新外掛程式 至 1.4.1 版本,因此,如果您使用 firebase-perf 並想 將 AGP 升級為 7.1,則需手動進行這項升級作業。

已知問題

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

應用程式專案使用 Hilt 外掛程式造成的單元測試問題

單元測試類別路徑內含未檢測的應用程式類別, 表示 Hilt 並未檢測應用程式類別,無法在執行 單元測試時處理依附插入內容。

此問題會在 7.1.1 版本中修正,詳情請參閱問題 #213534628

7.0.0 (2021 年 7 月)

Android Gradle 外掛程式 7.0.0 是主要版本,內含多種新功能及改善項目。

7.0.1 (2021 年 8 月)

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

相容性

最低版本 預設版本 附註
Gradle 7.0.2 7.0.2 詳情請參閱更新 Gradle
SDK 版本工具 30.0.2 30.0.2 安裝設定 SDK 版本工具。
NDK 21.4.7075529 安裝設定 NDK 其他版本。
JDK 11 11 詳情請參閱設定 JDK 版本

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

現在如果要用 Android Gradle 外掛程式 7.0 建構應用程式, 則必須使用 JDK 11 才能執行 Gradle。Android Studio Arctic Fox 內已封裝 JDK 11, 並設定讓 Gradle 預設使用,因此,大部分的 Android Studio 使用者 都不必變更專案設定。

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

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

Variant API 穩定版

新的 Variant API 現在可以穩定運作了。請參閱 com.android.build.api.variant 套件的新介面,以及 gradle-recipes GitHub 專案內的範例。本次新 Variant API 中, 我們透過「Artifacts」(成果) 介面提供了 一些稱作成果的 中繼檔案。這些成果如同合併的資訊清單,您可以使用第三方外掛程式和程式碼 安全取得並進行自訂。

我們會持續新增功能,藉此擴充 Variant API,並 提供更多自訂用的中繼成果。

Lint 行為變更

本節說明 Android Gradle 外掛程式 7.0.0 中的多項程式碼檢查行為的變更內容。

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

現在用 checkDependencies = true 執行程式碼檢查的速度更快了。如果 Android 專案內含設有程式庫依附元件的應用程式,則建議您將 checkDependencies 設定為 true (如下所示),並透過 ./gradlew :app:lint 執行 Lint,藉此分析所有同時執行的依附元件模組,並產生一份報告,其中包括該應用程式及所有依附元件所產生的問題。

Groovy

// build.gradle

android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts

android {
  ...
  lint {
    isCheckDependencies = true
  }
}

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

如果模組的來源和資源並未變更, 該模組便無需再度執行程式碼檢查分析工作。此時,工作的執行作業會在 Gradle 輸出內容中 顯示「UP-TO-DATE」(最新狀態)。此次變更後,如果為含有 checkDependencies = true 的應用程式模組 執行程式碼檢查,則只有變更過的模組需要進行 分析。Lint 因此得以進一步提高執行速度。

如果輸入內容無變化,那麼也不需要執行 Lint 報告工作。已知問題:當程式碼檢查工作顯示 UP-TO-DATE 時, stdout 不會列出任何程式碼檢查文字輸出內容 (問題 #191897708)。

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

AGP 不再支援使用動態功能模組執行程式碼檢查。從對應的應用程式模組執行 Lint,將會在其動態功能模組上執行程式碼檢查,並在該應用程式的 Lint 報告中列出所有問題。相關已知問題:從應用程式模組使用 checkDependencies = true 執行 Lint 時,系統不會檢查動態功能程式庫依附元件,除非這些元件同時也是應用程式依附元件 (問題 #191977888)。

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

現在執行 ./gradlew :app:lint 只會用預設變數執行程式碼檢查。在舊版 AGP 中,這樣做會用所有變數執行程式碼檢查。

R8 縮減器缺少類別警示

R8 可用更精確、更一致的方式 處理缺少類別和 -dontwarn選項。因此,建議您開始評估 R8 提出的缺少類別警示。

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

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

此警示表示系統在分析應用程式的程式碼時, 找不到類別定義 java.lang.instrument.ClassFileTransformer。通常這表示內部有錯誤, 您也有可能需要忽略這個警示。忽略警示最常見的兩大原因是:

  1. 針對 JVM 的程式庫,以及缺少的類別都屬於 JVM 程式庫類別 (如上文範例所示)。

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

您可以在 proguard-rules.pro 檔案中加入 -dontwarn 規則, 即可忽略缺少類別警示。例如:

-dontwarn java.lang.instrument.ClassFileTransformer

為了使用方便,AGP 會產生內含所有可能缺少規則的檔案, 並按照如下所示的檔案路徑撰寫內容: app/build/outputs/mapping/release/missing_rules.txt。在 proguard-rules.pro 檔案中新增規則 即可忽略警示。

在 AGP 7.0 中,缺少類別訊息會顯示為警告,您可以在 gradle.properties 中設定 android.r8.failOnMissingClasses = true,將警告改為錯誤。在 AGP 8.0 中,這類警示會變成導致建構內容故障的錯誤。您可以在 proguard-rules.pro 檔案中加入選項 -ignorewarnings, 即可保留 AGP 7.0 行為, 不過我們不建議使用此設定。

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

AGP 版本快取已於 AGP 4.1 移除。先前在 AGP 2.3 推出用於補充 Gradle 建構快取的 AGP 建構快取,已完全由 AGP 4.1 的 Gradle 建構快取所取代。本次變更不會影響建構時間。

AGP 7.0 已移除 android.enableBuildCache 屬性、android.buildCacheDir 屬性 和 cleanBuildCache 工作。

在專案中使用 Java 11 原始碼

您現在可以在應用程式專案中編譯最高 Java 11 的原始碼,這樣一來,您就能使用如私人介面方法、匿名類別專用的菱形運算子、以及 lambda 參數專用的本機變數語法等較新的語言功能。

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

Groovy

// build.gradle

android {
    compileSdkVersion 30

    compileOptions {
      sourceCompatibility JavaVersion.VERSION_11
      targetCompatibility JavaVersion.VERSION_11
    }

    // For Kotlin projects
    kotlinOptions {
      jvmTarget = "11"
    }
}

Kotlin

// build.gradle.kts

android {
    compileSdkVersion(30)

    compileOptions {
      sourceCompatibility(JavaVersion.VERSION_11)
      targetCompatibility(JavaVersion.VERSION_11)
    }

    kotlinOptions {
      jvmTarget = "11"
    }
}

移除依附元件設定

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

  • compile
    根據情況不同,這項內容已由 apiimplementation 取代。
    也適用於 *Compile 變數,例如:debugCompile
  • provided
    已由 compileOnly 取代。
    也適用於 *Provided 變數,例如:releaseProvided
  • apk
    已由 runtimeOnly 取代。
  • publish
    已由 runtimeOnly 取代。

在大多數的情況下,AGP 升級輔助程式 會自動為專案改用新設定。

使用 Android Gradle 外掛程式進行編譯時,會變更類別路徑

編譯 Android Gradle 外掛程式時,編譯的類別路徑 可能會有所變更。由於 AGP 現在內部使用 api/implementation 設定, 因此系統可能會從編譯類別路徑中移除部分成果。如果您在編譯時需要使用 AGP 依附元件,請務必將這些依附元件新增為明確的依附元件。

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

您之前可以在 Java 資源資料夾中加入原生程式庫, 並用 android.sourceSets.main.resources.srcDirs 註冊資料夾,藉此解壓縮原生程式庫, 並加入最終 APK 內。從 AGP 7.0 開始, 系統不再支援此方式,並會忽略 Java 資源 資料夾內的原生程式庫。請改為使用原生程式庫應該 使用的 DSL 方法: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 Multiplatform 支援功能的專案必須更新為 Kotlin 1.5.0, 才能使用 Android Gradle 外掛程式 7.0.0。您可以透過將 Android Gradle 外掛程式 降級至 4.2.x 解決此問題,但是我們不建議這樣使用。

詳情請參閱 KT-43944

缺少程式碼檢查輸出內容

當程式碼檢查工作為 up-to-date (最新狀態) 時,stdout 不會列出任何程式碼檢查文字輸出內容 (問題 #191897708)。詳細資訊 請參閱程式碼檢查行為變更。Android Gradle 外掛程式 7.1 會修正此問題。

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

從應用程式模組使用 checkDependencies = true 執行 Lint 時,系統不會檢查動態功能程式庫依附元件,除非這些元件同時也是應用程式依附元件 (問題 #191977888)。您可以在這些程式庫執行程式碼檢查工作,藉此解決問題。詳細資訊 請參閱程式碼檢查行為變更

4.2.0 (2021 年 3 月)

相容性

  最低版本 預設版本 附註
Gradle 6.7.1 詳情請參閱更新 Gradle
SDK 版本工具 30.0.2 30.0.2 安裝設定 SDK 版本工具。
NDK 21.4.7075529 安裝設定 NDK 其他版本。

新功能

此版本的 Android Gradle 外掛程式內附以下新功能。

預設使用 Java 語言 8 版本

從 4.2 版本開始,AGP 將預設使用 Java 8 語言層級。Java 8 可使用多種更新的語言功能,包括 lambda 運算式、 方法參照和靜態介面方法。完整支援功能清單請參閱 Java 8 文件

如需保留舊行為,請在模組層級 build.gradle.ktsbuild.gradle 檔案中明確指定 Java 7:

Groovy

// build.gradle

android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}

Kotlin

// build.gradle.kts

android {
  ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
  }
  // For Kotlin projects, compile to Java 6 instead of 7
  kotlinOptions {
    jvmTarget = "1.6"
  }
}

新 JVM 資源編譯器

Android Gradle 外掛程式 4.2 工具內附的全新 JVM 資源編譯器,取代了 AAPT2 資源編譯器的部分功能,且建構效能可能會因此獲得提升,特別是改善在 Windows 機器上執行的效能。系統會預設啟用新的 JVM 資源編譯器。

現已支援 v3 和 v4 簽署

Android Gradle 外掛程式 4.2 版現在 支援 APK v3APK v4 簽署格式了。如果想在建構中啟用這些格式, 請在模組層級 build.gradlebuild.gradle.kts 檔案中 加入下列屬性:

Groovy

// build.gradle

android {
  ...
  signingConfigs {
    config {
        ...
        enableV3Signing true
        enableV4Signing true
    }
  }
}

Kotlin

// build.gradle.kts

android {
   ...
   signingConfigs {
      config {
          ...
          enableV3Signing = true
          enableV4Signing = true
      }
   }
}

您可利用 APK v4 簽署,透過 Android 11 中的 ADB Incremental APK 安裝快速部署大型 APK。這個新旗標會負責處理部署程序中的 APK 簽署步驟。

按照變化版本設定應用程式簽署

使用者現在可以在 Android Gradle 外掛程式中,依據變化版本啟用或停用應用程式簽署

以下範例將示範 如何在 Kotlin 或 Groovy 中使用 onVariants() 方法 設定不同變化版本的應用程式簽署:

androidComponents {
    onVariants(selector().withName("fooDebug"), {
        signingConfig.enableV1Signing.set(false)
        signingConfig.enableV2Signing.set(true)
    })

新 Gradle 屬性:android.native.buildOutput

為減少建構輸出內容的雜亂資訊,AGP 4.2 會篩選來自原生建構, 並使用 CMakendk-build 的訊息, 預設只顯示 C/C++ 編譯器的輸出內容。在此之前,系統會為每個建構的 檔案產生輸出內容,導致出現大量的 資訊訊息。

如果您想查看完整的原生輸出內容,請將新的 Gradle 屬性 android.native.buildOutput 設為 verbose

您可以透過 gradle.properties 檔案或 指令列設定此屬性。

gradle.properties
android.native.buildOutput=verbose

指令列
-Pandroid.native.buildOutput=verbose

此屬性的預設值為 quiet

變更 gradle.properties 檔案行為

從 AGP 4.2 開始,您無法再用 子專案覆寫 Gradle 屬性。換句話說,如果您在子帳戶中的 gradle.properties 檔案 (而非根專案) 中宣告屬性,系統會忽略該屬性。

舉例來說,先前版本的 AGP 會讀取 projectDir/gradle.propertiesprojectDir/app/gradle.propertiesprojectDir/library/gradle.properties 等屬性的值。如果是應用程式模組,則當 projectDir/gradle.propertiesprojectDir/app/gradle.properties 出現相同的 Gradle 屬性時,會以 projectDir/app/gradle.properties 中的屬性值為準。

AGP 4.2 已變更此行為,AGP 不會再從子專案的 gradle.properties 載入內容值 (例如:projectDir/app/gradle.properties)。這項異動反映了新的 Gradle 行為,同時也支援設定快取

如果想進一步瞭解如何在 gradle.properties 檔案設定內容值, 請參閱 Gradle 文件

Gradle 相容性與設定變更

在 Android Studio 中執行時 Gradle 建構工具時,工具會使用 Studio 隨附的 JDK。在先前的版本中,Studio 隨附的是 JDK 8。不過在 4.2 版中, 已經改為封裝 JDK 11。使用隨附的新 JDK 執行 Gradle 時,可能會因為垃圾收集器的異動而產生不相容的問題,或者影響 JVM 的效能。這些問題說明如下。

注意:儘管我們建議搭配 JDK 11 執行 Gradle,您仍然可以透過 Project Structure (專案結構) 對話方塊變更用以執行 Gradle 的 JDK。變更此設定只會變更執行 Gradle 所用的 JDK, 不會變更執行 Studio 所用的 JDK。

Studio 與 Android Gradle 外掛程式 (AGP) 相容性

Android A 4.2 可以開啟使用 AGP 3.1 以上版本的專案了,前提是 AGP 執行的是 Gradle 4.8.1 以上的版本。若要進一步瞭解 Gradle 相容性,請參閱更新 Gradle

為 JDK 11 最佳化 Gradle 版本

本次 JDK 11 更新將會影響 JVM 垃圾收集器的預設設定,這是因為 JDK 8 使用平行垃圾收集器,而 JDK 11 使用 G1 垃圾收集器的緣故。

為了提升建構效能,我們建議您使用平行垃圾收集器測試 Gradle 版本。在 gradle.properties 中設定以下內容:

org.gradle.jvmargs=-XX:+UseParallelGC

如果此欄位已設有其他選項,請新增選項:

org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC

如果想用其他設定測量建構速度,請參閱建立版本設定檔一文。

minSdk = 28 以上時,APK 內的 DEX 檔案解壓縮

現在當 minSdk = 28 以上時, AGP 預設會封裝未壓縮的 DEX 檔案。這樣做會增加 APK 的大小,不過裝置上的安裝大小 會減少,至於下載大小則大致相同。

若要強制 AGP 封裝壓縮的 DEX 檔案, 您可以在 build.gradle 檔案中加入以下內容:

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
    }
}

使用 DSL 封裝壓縮的原生程式庫

我們建議您用未壓縮形式封裝原生程式庫, 這樣做可以減少應用程式安裝大小,也能減少應用程式的下載大小, 並能為使用者縮短應用程式的載入時間。不過,如果您想在建構應用程式時,讓 Android Gradle 外掛程式封裝經過壓縮的原生程式庫,則請在應用程式的 build.gradle 檔案中,將 useLegacyPackaging 設為 true

android {
    packagingOptions {
        jniLibs {
            useLegacyPackaging true
        }
    }
}

旗標 useLegacyPackaging 會取代資訊清單屬性 extractNativeLibs。如需更多背景資訊,請參閱預設以未壓縮方式封裝的原生程式庫相關版本資訊。

4.1.0 (2020 年 8 月)

相容性

  最低版本 預設版本 附註
Gradle 6.5 詳情請參閱更新 Gradle
SDK 版本工具 29.0.2 29.0.2 安裝設定 SDK 版本工具。
NDK 21.1.6352462 安裝設定 NDK 其他版本。

新功能

此版本的 Android Gradle 外掛程式內附以下新功能。

Kotlin 指令碼 DSL 支援

為改善 Kotlin 建構指令碼使用者的編輯體驗,Android Gradle 外掛程式 4.1 的 DSL 和 API 現可在實作類別以外的一組 Kotlin 介面內加以定義。這表示:

  • Kotlin 類型現在可以明確宣告是否可為空值以及可變動性了。
  • 這些介面所產生的文件已發布 至 Kotlin API 參考資料
  • 我們明確定義了 Android Gradle 外掛程式的 API 途徑, 以便讓後續 Android 版本更加穩定。

可在 DSL 內變動的收集類型現在一律定義為:

val collection: MutableCollectionType

這表示,以下內容無法再如同之前 支援這些內容的集合一樣寫入 Kotlin 指令碼:

collection = collectionTypeOf(...)

不過,集合變動方式都會一律受到支援, 所以 collection += …collection.add(...) 現在應該到處都能正常運作了。

如果您在升級使用 Android Gradle 外掛程式 Kotlin API 和 DSL 的專案時發現任何問題,請回報錯誤

從 AAR 匯出 C/C++ 依附元件

Android Gradle 外掛程式 4.0 新增了在 AAR 依附元件中匯入 Prefab 套件的功能。AGP 4.1 現在可以為 Android 程式庫專案的 AAR 匯出外部原生版本內的程式庫了。

如果想匯出原生程式庫,請將以下內容加入程式庫 專案中 build.gradle 檔案的 android 區塊:

Groovy


buildFeatures {
    prefabPublishing true
}

prefab {
    mylibrary {
      headers "src/main/cpp/mylibrary/include"
    }

    myotherlibrary {
        headers "src/main/cpp/myotherlibrary/include"
    }
}

Kotlin


buildFeatures {
    prefabPublishing = true
}

prefab {
    create("mylibrary") {
      headers = "src/main/cpp/mylibrary/include"
    }

    create("myotherlibrary") {
        headers = "src/main/cpp/myotherlibrary/include"
    }
}

在此範例中,來自 ndk-build 或 CMake 外部原生建構系統的 mylibrarymyotherlibrary 程式庫都會封裝在由建構作業產生的 AAR 內,而這些程式庫也會各自將標頭從指定目錄匯出至它們的依附元件中。

Kotlin 中繼資料的 R8 支援

Kotlin 會在 Java 類別檔案中使用自訂中繼資料,以便識別 Kotlin 語言結構。R8 現在支援維護和重新寫入 Kotlin 中繼資料, 以便完全支援使用 kotlin-reflect 縮減 Kotlin 程式庫和 應用程式的功能。

若要保留 Kotlin 中繼資料,請新增下列保留規則:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

這樣做會讓 R8 保留所有直接保留類別 的 Kotlin 中繼資料。

詳情請參閱 Medium 上的透過 R8 使用 Kotlin 反映縮減 Kotlin 程式庫和應用程式

偵錯版本的斷言

使用 Android Gradle 外掛程式 4.1.0 以上版本為應用程式建構偵錯版本後, 內建編譯器 (R8) 會重新寫入應用程式核心,藉此在編譯時間啟用斷言, 以便您隨時啟用 斷言檢查。

行為變更

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

AGP 建構快取已於 AGP 4.1 移除。先前在 AGP 2.3 推出用於補充 Gradle 建構快取的 AGP 建構快取,已完全由 AGP 4.1 的 Gradle 建構快取所取代。本次變更不會影響建構時間。

cleanBuildCache 工作、android.enableBuildCacheandroid.buildCacheDir 屬性 已遭淘汰,AGP 7.0 將會移除 這些項目。android.enableBuildCache 屬性目前沒有實際作用, android.buildCacheDir 屬性和 cleanBuildCache 工作在 AGP 7.0 前 都會繼續運作,以便刪除現有的 AGP 建構 快取內容。

使用程式碼縮減功能的應用程式已大幅縮小

從這個版本開始,系統不再預設保留 R 類別的欄位,從而讓啟用程式碼縮減功能的應用程式大幅縮減 APK 大小。除非您透過反映方式存取 R 類別,此時, 您必須為這些 R 類別新增保留規則, 否則任何行為應該都不會有變化。

android.namespacedRClass 屬性已重新命名為 android.nonTransitiveRClass

實驗旗標 android.namespacedRClass 已重新命名為 android.nonTransitiveRClass

gradle.properties 檔案中設定此旗標後,所有程式庫 R 類別都可啟用命名空間, 如此一來,R 類別只會納入程式庫本身宣告的資源, 而不會納入程式庫依附元件的資源,藉此減少程式庫 R 類別 的大小。

Kotlin DSL:coreLibraryDesugaringEnabled 已重新命名

Kotlin DSL 編譯選項 coreLibraryDesugaringEnabled 已變更 為 isCoreLibraryDesugaringEnabled。若想進一步瞭解此旗標, 請參閱 Java 8+ API 脫糖支援 (Android Gradle 外掛程式 4.0.0+)

已從程式庫專案的 BuildConfig 類別中移除版本屬性

我們已從系統產生的 BuildConfig 類別中移除 BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE 屬性,原因是這些靜態值無法反映應用程式版本代碼及名稱的最終值,從而誤導使用者;這項變更僅適用於程式庫專案。此外,系統會在合併資訊清單時捨棄這些內容值。

日後的 Android Gradle 外掛程式版本也會從程式庫專用的 DSL 中移除 versionNameversionCode 屬性。目前您無法從程式庫子專案自動從取應用程式的 版本代碼/名稱。

應用程式模組沒有任何變更,您仍然可以透過 DSL 指派 versionCodeversionName 的值;這些值會推送至應用程式的資訊清單和 BuildConfig 欄位。

設定 NDK 路徑

您可以在模組的 build.gradle 檔案中利用 android.ndkPath 屬性,設定本機 NDK 安裝的路徑。

Groovy

android {
   ndkPath "your-custom-ndk-path"
}

Kotlin

android {
   ndkPath = "your-custom-ndk-path"
}

如果您搭配 android.ndkVersion 屬性 使用這項屬性,則此路徑必須包含與 android.ndkVersion 相符的 NDK 版本。

程式庫單元測試行為變更

我們變更了程式庫單元測試的編譯和執行方式。現在 程式庫的單元測試會按照程式庫本身的編譯/執行時間類別 進行編譯和執行,使單元測試消耗程式庫的方式和外部子專案 方式一致,這個設定一般可以讓測試 更完善。

某些情況下,使用資料繫結的程式庫單元測試 可能會發生缺少 DataBindingComponentBR 等類別 的問題。這些測試需要轉移到 androidTest 專案中進行設備化測試, 因為這些類別的編譯和執行功能在單元測試中可能會產生 錯誤的輸出內容。

io.fabric Gradle 外掛程式已遭淘汰

io.fabric Gradle 外掛程式已經淘汰,且與 4.1 版的 Android Gradle 外掛程式不相容。如果想進一步瞭解已遭淘汰的 Fabric SDK, 以及如何改為使用 Firebase Crashlytics SDK, 請參閱升級至 Firebase Crashlytics SDK

4.0.0 (2020 年 4 月)

這個版本的 Android 外掛程式須使用下列項目:

4.0.1 (2020 年 7 月)

本次要更新支援新預設設定 的相容性,以及 Android 11 套件 瀏覽權限的功能

舊版 Android 可瀏覽裝置內所有 安裝的應用程式。從 Android 11 (API 級別 30) 開始, 應用程式預設只能存取特定篩選清單內的已安裝套件內容。如果想查看更詳細的系統應用程式清單, 需要在應用程式 或程式庫的 Android 資訊 清單內加入 <queries> 元素

Android Gradle 外掛程式 4.1+ 已可和新的 <queries> 宣告相容,但是舊版無法相容。如果您加入 <queries> 元素,或是開始仰賴支援指定 Android 11 的程式庫或 SDK,則可能會在建構應用程式時發生資訊清單合併錯誤。

為解決此問題,我們針對 AGP 3.3 以上的版本發布了一組 修補程式。如果您使用的是舊版 AGP, 請升級為 以下任一種版本:

如果您使用的是
AGP 版本……
……請升級至:
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

若要進一步瞭解這項新功能, 請參閱 Android 11 的套件 瀏覽權限

新功能

此版本的 Android Gradle 外掛程式內附以下新功能。

Android Studio 版本分析器支援

「Build Analyzer」(版本分析器) 視窗有助於瞭解及診斷建構程序相關問題,例如已停用的最佳化功能,以及設定有誤的工作。此功能位於有 Android Gradle 外掛程式 4.0.0 以上版本的 Android Studio 4.0 或 以上版本內。透過以下方法就能從 Android Studio 開啟「Build Analyzer」(版本分析器) 視窗:

  1. 如果您尚未建構應用程式,請從選單列中依序選取「Build」(建構) >「Make Project」(建立專案) 來建構應用程式。
  2. 在選單列中依序選取「View」(檢視) >「Tool Windows」(工具視窗)
  3. 在「Build」(建構) 視窗中,透過下列其中一種方式開啟「Build Analyzer」(版本分析器) 視窗:
    • 等 Android Studio 建構完專案後,按一下「Build Analyzer」(版本分析器) 分頁標籤。
    • 等 Android Studio 建構完專案後,按一下「Build Output」(建構輸出) 視窗右側的連結。

系統會透過「Build Analyzer」(版本分析器) 視窗左側的樹狀結構整理出可能的建構問題。您可以逐一檢查並點選問題,在右側面板中調查相關詳細資料。分析建構作業時,Android Studio 會計算一組工作來判斷建構作業所需的時間,並以視覺化方式呈現相關資訊,以協助您瞭解各項工作產生的影響。此外,您也可以展開「Warnings」(警告) 節點,以便查看警告的詳細資料。

如要瞭解詳情,請參閱辨識建構速度迴歸

D8 和 R8 中 Java 的 Java 8 程式庫脫糖程序

Android Gradle 外掛程式現在支援使用許多 Java 8 語言 API,而不針對應用程式設下最低 API 級別限制。

透過「脫糖」程序,Android Studio 3.0 以上版本的 DEX 編譯器 D8 已支援多種 Java 8 語言功能,例如 lambda 運算式、預設介面方法、試用資源等。Android Studio 4.0 版的脫糖引擎則進一步提供適用於 Java 語言 API 的脫糖程序。也就是說,您現在可以在支援舊版 Android 的應用程式中,加入原先只能在較新 Android 版本中使用的標準語言 API,例如 java.util.streams

這個版本支援以下 API 組合:

  • 依序串流 (java.util.stream)
  • java.time」的子集
  • java.util.function
  • java.util.{Map,Collection,Comparator} 的近期新增項目
  • 選用項目 (java.util.Optionaljava.util.OptionalIntjava.util.OptionalDouble) 以及部分適用於上述 API 的其他新類別
  • java.util.concurrent.atomic 的新增項目 (AtomicIntegerAtomicLongAtomicReference 上的新方法)
  • ConcurrentHashMap (修正 Android 5.0 錯誤)

為了支援這些語言 API,D8 會編譯獨立的程式庫 DEX 檔案 (包含所缺少 API 的實作項目) 並將這個檔案加到應用程式中。這個脫糖程序會重新編寫應用程式的程式碼,在執行階段改為使用這個程式庫。

如要啟用這些語言 API 的支援功能,請在應用程式模組build.gradle 檔案中加入以下內容:

Groovy


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'
}

Kotlin


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")
}

請注意,在下列情況下,您可能需要在程式庫模組build.gradle 檔案中納入上述程式碼片段:

  • 程式庫模組的檢測設備測試會使用這些語言 API (直接或透過程式庫模組或其依附元件)。這樣一來,就能為您的檢測設備測試 APK 提供缺少的 API。

  • 您希望單獨執行程式庫模組中的程式碼檢查。可協助程式碼檢查辨識語言 API 的有效用量,並避免誤報警示。

啟用或停用建構功能的新選項

Android Gradle 外掛程式 4.0.0 推出了新的控管方式,讓您能分別啟用及停用各項建構功能,例如檢視繫結和資料繫結。系統預設會停用這些新增功能。透過使用 buildFeatures 區塊, 您也可以只啟用想要的功能, 藉此幫助您最佳化專案的建構效能。您可以透過模組 階層的 build.gradle 檔案為每個模組設定這些選項,如下所示:

Groovy


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
    }
}

Kotlin


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
    }
}

您也可以在專案的 gradle.properties 檔案中加入下列一或多項設定,藉此為專案內的所有模組指定這些功能的預設設定 (方法如下所示)。請注意,您依然可以使用 模組層級 build.gradle 檔案中的 buildFeatures 區塊 覆寫以上專案預設設定。

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

功能對功能依附元件

在先前的 Android Gradle 外掛程式版本中,所有功能模組都只能依附應用程式的基礎模組。現在使用 Android Gradle 外掛程式 4.0.0 時, 您可以加入依附另一個功能模組的功能 模組。也就是說,:video 功能可以將依附基礎模組的 :camera 功能當做依附元件,如下圖所示。

功能對功能依附元件

功能模組 :video 將依附基礎 :app 模組的 :camera 功能當做依附元件。

這表示當應用程式要求下載某個功能模組時,應用程式也會下載它所依附的其他功能模組。為應用程式建立功能模組後,您可以在該模組的 build.gradle 檔案中宣告功能對功能依附元件。比方說,您可以將 :video 模組宣告為依附 :camera,如下所示:

Groovy


// 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')
    ...
}

Kotlin


// 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"))
    ...
}

此外,您應在 Android Studio 中啟用功能對功能依附元件功能 (例如,在編輯執行設定時支援此功能),方法是前往選單列依序點選「Help」(說明) >「Edit Custom VM Options」(編輯自訂 VM 選項),然後加入以下項目:

-Drundebug.feature.on.feature=true

依附元件中繼資料

使用 Android Gradle 外掛程式 4.0.0 以上版本建構應用程式時,外掛程式會加入相關中繼資料,用於描述編譯至應用程式中的依附元件。在應用程式上傳期間,Play 管理中心會檢查這些中繼資料,讓您享有以下好處:

  • 針對應用程式所用 SDK 和依附元件的已知問題接收相關快訊
  • 獲得實用意見回饋,以便解決這些問題

資料會經過壓縮、透過 Google Play 簽署金鑰加密,並儲存在所發布應用程式的簽署區塊中。不過,您可以前往以下目錄,在本機中繼建構檔案中自行檢查相關中繼資料:<project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt

如果不想提供這項資訊,您可以在模組的 build.gradle 檔案中加入以下內容,選擇停用這項設定:

Groovy


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

Kotlin


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

從 AAR 依附元件匯入原生程式庫

您現在可以從應用程式的 AAR 依附元件 匯入 C/C++ 程式庫了。您按照下文設定步驟說明操作時, Gradle 便會自動將這些原生程式庫提供給您的 外部原生建構系統 (如 CMake) 使用。請注意,Gradle 只會提供這些程式庫讓建構作業使用,您仍然必須設定建構指令碼,才能使用這些程式庫。

系統會以 Prefab 套件格式匯出程式庫。

每項依附元件最多可曝露一個 Prefab 套件,其中包含一或多個模組。Prefab 模組是單一程式庫,可以是共用、 靜態或僅限標頭的程式庫。

一般來說,套件名稱會和 Maven 成果名稱相同, 而模組名稱會和程式庫名稱相同,但是並非一定如此。由於您需要知道程式庫的套件和模組名稱,因此可能需要參閱依附元件的文件,以便判斷這些名稱為何。

設定外部原生建構系統

若要查看操作步驟,請按一下您想使用的 外部原生建構系統名。

所有內含原生程式碼的應用程式 AAR 依附元件都會曝露一個 Android.mk 檔案, 您需要將此檔案匯入 ndk-build 專案內。您可以用 import-module 指令匯入檔案, 這樣做會用您 ndk-build 專案內的 import-add-path 屬性 搜尋您指定的路徑。舉例來說, 如果應用程式定義 libapp.so,並使用 curl, 則您應該在 Android.mk 檔案中加入以下內容:

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)

您現在可以在 app.cpp 中指定 #include "curl/curl.h" 了。建構專案時, 您的外部原生建構系統會自動將 libapp.so 連結 到 libcurl.so,並將 libcurl.so 封裝到 APK 或應用程式套件內。更詳細的資訊請參閱 curl 預製範例

行為變更

使用這個版本的外掛程式時,您可能會遇到以下行為異動。

v1/v2 簽署設定更新項目

signingConfig 區塊中的應用程式簽署設定行為已變更為下列內容:

v1 簽署
  • 如果明確啟用 v1SigningEnabled,AGP 會執行 v1 應用程式簽署。
  • 如果使用者已明確停用 v1SigningEnabled,則系統不會執行 v1 應用程式 簽署。
  • 如果使用者並未明確啟用 v1 簽署, 則可以根據 minSdktargetSdk 自動停用。
v2 簽署
  • 如果明確啟用 v2SigningEnabled,AGP 會執行 v2 應用程式簽署。
  • 如果使用者已明確停用 v2SigningEnabled,系統不會執行 v2 應用程式 簽署。
  • 如果使用者尚未明確啟用 v2 簽署, 則可以根據 targetSdk 自動停用。

這些異動可讓 AGP 根據使用者是否明確啟用這些旗標來停用簽署機制,藉此最佳化建構作業。在此版本之前, 即使已經明確啟用,v1Signing 依然有可能遭到停用, 讓使用者感到不解。

移除 featureinstantapp 等 Android Gradle 外掛程式

Android Gradle 外掛程式 3.6.0 淘汰了功能外掛程式 (com.android.feature) 和免安裝應用程式外掛程式 (com.android.instantapp),以便改用動態功能外掛程式 (com.android.dynamic-feature),以 Android App Bundle 格式建構及封裝免安裝應用程式。

Android Gradle 外掛程式 4.0.0 以上版本會完全移除這些淘汰的 外掛程式。因此,如要使用最新版的 Android Gradle 外掛程式,就必須遷移您的免安裝應用程式,改為支援 Android App Bundle。遷移免安裝應用程式後,您就能善用應用程式套件的優勢,並簡化應用程式的模組設計

移除分割註解處理功能

移除了將註解處理分割為專用工作的功能。這個選項的用途是在僅限 Java 的專案中使用非漸進式註解處理工具時,用來維持漸進式的 Java 編譯作業,啟用方式為在 gradle.properties 檔案中,將 android.enableSeparateAnnotationProcessing 設為 true,這個方法現已無效。

您應該改為 使用漸進式註解處理工具, 以便改善建構效能。

淘汰 includeCompileClasspath

Android Gradle 外掛程式不會再檢查或納入您在編譯類別路徑中宣告的註解處理工具,且 annotationProcessorOptions.includeCompileClasspath DSL 屬性已無任何作用。如果您在編譯類別路徑中加入註解處理工具,便可能會看到下列錯誤:

Error: Annotation processors must be explicitly declared now.

為解決此問題,您必須使用 annotationProcessor 依附元件設定 在 build.gradle 檔案中加入註解處理工具。詳情請參閱新增註解處理工具

自動封裝 CMake 使用的預先建構依附元件

之前的 Android Gradle 外掛程式版本必須 使用 jniLibs 明確封裝任何 CMake 外部 原生建構使用的預先建構程式庫。模組的 src/main/jniLibs 目錄可能就有程式庫, 或可能在 build.gradle 檔案所設定的其他 目錄:

Groovy

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']
    }
}

Kotlin

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"))
    }
}

Android Gradle 外掛程式 4.0 已不再需要以上設定,並會導致建構失敗:

* 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'

外部原生建構現在會自動封裝這些程式庫, 因此使用 jniLibs 明確封裝程式庫會造成 重複操作。如要避免發生建構錯誤,請將預先建構的程式庫移到 jniLibs 以外的位置,或者從 build.gradle 檔案中移除 jniLibs 設定。

已知問題

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

Gradle 工作站機制中的競爭狀況

搭配使用 --no-daemon 和 Gradle 6.3 以下版本執行時,Android Gradle 外掛程式 4.0 的異動可能會在 Gradle 內觸發競爭狀況,進而造成建構作業在完成後停止運作的情況。

Gradle 6.4 將會修正此問題。

3.6.0 (2020 年 2 月)

這個版本的 Android 外掛程式須使用下列項目:

新功能

此版本的 Android Gradle 外掛程式內附以下新功能。

檢視繫結

參照程式碼中的檢視畫面時,檢視繫結可提供編譯時間安全。您現在可以將 findViewById() 替換為自動產生的繫結類別參照了。若要開始使用檢視繫結,請在所有模組的 build.gradle 檔案中加入以下內容:

Groovy


android {
    viewBinding.enabled = true
}

Kotlin


android {
    viewBinding.enabled = true
}

如要瞭解詳情,請參閱檢視繫結 文件

Maven Publish 外掛程式支援

Android Gradle 外掛程式提供對 Maven Publish Gradle 外掛程式的支援,因此您可以將建構構件發布至 Apache Maven 存放區。Android Gradle 外掛程式會為應用程式或程式庫模組中的每個建構變數構件建立元件,方便您用來自訂 Maven 存放區的發布內容

如要瞭解詳情,請參閱如何使用 Maven Publish 外掛程式頁面。

全新的預設封裝工具

建構應用程式的偵錯版本時,外掛程式會使用名為 zipflinger 的新封裝工具來建構 APK。這個新工具應該可以改善建構速度。如果這項新封裝工具的運作情形不如預期,請回報錯誤。您可以在 gradle.properties 檔案中加入以下內容, 即可改回使用舊版封裝工具:

android.useNewApkCreator=false

原生建構屬性

您現在可以決定 Clang 建構所需的時間,並將每個 C/C++ 檔案連結到您的專案內。Gradle 可以輸出 Chrome 追蹤記錄,當中會提供這些編譯器事件的時間戳記,讓您能夠瞭解建構專案所需的時間。若要輸出這個建構屬性檔案,請按照下列 方式操作:

  1. 在執行 Gradle 建構作業時新增 -Pandroid.enableProfileJson=true 旗標。例如:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. 開啟 Chrome 瀏覽器,然後在搜尋列中輸入 chrome://tracing

  3. 按一下「Load」(讀取) 按鈕,然後前往 project-root/build/android-profile 尋找檔案,檔案名稱為 profile-timestamp.json.gz

檢視畫面頂端會顯示如下原生建構屬性資料:

Chrome 的原生建構屬性追蹤記錄

行為變更

使用這個版本的外掛程式時,您可能會遇到以下行為異動。

預設以未壓縮方式封裝的原生程式庫

建構應用程式時,外掛程式現在會預設將 extractNativeLibs 設為 "false"。這表示您的原生程式庫會對齊頁面,並會用未壓縮的方式 封裝。雖然這樣的上傳大小較大,但是您的使用者可以 享有以下好處:

  • 減少應用程式安裝大小,因為平台可以直接透過安裝的 APK 存取原生程式庫, 不必建立程式庫複本。
  • 減少下載大小,因為如果您的 APK 或 Android App Bundle 內含 未壓縮原生程式庫,通常 Play 商店的壓縮方式都會更好。

如果想讓 Android Gradle 外掛程式改為封裝經過壓縮的原生程式庫,請在應用程式的資訊清單中加入以下內容:

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

預設 NDK 版本

現在如果您下載了多個 NDS 版本,則 Android Gradle 外掛程式會在編譯原始碼檔案時 選擇預設版本。外掛程式以往會選用最新下載的 NDK 版本。使用模組內的 build.gradle 檔案的 android.ndkVersion 屬性即可覆寫 外掛程式選擇的預設值。

簡化 R 類別產生作業

Android Gradle 外掛程式只會為專案的每個程式庫模組 產生一個 R 類別,並會透過其他模組依附元件分享 這些 R 類別,藉此簡化編譯類別路徑。這項最佳化項目應該可以提昇建構速度,但是您必須注意:

  • 由於編譯器會和上游模組依附元件共用 R 類別, 因此專案內每個模組都務必使用獨特的套件名稱。
  • 其他專案依附元件的程式庫 R 類別瀏覽權限 由納入該程式庫作為依附元件的設定決定。舉例來說,假設程式庫 A 內含程式庫 B 做為「api」依附元件,則程式庫 A 和其他依附程式庫 A 的程式庫都有權存取程式庫 B 的 R 類別。但是如果程式庫 A 使用 implementation 依附元件設定, 則其他程式庫可能便無法存取程式庫 B 的 R 類別。若想瞭解詳情, 請參閱依附元件 設定

移除預設設定缺少的資源

程式庫模組中若有您在預設資源集並未納入的語言資源 (舉例 來說,如果您納入 hello_world 作為 /values-es/strings.xml 的字串資源,但是 您並未將該資源定義為屬於 /values/strings.xml),則 Android Gradle 外掛 程式編譯專案時, 將不會再納入該資源。這項行為變更應該可以 減少 Resource Not Found 執行階段例外, 並改善建構速度。

D8 現在會遵守備註 CLASS 保留政策了

現在當編譯應用程式時,D8 會遵守備註套用的 CLASS 保留政策, 而且執行階段不再能夠使用這些備註了。就算您將應用程式的目標 SDK 設為 API 級別 23,系統也會如此運作。但在以往,使用舊版 Android Gradle 外掛程式和 D8 編譯應用程式時,只要進行上述設定即可在執行階段存取這些註解。

其他行為變更

  • aaptOptions.noCompress 在所有 (適用於 APK 和套件的) 平台都不會再區分大小寫,並且會遵循使用大寫字元的路徑。
  • 資料繫結現在預設是漸進式了。如要瞭解詳情,請參閱 問題 #110061530
  • 所有單元測試 (包括 Roboelectric 單元測試) 現在都可以完整快取了。如要瞭解詳情,請參閱 問題 #115873047

修正錯誤

這個版本的 Android Gradle 外掛程式修正了以下錯誤:

  • 使用資料繫結的程式庫模組現在 支援 Robolectric 單元測試了。如要瞭解詳情,請參閱 問題 #126775542
  • 您現在可以在啟用 Gradle 平行執行模式的情況下,跨多個模組執行 connectedAndroidTest 工作。

已知問題

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

Android Lint 工作的效能很差

由於剖析基礎架構內發生迴歸現象,因此 Android Lint 可能需要花費更長的時間才能完成部分專案,進而導致某些程式碼結構中的 lambda 推測類型計算速度變慢。

此問題已回報為 IDEA 錯誤, Android Gradle 外掛程式 4.0 將會修正此問題。

缺少資訊清單類別

如果應用程式在資訊清單中定義自訂權限,則 Android Gradle 外掛程式通常會產生 Manifest.java 類別,並加入自訂權限做為字串常數。外掛程式會將此類別封裝至應用程式,方便您在執行階段輕鬆參照這些權限。

在 Android Gradle 外掛程式 3.6.0 中,產生資訊清單類別的功能無法運作。如果您使用這個外掛程式版本建構應用程式,並參照該資訊清單類別,就可能會看到 ClassNotFoundException 例外狀況。如要解決這個問題, 請按照下列其中一種做法進行:

  • 以完整的權限名稱參照自訂權限。例如: "com.example.myapp.permission.DEADLY_ACTIVITY"
  • 自行定義常數,如下所示:

    public final class CustomPermissions {
      public static final class permission {
        public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
      }
    }
    

3.5.0 (2019 年 8 月)

Android Studio 3.5 同時推出的 Android Gradle 外掛程式 3.5.0 是主要版本,也是 Project Marble 的執行結果,這個版本著重於改善 Android 開發人員工具的三大面向:系統健康狀態、功能改善和錯誤修正。本次更新 特別注重 改善專案建構速度

如需相關資訊和其他 Project Marble 最新消息,請參閱 Android 開發人員網誌文章或以下各章節。

這個版本的 Android 外掛程式須使用下列項目:

3.5.4 (2020 年 7 月)

本次要更新支援新預設設定 的相容性,以及 Android 11 套件 瀏覽權限的功能

詳情請參閱 4.0.1 版本資訊

3.5.3 版 (2019 年 12 月)

本次要更新 支援 Android Studio 3.5.3, 並有多項修正錯誤和改善效能項目。

3.5.2 (2019 年 11 月)

本次要更新 支援 Android Studio 3.5.2, 並有多項修正錯誤和改善效能項目。如要查看重要錯誤修正清單,請參閱版本更新網誌上的相關文章。

3.5.1 版 (2019 年 10 月)

本次要更新 支援 Android Studio 3.5.1, 並有多項修正錯誤和改善效能項目。如要查看重要錯誤修正清單,請參閱版本更新網誌上的相關文章。

漸進式註解處理

如果您在 gradle.properties 檔案中設定 android.databinding.incremental=true資料繫結註解處理工具即可支援漸進式註解處理。這項最佳化可以漸進改善建構效能。最佳化註解處理工具的完整清單請參閱漸進式註解處理工具一表。

此外,KAPT 1.3.30 以上版本也支援漸進式註解處理工具,只要在 gradle.properties 檔案中加入 kapt.incremental.apt=true 即可啟用這項功能。

可快取單元測試

includeAndroidResources 設為 true,讓單元測試能夠使用 Android 資源、資產以及資訊清單後,Android Gradle 外掛程式便會產生測試設定檔,而其中所含的絕對路徑會導致快取無法移動位置。只要在 gradle.properties 檔案中加入以下項目,指示外掛程式改為使用相對路徑產生測試設定,即可讓 AndroidUnitTest 工作完整快取:

android.testConfig.useRelativePath = true

已知問題

  • 使用 Kotlin Gradle 外掛程式 1.3.31 以下版本時,您可能會在建構或同步處理專案時看到以下警告訊息:

    WARNING: API 'variant.getPackageLibrary()' is obsolete and has been replaced
             with 'variant.getPackageLibraryProvider()'.
    

    若想解決此問題,請將外掛程式升級為 1.3.40 以上的版本。

3.4.0 (2019 年 4 月)

這個版本的 Android 外掛程式須使用下列項目:

3.4.3 (2020 年 7 月)

本次要更新支援新預設設定 的相容性,以及 Android 11 套件 瀏覽權限的功能

詳情請參閱 4.0.1 版本資訊

3.4.2 (2019 年 7 月)

本次要更新 支援 Android Studio 3.4.2, 並有多項修正錯誤和改善效能項目。如要查看重要錯誤修正清單,請參閱版本更新網誌上的相關文章。

3.4.1 (2019 年 5 月)

本次要更新 支援 Android Studio 3.4.1, 並有多項修正錯誤和改善效能項目。如要查看重要錯誤修正清單,請參閱版本更新網誌上的相關文章。

新功能

  • 新的 Lint 檢查依附元件設定:我們已變更 lintChecks 的行為,並導入新的依附元件設定 lintPublish,讓您能精確掌控 Android 程式庫要封裝哪些 Lint 檢查。

    • lintChecks:此為現有設定,當您只想在本機建構專案時,程式碼檢查應使用此選項。如果您先前是使用 lintChecks 依附元件設定,在已發布的 AAR 中加入 Lint 檢查,則您必須遷移這些依附元件,改為使用如下所述的 lintPublish 新設定。
    • lintPublish:如要在已發布的 AAR 中加入 Lint 檢查,請在程式庫專案中使用這項新設定 (如下所示)。這代表消耗程式庫的專案現在也會套用這些程式碼檢查。

    以下程式碼範例會在本機 Android 程式庫專案中同時使用兩種依附元件設定。

    Groovy

    
    dependencies {
    // Executes lint checks from the ':lint' project at build time.
    lintChecks project(':lint')
    // Packages lint checks from the ':lintpublish' in the published AAR.
    lintPublish project(':lintpublish')
    }
    

    Kotlin

    
    dependencies {
    // Executes lint checks from the ':lint' project at build time.
    lintChecks(project(":lint"))
    // Packages lint checks from the ':lintpublish' in the published AAR.
    lintPublish(project(":lintpublish"))
    }
    
  • 一般來說,封裝和簽署工作應該都可以提昇建構速度。如果您發現這些工作發生效能迴歸,請回報問題

行為變更

  • Android 免安裝應用程式功能外掛程式淘汰警告:如果您仍在使用 com.android.feature 外掛程式建構免安裝應用程式,Android Gradle 外掛程式 3.4.0 便會向您發出淘汰警告。如要確保您仍然可以透過未來版本的外掛程式建構免安裝應用程式,請遷移免安裝應用程式來改用動態功能外掛程式,這個外掛程式也能讓您透過單一 Android App Bundle 發布安裝應用程式和免安裝應用程式體驗。

  • 預設啟用 R8:R8 將脫糖、縮減、模糊化、最佳化以及 DEX 處理整合為單一步驟,結果讓建構效能獲得大幅提升。R8 是在 Android Gradle 外掛程式 3.3.0 版導入,現在預設會為使用外掛程式 3.4.0 以上版本的應用程式和 Android 程式庫專案啟用。

    下圖概略說明導入 R8 之前的編譯程序。

    在導入 R8 之前,ProGuard 是與 DEX 和脫糖不同的編譯步驟。

    現在有了 R8,脫糖、縮減、模糊化、最佳化和 DEX 處理 (D8) 全都可透過單一步驟完成,如下圖所示。

    透過 R8,您只要執行一個編譯步驟,就能進行脫糖、縮減、模糊化、最佳化和 DEX 處理。

    提醒您,R8 能夠與現有 ProGuard 規則搭配運作,因此您可能不需要採取任何行動就能享有 R8 的好處。不過,由於 R8 與專為 Android 專案設計的 ProGuard 採用的是不同技術,因此進行縮減和最佳化作業可能會導致 ProGuard 本來不會移除的程式碼遭到移除。在這類罕見情況下,您可能得新增額外規則,讓建構輸出內容保留該程式碼。

    如果您在使用 R8 時遇到問題,請參閱 R8 相容性常見問題,看看是否有該問題的解決方案。如果當中沒有提供解決方案,請回報錯誤。您可以在專案的 gradle.properties 檔案中加入下列其中一行程式碼來停用 R8:

    # Disables R8 for Android Library modules only.
    android.enableR8.libraries = false
    # Disables R8 for all modules.
    android.enableR8 = false
    
  • ndkCompile 已遭淘汰:如果您嘗試使用 ndkBuild 編譯原生程式庫,將會發生建構錯誤。請改用 CMake 或 ndk-build,以便為專案新增 C 和 C++ 程式碼

已知問題

  • 目前尚未強制使用獨特套件名稱,不過之後的外掛程式版本將會嚴格規定。在 Android Gradle 外掛程式 3.4.0 版中,只要在 gradle.properties 檔案中加入以下這一行,即可選擇使用檢查功能,以確認專案所宣告的是否為系統可接受的套件名稱。

    android.uniquePackageNames = true
    

    如要進一步瞭解如何透過 Android Gradle 外掛程式設定套件名稱,請參閱設定應用程式 ID 相關說明。

3.3.0 (2019 年 1 月)

這個版本的 Android 外掛程式須使用下列項目:

3.3.3 (2020 年 7 月)

本次要更新支援新預設設定 的相容性,以及 Android 11 套件 瀏覽權限的功能

詳情請參閱 4.0.1 版本資訊

3.3.2 版 (2019 年 3 月)

本次要更新 支援 Android Studio 3.3.2, 並有多項修正錯誤和改善效能項目。如要查看重要錯誤修正清單,請參閱版本更新網誌上的相關文章。

3.3.1 版 (2019 年 2 月)

本次要更新 支援 Android Studio 3.3.1, 並有多項修正錯誤和改善效能項目。

新功能

  • 改進類別路徑同步處理作業:Android Gradle 外掛程式在解析執行階段和編譯時間類別路徑的依附元件時,會嘗試針對出現在多個類別路徑的依附元件,修復特定下游版本衝突問題。

    舉例來說,假設執行階段類別路徑內含程式庫 A 2.0 版,而編譯類別路徑內含程式庫 A 1.0 版,則外掛程式會自動將編譯類別路徑內的依附元件更新為程式庫 A 2.0 版,以防止發生錯誤。

    不過,假如執行階段類別路徑內含程式庫 A 1.0 版,而編譯類別路徑內含程式庫 A 2.0 版,則外掛程式不會將編譯類別路徑的依附元件降級為程式庫 A 1.0 版,因此您會收到錯誤訊息。若要瞭解詳情,請參閱修復類別路徑之間的衝突

  • 改善使用註解處理工具時的漸進式 Java 編譯功能:這項更新改善了使用註解處理工具時對漸進式 Java 編譯的支援功能,從而縮短建構時間。

    • 針對使用 Kapt 的專案 (多數僅使用 Kotlin 的專案以及 Kotlin-Java 混合型專案):無論您是否使用資料繫結或 retro-lambda 外掛程式,系統都會啟用漸進式 Java 編譯功能。Kapt 工作的註解處理尚非漸進式。
    • 針對未使用 Kapt 的專案 (僅使用 Java 的專案):如果您使用的註解處理工具皆可支援漸進式註解處理,則系統預設會啟用漸進式 Java 編譯功能。若要監控漸進式註解處理工具採用方式,請參閱 Gradle 問題 5277

      不過,要是有一或多個註解處理工具不支援漸進式建構作業,系統便不會啟用漸進式 Java 編譯功能。您可以改為在 gradle.properties 檔案中加入以下旗標:

      android.enableSeparateAnnotationProcessing=true
      

      加入這個旗標後,Android Gradle 外掛程式便會在另一個獨立的工作中執行註解處理工具,讓 Java 編譯工作能夠以漸進方式執行。

  • 在使用過時 API 時提供更完善的偵錯資訊:現在當外掛程式偵測到您使用的是不再受支援的 API 時,可以提供更詳細的資訊來協助您判斷使用該 API 的位置。如果想查看其他資訊,您需要在專案的 gradle.properties 檔案內加入以下內容:

    android.debug.obsoleteApi=true
    

    您也可以透過指令列傳送 -Pandroid.debug.obsoleteApi=true 來啟用旗標。

  • 您可以透過指令列對功能模組執行檢測設備測試。

行為變更

  • 延遲工作設定:外掛程式現在會使用新的 Gradle 工作建立 API,避免為目前建構作業不需要完成的工作 (或不在執行工作圖上的工作) 執行初始化和設定工作。舉例來說,假設您有多個建構變數 (例如「release」和「debug」建構變數),而您要建構應用程式的「debug」版本,則外掛程式會避免為應用程式的「release」版本執行初始化和設定工作。

    呼叫 Variants API 中的某些較舊的方法 (如 variant.getJavaCompile()) 可能仍會強制執行工作設定。為確保您的建構作業已針對延遲工作設定進行最佳化,請叫用會傳回 TaskProvider 物件的新方法,例如 variant.getJavaCompileProvider()

    如果您要執行自訂建構工作,建議您瞭解如何根據新的 Gradle 工作建立 API 進行調整

  • 現在針對特定建構類型設定 useProguard false 時,外掛程式不會使用 ProGuard,而是使用 R8 來縮減及模糊化應用程式的程式碼和資源。如要進一步瞭解 R8,請參閱 Android 開發人員網誌的這篇網誌文章

  • 加快程式庫專案 R 產生程序:之前 Android Gradle 外掛程式會為專案內的所有依附元件產生 R.java 檔案,再跟應用程式的其他類別一起編譯這些 R 類別。外掛程式現在會產生 JAR,其中直接含有應用程式編譯過的 R 類別,無第一次建構中級 R.java 類別。這項最佳化有望大幅改善內含多個程式庫子專案及依附元件的專案建構效能,並能改善 Android Studio 的索引建立速度。

  • 建構 Android App Bundle 時,由該應用程式套件產生且指定 Android 6.0 (API 級別 23) 以上版本的 APK,現在預設會加入原生程式庫的未壓縮版本。這項最佳化作業可避免讓裝置發生需要建立程式庫副本的情形,藉此減少應用程式的磁碟占用量,如果您想停用這項最佳化功能,請在 gradle.properties 檔案中加入以下內容:

    android.bundle.enableUncompressedNativeLibs = false
    
  • 外掛程式會強制執行部分第三方外掛程式的最低需求版本。

  • 單一變數專案同步處理:如要讓 Android Studio 瞭解專案結構,將專案與建構設定保持同步是相當重要的步驟。不過,對大型專案而言,這項程序可能相當耗時。如果專案使用多個建構變數,您現在可以只同步處理目前所選的變數,藉此最佳化專案同步處理作業。

    如要啟用這項最佳化功能,您必須使用 Android Studio 3.3 以上版本和 Android Gradle 外掛程式 3.3.0 以上版本。假如您符合這些需求條件,IDE 會在您同步處理專案時提示您啟用這項最佳化功能。此外,新專案也會預設啟用這項最佳化功能。

    如要手動啟用這項最佳化功能,請依序點選「File」(檔案) >「Settings」(設定) >「Experimental」(實驗功能) >「Gradle」(在 Mac 上則是依序點選「Android Studio」>「Preferences」(偏好設定) >「Experimental」(實驗功能) >「Gradle」),接著勾選「Only sync the active variant」(只同步使用中的變數) 核取方塊。

    注意:本項最佳化完整支援內含 Java 和 C++ 語言的專案,並可部分支援 Kotlin。啟用含有 Kotlin 內容的專案最佳化後,Gradle 內部會改回使用完整變化版本。

  • 自動下載缺少的 SDK 套件:我們已加強這項功能,使其支援 NDK。詳情請參閱使用 Gradle 自動下載缺少的套件

修正錯誤

  • Android Gradle 外掛程式 3.3.0 修正了下列問題:

    • 儘管已啟用 Jetifier,建構程序還是會呼叫 android.support.v8.renderscript.RenderScript,而不是 AndroidX 版本
    • 由於 androidx-rs.jar 內含靜態封裝的 annotation.AnyRes 而發生衝突
    • 使用 RenderScript 時,您不再需要透過 build.gradle 檔案手動設定建構工具版本了

3.2.0 (2018 年 9 月)

這個版本的 Android 外掛程式須使用下列項目:

3.2.1 (2018 年 10 月)

本次更新後,您不再需要指定 SDK 建構工具的版本了。Android Gradle 外掛程式現在預設使用 28.0.3 版本。

新功能

  • 對 Android App Bundle 提供建構支援:應用程式套件是全新的上傳格式,其中包含應用程式所有已編譯的程式碼和資源,但能延遲 APK 產生作業和 Google Play 商店的簽署作業。您不必再建構、簽署及管理多個 APK,而且使用者下載的內容不但檔案較小,還會經過最佳化。詳情請參閱關於 Android App Bundle

  • 支援在使用註解處理工具時提升漸進式建構速度:AnnotationProcessorOptions DSL 現在擴充了 CommandLineArgumentProvider 的功能,讓您或註解處理工具作者能夠使用漸進式建構屬性類型註解,為處理工具的引數加上註解。這些註解可以改善漸進式與快取清理版本的正確性和效能。詳情請參閱將引數傳送至註解處理工具

  • AndroidX 適用的遷移工具:搭配 Android 3.2 以上版本使用 Android Gradle 外掛程式 3.2.0 時,您可以從選單列中依序點選「Refactor」(重構) >「Migrate to AndroidX」(遷移至 AndroidX),讓專案的本機依附元件和 Maven 依附元件改為使用新的 AndroidX 程式庫。使用這個遷移工具也會在您的 gradle.properties檔案的 true 中設定以下旗標:

    • android.useAndroidX設定為 true 時,Android 外掛程式會使用適當的 AndroidX 程式庫,而不是支援程式庫。如未指定此旗標,則外掛程式預設會設為 false
    • android.enableJetifier設定為 true時,Android 外掛程式會自動重新遷移現有的第三方程式庫,以便使用 AndroidX 重新寫入二進位檔。如未指定此旗標,則外掛程式預設會設為 false。您只能在 android.useAndroidX 也設為 true 的情況下將這個旗標設為 true,否則將會發生建構錯誤。

    詳情請參閱 AndroidX 總覽

  • R8,新的程式碼縮減器:R8 是取代 ProGuard 的新工具,用於將程式碼縮減和模糊化。如要使用 R8 預先發布版,請在專案的 gradle.properties 檔案中加入以下內容:

    Groovy

    
    android.enableR8 = true
    

    Kotlin

    
    android.enableR8 = true
    

行為變更

  • 目前已預設啟用 D8 脫糖。
  • Google 的 Maven 存放區現已開始提供 AAPT2。如要使用 AAPT2,請確認 build.gradle 檔案中有 google() 依附元件,如下所示:

    Groovy

    
    buildscript {
        repositories {
            google() // here
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.2.0'
        }
    }
    allprojects {
        repositories {
            google() // and here
            jcenter()
    }
    

    Kotlin

    
    buildscript {
        repositories {
            google() // here
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.2.0'
        }
    }
    allprojects {
        repositories {
            google() // and here
            jcenter()
    }
    
  • 目前已預設啟用原生 multidex。將偵錯版本的應用程式部署至搭載 Android API 級別 21 以上的裝置時,先前的 Android Studio 版本會啟用原生 multidex。現在,無論您是要部署至裝置,還是要建構用於發布的 APK,Android Gradle 外掛程式都會為設定 minSdkVersion=21 以上版本的所有模組啟用原生 multidex。

  • 外掛程式現在會強制執行最低要求版本:protobuf 外掛程式 (0.8.6)、Kotlin 外掛程式 (1.2.50) 以及 Crashlytics 外掛程式 (1.25.4)。

  • 現在當為功能模組外掛程式 com.android.feature 指定模組名稱時,強制只能使用字母、數字及底線。如果您的功能模組名稱含有半形破折號,就會發生建構錯誤。此行為和動態功能外掛程式行為相符。

修正錯誤

  • JavaCompile 現在可以用設有資料繫結的專案進行快取了。(問題 #69243050)
  • 改善設有資料繫結的程式庫模組的編譯避免。(問題 #77539932)
  • 如果您在先前版本中曾經因為某些無法預期的建構錯誤而停用隨選設定,現在您可以重新啟用這項功能。(問題 #77910727)

3.1.0 (2018 年 3 月)

這個版本的 Android 外掛程式須使用下列項目:

  • Gradle 4.4 以上版本。若想瞭解更多資訊,請參閱更新 Gradle 一節。
  • 建構工具 27.0.3 以上版本。請注意,您不必再使用 android.buildToolsVersion 屬性為建構工具指定版本,外掛程式會預設使用最低需求版本。

D8,新的 DEX 編譯器

Android Studio 現在預設使用新的 DEX 編譯器,名為 D8。DEX 編譯是指將 .class 位元碼轉換為 .dex 位元碼,以供 Android 執行階段 (或舊版 Android 的 Dalvik) 使用的程序。與先前名為 DX 的編譯器相較,D8 的編譯速度更快,且輸出的 DEX 檔案更小,同時還能提供相同等級或更優異的應用程式執行階段效能。

D8 應該不會改變您平時的應用程式開發流程。不過,如果發生任何和新編譯器有關的問題,請回報錯誤。您可以在專案的 gradle.properties 檔案中加入以下內容,藉此暫時停用 D8 並使用 DX:

android.enableD8=false

使用 Java 8 語言功能的專案會預設啟用漸進式脫糖功能。您可以在專案的 gradle.properties 檔案內指定以下內容,即可停用此功能:

android.enableIncrementalDesugaring=false.

預先發布版使用者:如果您已在使用 D8 的預先發布版,請注意,D8 現在使用 SDK 建構工具內的程式庫進行編譯,而不是 JDK。因此,如果存取位於 JDK 內,但是不在 SDK 建構工具程式庫內的 API,便會發生編譯錯誤。

行為變更

  • 如果您建構多個 APK,且每個 API 分別指定不同的 ABI,則在預設情況下,外掛程式不會再為下列 ABI 產生 APK:mipsmips64armeabi

    如果想要建構指定這些 ABI 的 APK,您必須使用 NDK r16b 以下版本,並且在 build.gradle 檔案中指定這些 ABI,如下所示:

Groovy

  splits {
      abi {
          include 'armeabi', 'mips', 'mips64'
          ...
      }
  }

Kotlin

  splits {
      abi {
          include("armeabi", "mips", "mips64")
          ...
      }
  }
  • 現在 Android 外掛程式的建構快取會收回超過 30 天的快取項目了。
  • "auto" 傳送到 resConfig 不再自動選擇封裝 APK 所用的字串資源。如果繼續使用 "auto",外掛程式會封裝應用程式和依附元件所提供的所有字串資源。因此,您應該改為指定每個希望外掛程式封裝到 APK 內的語言代碼。
  • 由於本機模組無法依附應用程式的測試 APK,因此透過 androidTestApi 設定 (而不是 androidTestImplementation) 為檢測設備測試新增依附元件,會導致 Gradle 發出以下警告:

    Groovy

    WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'

    Kotlin

    WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'

修正項目

  • 修正 Android Studio 無法正確識別複合建構依附元件的問題。
  • 以往,在單一建構作業中多次載入 Android 外掛程式會發生專案同步處理錯誤,例如在處理多個子專案的情況下,每個子專案的建構指令碼類別路徑內都包含該 Android 外掛程式,就會發生錯誤,這個問題現已修正。

3.0.0 (2017 年 10 月)

Android Gradle 外掛程式 3.0.0 內含多項變更,希望藉此解決大型專案的效能問題。

舉例來說,在最多含有 130 個模組以及大量外部依附元件 (但是沒有程式碼或資源) 的範例架構專案中,您可以獲得經過改善的效能體驗,與以下項目能夠達成的效能相似:

Android 外掛程式版本 + Gradle 版本 Android 外掛程式 2.2.0 + Gradle 2.14.1 Android 外掛程式 2.3.0 + Gradle 3.3 Android 外掛程式 3.0.0 + Gradle 4.1
設定 (如執行 ./gradlew --help) 最多 2 分鐘 最多 9 秒 最多 2.5 秒
單行 Java 變更 (實作變更) 最多 2 分鐘 15 秒 最多 29 秒 最多 6.4 秒

部分變更內容會使現有版本故障。所以您應該先考慮遷移專案的所需成本,再使用新的外掛程式。

如果您沒有體驗到如上所述的效能改善情形,請回報錯誤,並透過 Gradle 分析器提供您的建構作業追蹤記錄。

這個版本的 Android 外掛程式須使用下列項目:

  • Gradle 4.1 以上版本。若想瞭解更多資訊,請參閱更新 Gradle 一節。
  • 建構工具 26.0.2 以上版本。透過這項更新,您不必再為建構工具指定版本,在預設情況下,外掛程式會使用最低需求版本。因此,您可以移除 android.buildToolsVersion 屬性了。

3.0.1 (2017 年 11 月)

本次為次要更新,支援 Android Studio 3.0.1,並提供一般修復錯誤項目,以及改善效能項目。

最佳化

  • 透過更精細的工作圖,為含有多個模組的專案提供更優異的平行處理能力。
  • 變更依附元件時,Gradle 不會重新編譯無法存取依附元件 API 的模組,藉此提昇建構速度。您應該使用 Gradle 的新依附元件設定,藉此限制會流失 API 到其他模組的依附元件:implementationapicompileOnlyruntimeOnly
  • 按照類別進行 DEX 處理,能夠加快漸進式建構速度。現在每個類別都會編譯到各自的 DEX 檔案中,只有經過修改的類別才會重新進行 DEX 處理。minSdkVersion 設為 20 以下且使用舊版多重 DEX 的應用程式,建構速度也應有所提升。
  • 透過最佳化特定工作來使用快取輸出內容,藉此改善建構速度。您必須先啟用 Gradle 建構快取,才能受惠於這項最佳化功能。
  • 改善 AAPT2 漸進式資源處理,現在系統預設啟用此功能。如果您在 AAPT2 使用上遇到問題,請回報錯誤。您也可以停用 AAPT2,方法是在 gradle.properties 檔案中設定 android.enableAapt2=false,然後透過指令列執行 ./gradlew --stop 以重新啟動 Gradle Daemon。

新功能

  • 可偵測變化版本的依附元件管理方式。現在建構特定模組的變化版本時,外掛程式會自動比對本機程式庫模組依附元件的變化版本與目前建構模組的變化版本。
  • 提供新的功能模組外掛程式,以便支援 Android 免安裝應用程式和 Android 免安裝應用程式 SDK (您可以透過 SDK Manager 進行下載)。如要進一步瞭解如何使用新的外掛程式建立功能模組,請參閱具有多功能的免安裝應用程式結構
  • 為特定 Java 8 語言功能和 Java 8 程式庫提供內建支援。我們已淘汰且不再需要使用 Jack,請先停用 Jack,以便使用預設工具鏈內建的改良版 Java 8 支援功能。詳情請參閱使用 Java 8 語言功能
  • 已新增使用 Android Test Orchestrator 執行測試的支援功能,讓您能夠透過應用程式測試自身叫用的 Instrumentation 個別執行每項測試。由於每項測試都會在自己的 Instrumentation 執行個體中進行,因此在測試之間任何共用的狀態都不會累積在裝置的 CPU 或記憶體內。即使有一個測試停止運作,也只會終止自己的 Instrumentation 執行個體,其他測試依然可以正常執行。
    • 新增 testOptions.execution 以便決定是否要使用裝置端測試自動化調度管理。如果您想使用 Android Test Orchestrator,則必須指定 ANDROID_TEST_ORCHESTRATOR (如下所示)。根據預設,這項屬性會設為 HOST,這樣會停用裝置端的自動化調度管理,也是執行測試的標準方法。

Groovy

android {
  testOptions {
    execution 'ANDROID_TEST_ORCHESTRATOR'
  }
}

Kotlin

android {
  testOptions {
    execution = "ANDROID_TEST_ORCHESTRATOR"
  }
}
  • 您可以利用新的 androidTestUtil 依附元件設定,在執行檢測設備測試之前安裝其他測試輔助工具 APK (例如 Android Test Orchestrator):

Groovy

dependencies {
  androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
  ...
}

Kotlin

dependencies {
  androidTestUtil("com.android.support.test:orchestrator:1.0.0")
  ...
}
  • 已新增 testOptions.unitTests.includeAndroidResources,用於支援需要使用 Android 資源 (例如 Roboelectric) 的單元測試。將此屬性設為 true 後,外掛程式會在執行單元測試之前合併資源、資產及資訊清單。然後,測試即可檢查以下金鑰類別路徑內的 com/android/tools/test_config.properties
    • android_merged_assets:合併資產目錄的絕對路徑。

      注意:程式庫模組的合併資產不含依附元件的資產 (請參閱問題 #65550419)。

    • android_merged_manifest:合併的資訊清單檔案的絕對路徑。
    • android_merged_resources:合併資源目錄的絕對路徑,其中含有該模組和其依附元件的所有資源。
    • android_custom_package:最終 R 類別的套件名稱。如果您以動態方式修改應用程式 ID,則這個套件名稱可能會與應用程式資訊清單中的 package 屬性不相符。
  • 支援把字型當做資源的功能 (這是 Android 8.0 (API 級別 26) 推出的新功能)。
  • 支援 Android 免安裝應用程式 SDK 1.1 以上版本的語言特定 APK
  • 您現在可以變更外部原生建構專案的輸出目錄,如下所示:

Groovy

android {
    ...
    externalNativeBuild {
        // For ndk-build, instead use the ndkBuild block.
        cmake {
            ...
            // Specifies a relative path for outputs from external native
            // builds. You can specify any path that's not a subdirectory
            // of your project's temporary build/ directory.
            buildStagingDirectory "./outputs/cmake"
        }
    }
}

Kotlin

android {
    ...
    externalNativeBuild {
        // For ndk-build, instead use the ndkBuild block.
        cmake {
            ...
            // Specifies a relative path for outputs from external native
            // builds. You can specify any path that's not a subdirectory
            // of your project's temporary build/ directory.
            buildStagingDirectory = "./outputs/cmake"
        }
    }
}
  • 現在從 Android Studio 建構原生專案時可以使用 CMake 3.7 以上的版本了。
  • 您可利用新的 lintChecks 依附元件設定,建構用於定義自訂 Lint 規則的 JAR,並將此 JAR 封裝到 AAR 和 APK 專案中。自訂程式碼檢查規則必須屬於另一個可輸出單一 JAR 的專案,並只能有 compileOnly 依附元件。然後,其他應用程式和程式庫模組就能透過 lintChecks 設定依附您的程式碼檢查專案了:

Groovy

dependencies {
    // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
    // and package it with your module. If the module is an Android library,
    // other projects that depend on it automatically use the lint checks.
    // If the module is an app, lint includes these rules when analyzing the app.
    lintChecks project(':lint-checks')
}

Kotlin

dependencies {
    // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
    // and package it with your module. If the module is an Android library,
    // other projects that depend on it automatically use the lint checks.
    // If the module is an app, lint includes these rules when analyzing the app.
    lintChecks(project(":lint-checks"))
}

行為變更

  • Android 外掛程式 3.0.0 會移除特定 API,如果使用這些 API,建構將會故障。舉例來說,您無法再使用 Variants API 存取 outputFile() 物件,也無法使用 processManifest.manifestOutputFile() 取得各個變化版本的資訊清單檔案。詳情請參閱 API 變更
  • 您不必再為建構工具指定版本 (因此您現在可以移除 android.buildToolsVersion 屬性)。根據預設,外掛程式會自動針對您使用的 Android 外掛程式版本,採用最低需求版本的建構工具。
  • 您現在可以透過 buildTypes 區塊中啟用/停用 PNG 壓縮功能了,如下所示。系統預設為所有版本啟用 PNG 壓縮功能,除了偵錯版本之外,這是因為如果專案內有太多 PNG 檔案,便會增加建構時間。因此,為了縮短其他建構類型的建構時間,您應停用 PNG 壓縮功能,或者將圖片轉換為 WebP

Groovy

android {
  buildTypes {
    release {
      // Disables PNG crunching for the release build type.
      crunchPngs false
    }
  }
}

Kotlin

android {
  buildTypes {
    release {
      // Disables PNG crunching for the release build type.
      isCrunchPngs = false
    }
  }
}
  • Android 外掛程式現在會自動建構您在外部 CMake 專案中設定的執行檔目標。
  • 您現在必須使用 annotationProcessor 依附元件設定在註解處理工具的類別路徑中新增處理工具
  • 現在,使用已淘汰的 ndkCompile 會受到更加嚴格的限制。您應該改用 CMake 或 ndk-build,以便編譯您想封裝到 APK 內的原生程式碼。詳情請參閱從 ndkcompile 遷移

2.3.0 (2017 年 2 月)

2.3.3 (2017 年 6 月)

本次為次要更新,新增 Android Studio 2.3.3 的相容性。

2.3.2 (2017 年 5 月)

本次為次要更新,新增 Android Studio 2.3.2 的相容性。

2.3.1 (2017 年 4 月)

這是 Android 外掛程式 2.3.0 的次要更新版本,當中修正了某些實體 Android 裝置無法妥善支援即時執行功能的錯誤。(請參閱問題 #235879)。

依附元件:
新功能:
  • 使用 Gradle 3.3,包含效能改善項目和新功能。詳情請參閱 Gradle 版本資訊
  • 建構快取:儲存 Android 外掛程式建構專案時產生的特定輸出內容 (例如未封裝的 AAR 以及由 DEX 前置處理的遠端依附元件)。清理建構作業可透過使用快取加快執行速度,原因是建構系統可以在後續建構期間直接重複使用這些快取檔案,而不需重新建立快取檔案。使用 Android 外掛程式 2.3.0 以上版本的專案都會預設使用建構快取。詳情請參閱使用建構快取改善建構速度
    • 包括可以清除建構快取cleanBuildCache 工作。
    • 如果您使用的是實驗版本的建構快取 (隨附在舊版外掛程式中),應該更新外掛程式至最新版本。
變更項目:

2.2.0 (2016 年 9 月)

依附元件:
新功能:
  • 使用 Gradle 2.14.1,此版本提供效能改善項目和全新功能,並修正允許在使用 Gradle Daemon 時進行本機權限提升的安全性漏洞。詳情請參閱 Gradle 版本資訊
  • Gradle 現在會使用 externalNativeBuild {} DSL,讓您連結至原生來源並透過 CMake 或 ndk-build 編譯原生程式庫。建構原生程式庫後,Gradle 會將其封裝到 APK 內。若想進一步瞭解如何透過 CMake 和 ndk-build 使用 Gradle,請閱讀為專案新增 C 和 C++ 程式碼
  • 現在 Gradle 會在您透過指令列執行建構作業時,嘗試自動下載任何缺少的 SDK 元件或專案依附的更新項目。詳情請參閱使用 Gradle 自動下載缺少的套件
  • Gradle 提供新的快取實驗功能,透過 DEX 前置處理、儲存以及重新利用經過 DEX 前置處理的程式庫版本,加快建構時間。如要進一步瞭解如何使用這項實驗功能,請參閱建構快取指南。
  • 使用新的預設封裝管道,用單一工作即可控制壓縮、簽署及 zipalign 處理,藉此改善建構效能。您可以在 gradle.properties 檔案中加入 android.useOldPackaging=true,即可改回使用舊版封裝工具。使用新的封裝工具時,無法進行 zipalignDebug 工作。不過,您可以呼叫 createZipAlignTask(String taskName, File inputFile, File outputFile)方阿,即可自行建立此工作。
  • 除了傳統 JAR 簽署外,APK 簽署現在也使用 APK Signature Scheme v2 了。所有 Android 平台都會接受最終產生的 APK。若在簽署後修改這些 APK 任何內容,便會使其 v2 簽章失效,也會阻止使用者在裝置上進行安裝。若要停用此功能,請將以下內容加入模組層級 build.gradle 檔案:

    Groovy

    android {
      ...
      signingConfigs {
        config {
          ...
          v2SigningEnabled false
        }
      }
    }
    

    Kotlin

    android {
      ...
      signingConfigs {
        create("config") {
          ...
          v2SigningEnabled = false
        }
      }
    }
    
  • 您現在可以針對 multidex 建構作業使用 ProGuard 規則,決定 Gradle 要將哪些類別編譯至應用程式的「主要」DEX 檔案內。由於 Android 系統會在啟動您的應用程式時先載入主要 DEX 檔案,因此您可以將特定類別編譯至主要 DEX 檔案內,藉此在啟動應用程式時優先執行這些類別。建立主要 DEX 檔案專用的 ProGuard 設定檔之後,請用 buildTypes.multiDexKeepProguard 將設定檔的路徑傳送給 Gradle。這個 DSL 和 buildTypes.proguardFiles 使用方式不同,後者可為應用程式提供一般的 ProGuard 規則,且不會為主要 DEX 檔案指定類別。
  • 新增對 android:extractNativeLibs 旗標的支援,此功能可減少應用程式在裝置上的安裝大小。只要在應用程式資訊清單的 <application> 元素中將此旗標設為 false,Gradle 便會將未壓縮與相對應的原生程式庫版本和 APK 一起封裝。這樣做可以防止 PackageManager 在安裝期間將原生程式庫從 APK 複製到裝置的檔案系統中,同時也能受益於減少應用程式差異更新大小的好處。
  • 您現在可以指定 versionNameSuffixapplicationIdSuffix 作為變種版本了。(問題 59614)
變更項目:
  • getDefaultProguardFile 現在會傳回 Gradle 適用的 Android 外掛程式提供的預設 ProGuard 檔案,不再使用 Android SDK 中的檔案。
  • 改善 Jack 編譯器的效能和功能。
    • Jack 支援將 testCoverageEnabled 設為 true 時 Jacoco 的測試涵蓋率了。
    • 改善註解處理工具支援功能。類別路徑內的註解處理工具 (如任一種 compile 依附元件) 會自動套用到您的版本上了。您也可以在建構作業中指定註解處理工具,然後使用模組層級 build.gradle 檔案內的 javaCompileOptions.annotationProcessorOptions {} DSL 傳遞引數:

      Groovy

      android {
        ...
        defaultConfig {
          ...
          javaCompileOptions {
            annotationProcessorOptions {
              className 'com.example.MyProcessor'
              // Arguments are optional.
              arguments = [ foo : 'bar' ]
            }
          }
        }
      }
      

      Kotlin

      android {
        ...
        defaultConfig {
          ...
          javaCompileOptions {
            annotationProcessorOptions {
              className = "com.example.MyProcessor"
              // Arguments are optional.
              arguments(mapOf(foo to "bar"))
            }
          }
        }
      }
      

      如果您想在編譯時間內套用註解處理工具,但不想將它加入 APK 中,請使用 annotationProcessor 依附元件範圍:

      Groovy

      dependencies {
          compile 'com.google.dagger:dagger:2.0'
          annotationProcessor 'com.google.dagger:dagger-compiler:2.0'
         // or use buildVariantAnnotationProcessor to target a specific build variant
      }
      

      Kotlin

      dependencies {
          implementation("com.google.dagger:dagger:2.0")
          annotationProcessor("com.google.dagger:dagger-compiler:2.0")
         // or use buildVariantAnnotationProcessor to target a specific build variant
      }
      
    • 如需可供設定的參數列表,請從指令列執行以下內容:

      java -jar /build-tools/jack.jar --help-properties
      
    • 現在根據預設,如果 Gradle Daemon 的堆積大小至少有 1.5 GB,Jack 便會用和 Gradle 相同的程序執行。若要調整 Daemon 堆積大小,請在 gradle.properties 檔案中新增以下內容:
      # This sets the daemon heap size to 1.5GB.
      org.gradle.jvmargs=-Xmx1536M
      

2.1.0 (2016 年 4 月)

2.1.3 (2016 年 8 月)

這項更新需要使用 Gradle 2.14.1 以上版本。Gradle 2.14.1 內含效能改善項目、新功能,和一項重要的安全性修正。詳情請參閱 Gradle 版本資訊

依附元件:
新功能:
  • 已新增在使用 Jack 工具鏈的情況下,對 N 開發人員預覽版、JDK 8 以及 Java 8 語言功能 的支援。詳情請參閱 N 預覽版指南

    注意:立即執行現在無法和 Jack 一起使用,使用新工具鏈時,系統會停用此功能。只有在針對 N 預覽版進行開發,而且想要使用受支援的 Java 8 語言功能時,才需要使用 Jack。

  • 針對漸進式 Java 編譯新增預設支援功能,以便減少開發所需的編譯時間。此功能只會重新編譯來源有所變更或需要重新編譯的部分。若要停用此功能,請將以下程式碼加入模組層級 build.gradle 檔案:

    Groovy

    android {
      ...
      compileOptions {
        incremental false
      }
    }
    

    Kotlin

    android {
      ...
      compileOptions {
        incremental = false
      }
    }
    
  • 已新增對處理中的 dex 程序支援功能,這項功能會在建構程序中執行 DEX 處理,而不會透過獨立的外部 VM 程序執行。不但可以加快漸進式建構的速度,也能加快完整建構的速度。在預設情況下,只要將專案的 Gradle Daemon 堆積大小上限設為 2048 MB 以上,即可啟用這項功能。您可以在專案的 gradle.properties 檔案中加入以下內容,即可達到此效果:

    ```none org.gradle.jvmargs = -Xmx2048m ```

    如果您已在模組層級的 build.gradle 檔案中定義 javaMaxHeapSize 的值,則必須將 org.gradle.jvmargs 設為 javaMaxHeapSize 的值 + 1024 MB。舉例來說,如果您將 javaMaxHeapSize 設為「2048m」,則需將以下內容加入專案的 gradle.properties 檔案:

    ```none org.gradle.jvmargs = -Xmx3072m ```

    若要停用 dexing-in-process,請將以下程式碼加入模組層級 build.gradle 檔案:

    Groovy

    android {
      ...
      dexOptions {
          dexInProcess false
      }
    }
    

    Kotlin

    android {
      ...
      dexOptions {
          dexInProcess = false
      }
    }
    

2.0.0 (2016 年 4 月)

依附元件:
新功能:
  • 透過支援位元碼插入,以及將更新的程式碼和資源推送到在模擬器或實體裝置上正在執行的應用程式,啟用立即執行功能。
  • 已新增對漸進式建構作業的支援 (無論應用程式是否正在執行)。將漸進式變更內容透過 Android Debug Bridge 推送到已連結的裝置上,藉此縮短整體建構時間。
  • 新增 maxProcessCount,以便控管同時可以產生的工作站 DEX 程序數量。下列程式碼位於模組層級 build.gradle 檔案內,將並行程序上限設定為 4:

    Groovy

    android {
      ...
      dexOptions {
        maxProcessCount = 4 // this is the default value
      }
    }
    

    Kotlin

    android {
      ...
      dexOptions {
        maxProcessCount = 4 // this is the default value
      }
    }
    
  • 已新增實驗性的程式碼縮減器,以便支援 DEX 前置處理並減少依附元件的 DEX 重新處理,這些是 Proguard 未支援的功能。這樣做可以改善偵錯版本變化的建構速度。由於實驗性的縮減器並不支援最佳化和模糊化,因此您的發布子版本應啟用 Proguard。若要為您的偵錯版本啟用實驗性縮減器,請在模組層級 build.gradle 檔案中加入以下內容:

    Groovy

    android {
      ...
      buildTypes {
        debug {
          minifyEnabled true
          useProguard false
        }
        release {
          minifyEnabled true
          useProguard true // this is a default setting
        }
      }
    }
    

    Kotlin

    android {
      ...
      buildTypes {
        getByName("debug") {
          minifyEnabled = true
          useProguard = false
        }
        getByName("release") {
          minifyEnabled = true
          useProguard = true // this is a default setting
        }
      }
    }
    
  • 新增資源縮減器的記錄支援功能,並改善效能。資源縮減器現在會將所有操作記錄為 resources.txt 檔案,位於和 Proguard 記錄檔案相同的資料夾內。
變更行為:
修正問題:
  • 修正測試及主要建構設定同時複製 AAR 依存元件的問題。

較舊版本