Android Gradle 外掛程式 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.kts
或 build.gradle
檔案中明確指定 Java 7:
// 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"
}
}
// 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 v3 和 APK v4 簽署格式。如要在建構中啟用這些格式,請在模組層級 build.gradle
或 build.gradle.kts
檔案中加入下列屬性:
// build.gradle
android {
...
signingConfigs {
config {
...
enableV3Signing true
enableV4Signing true
}
}
}
// build.gradle.kts
android {
...
signingConfigs {
config {
...
enableV3Signing = true
enableV4Signing = true
}
}
}
藉由 APK v4 簽署功能,您可以透過 Android 11 中的 ADB 漸進式 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 會篩選來自原生建構,並使用 CMake 及 ndk-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 會讀取 <var>projectDir</var>/gradle.properties
、<var>projectDir</var>/app/gradle.properties
、<var>projectDir</var>/library/gradle.properties
等屬性的值。如果是應用程式模組,當 <var>projectDir</var>/gradle.properties
和 <var>projectDir</var>/app/gradle.properties
中都出現相同的 Gradle 屬性時,會以 <var>projectDir</var>/app/gradle.properties
中的屬性值為準。
在 AGP 4.2 中,這項行為已變更,AGP 不會再從子專案的 gradle.properties
載入值 (例如:<var>projectDir</var>/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 Studio 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
。如需更多背景資訊,請參閱預設以未壓縮方式封裝的原生程式庫相關版本資訊。