Plugin Android Gradle 9.0 adalah rilis utama yang menghadirkan perubahan API dan perilaku.
Untuk mengupdate ke plugin Android Gradle 9.0.1, gunakan Asisten Upgrade plugin Android Gradle. Asisten upgrade AGP membantu mempertahankan perilaku yang ada saat mengupgrade project Anda jika sesuai, sehingga Anda dapat mengupgrade project untuk menggunakan AGP 9.0 meskipun belum siap mengadopsi semua default baru di AGP 9.0.
Ada juga dua keahlian agen yang tersedia untuk mempermudah proses upgrade. Untuk aplikasi non-KMP, coba kemampuan upgrade AGP 9 dari repositori kemampuan Android. Untuk aplikasi KMP, coba kemampuan upgrade AGP 9 dari JetBrains. Untuk mengetahui informasi selengkapnya tentang cara menggunakan keterampilan di Android Studio, lihat Memperluas Mode Agen dengan keterampilan.
Kompatibilitas
Level API maksimum yang didukung plugin Android Gradle 9.0 adalah level API 36.1. Berikut info kompatibilitas lainnya:
| Versi minimum | Versi default | Catatan | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Untuk mempelajari lebih lanjut, lihat mengupdate Gradle. |
| SDK Build Tools | 36.0.0 | 36.0.0 | Instal atau konfigurasi SDK Build Tools. |
| NDK | T/A | 28.2.13676358 | Instal atau konfigurasi versi lain dari NDK. |
| JDK | 17 | 17 | Untuk mempelajari lebih lanjut, lihat menyetel versi JDK. |
| Plugin Kotlin Gradle (KGP) | 2.2.10 | 2.2.10 | Untuk mempelajari lebih lanjut, lihat Dependensi runtime pada plugin Kotlin Gradle. |
Class DSL android kini hanya mengimplementasikan antarmuka publik baru
Selama beberapa tahun terakhir, kami telah memperkenalkan
antarmuka baru untuk DSL dan API kami guna
mengontrol API mana yang bersifat publik dengan lebih baik. AGP versi
7.x dan 8.x masih menggunakan jenis DSL lama (misalnya BaseExtension) yang
juga mengimplementasikan antarmuka publik baru, untuk mempertahankan kompatibilitas
seiring berjalannya pekerjaan pada antarmuka.
AGP 9.0 menggunakan antarmuka DSL baru kami secara eksklusif, dan implementasinya telah berubah menjadi jenis baru yang sepenuhnya tersembunyi. Tindakan ini juga akan menghapus akses ke API varian lama yang tidak digunakan lagi.
Untuk mengupdate ke AGP 9.0, Anda mungkin perlu melakukan hal berikut:
- Pastikan project Anda kompatibel dengan Kotlin bawaan: Plugin
org.jetbrains.kotlin.androidtidak kompatibel dengan DSL baru. Alihkan project KMP ke Plugin Library Android Gradle untuk KMP: Penggunaan plugin
org.jetbrains.kotlin.multiplatformdi subproject Gradle yang sama dengan plugincom.android.librarydancom.android.applicationtidak kompatibel dengan DSL baru.Mengupdate file build: Meskipun perubahan antarmuka dimaksudkan untuk menjaga DSL semirip mungkin, mungkin ada beberapa perubahan kecil.
Perbarui logika build kustom Anda untuk merujuk ke DSL dan API baru: Ganti referensi apa pun ke DSL internal dengan antarmuka DSL publik. Biasanya, penggantian ini akan bersifat satu-ke-satu. Ganti penggunaan
applicationVariantsdan API serupa denganandroidComponentsAPI baru. Hal ini mungkin lebih kompleks, karenaandroidComponentsAPI dirancang agar lebih stabil untuk menjaga kompatibilitas plugin lebih lama. Lihat Resep Gradle kami untuk mengetahui contohnya.Mengupdate plugin pihak ketiga: Beberapa plugin pihak ketiga mungkin masih bergantung pada antarmuka atau API yang tidak lagi diekspos. Migrasikan ke versi plugin yang kompatibel dengan AGP 9.0.
Peralihan ke antarmuka DSL baru mencegah plugin dan skrip build Gradle menggunakan berbagai API yang tidak digunakan lagi, termasuk:
API yang tidak digunakan lagi di blok android |
Fungsi | Penggantian |
|---|---|---|
applicationVariants,libraryVariants,testVariants, danunitTestVariants
|
Titik ekstensi untuk plugin guna menambahkan fungsi baru ke AGP. |
Ganti dengan API
androidComponents.onVariants,
misalnya:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Memungkinkan varian yang dipilih untuk dinonaktifkan. |
Ganti dengan API
androidComponents.beforeVariants,
misalnya:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider dantestServer
|
Pendaftaran lingkungan pengujian kustom untuk menjalankan pengujian terhadap perangkat Android dan emulator. | Beralih ke perangkat yang dikelola Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable, danadbExe
|
Menggunakan berbagai komponen Android SDK untuk tugas kustom. |
Beralih ke
androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider, danwrapJavaSourceSet |
Fungsi usang yang sebagian besar terkait dengan penanganan sumber yang dihasilkan di Android Studio, yang berhenti berfungsi di AGP 7.2.0. | Tidak ada pengganti langsung untuk API ini. |
dexOptions
|
Setelan usang yang terkait dengan alat dx, yang telah
diganti dengan d8. Tidak ada setelan
yang berpengaruh sejak plugin Android Gradle 7.0.
|
Tidak ada pengganti langsung. |
generatePureSplits
|
Membuat pemisahan konfigurasi untuk aplikasi instan. | Kemampuan untuk mengirimkan pemisahan konfigurasi kini disertakan dalam Android App Bundle. |
aidlPackagedList
|
File AIDL yang akan dipaketkan dalam AAR untuk diekspos sebagai API bagi library dan aplikasi yang bergantung pada library ini. |
Hal ini masih ditampilkan di
LibraryExtension,
tetapi tidak di jenis ekstensi lainnya.
|
Jika Anda mengupdate ke AGP 9.0 dan melihat pesan error berikut, berarti project Anda masih mereferensikan beberapa jenis lama:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Jika Anda diblokir oleh plugin pihak ketiga yang tidak kompatibel, Anda dapat memilih tidak ikut dan
mendapatkan kembali implementasi lama untuk DSL, serta API varian lama.
Saat melakukan ini, antarmuka baru juga tersedia, dan Anda masih dapat
mengupdate logika build Anda sendiri ke API baru. Untuk memilih tidak ikut, sertakan baris ini dalam
file gradle.properties Anda:
android.newDsl=false
Atau, untuk migrasi yang lebih bertahap, AGP 9.4 memungkinkan Anda memilih untuk tidak menggunakan modul individual. Untuk mempelajari caranya, lihat Penonaktifan modul Variant API.
Class sebelumnya ditandai sebagai tidak digunakan lagi di AGP 9.0. Artinya, project yang memilih untuk tidak menggunakan flag newDsl akan melihat peringatan penghentian penggunaan, termasuk pada blok android itu sendiri.
Anda juga dapat mulai mengupgrade ke API baru sebelum mengupgrade ke AGP 9.0. Antarmuka baru telah ada untuk banyak versi AGP, sehingga Anda dapat memiliki campuran yang baru dan lama. Dokumen referensi AGP API menampilkan platform API untuk setiap versi AGP, serta waktu penambahan setiap class, metode, dan kolom.
Kami menghubungi penulis plugin yang biasa digunakan untuk membantu mereka menyesuaikan dan merilis plugin yang sepenuhnya kompatibel dengan mode baru, dan akan terus meningkatkan kualitas Upgrade Assistant AGP di Android Studio untuk memandu Anda melalui migrasi.
Jika Anda mendapati bahwa DSL atau Variant API baru tidak memiliki kemampuan atau fitur, harap laporkan masalah sesegera mungkin.
Kotlin bawaan
Plugin Android Gradle 9.0 memperkenalkan dukungan Kotlin bawaan dan mengaktifkannya
secara default. Artinya, Anda tidak perlu lagi menerapkan
plugin org.jetbrains.kotlin.android (atau kotlin-android) dalam file build
untuk mengompilasi file sumber Kotlin.
Hal ini menyederhanakan integrasi Kotlin dengan AGP, menghindari penggunaan
API yang tidak digunakan lagi, dan meningkatkan performa dalam beberapa kasus.
Oleh karena itu, saat mengupgrade project ke AGP 9.0, Anda juga harus bermigrasi ke Kotlin bawaan atau memilih tidak ikut.
Anda juga dapat secara selektif menonaktifkan dukungan Kotlin bawaan untuk subproject Gradle yang tidak memiliki sumber Kotlin.
Dependensi runtime pada plugin Kotlin Gradle
Untuk memberikan dukungan Kotlin bawaan, plugin Android Gradle 9.0 kini memiliki dependensi runtime pada plugin Kotlin Gradle (KGP) 2.2.10. Artinya, Anda tidak perlu lagi mendeklarasikan versi KGP, dan jika Anda menggunakan versi KGP yang lebih rendah dari 2.2.10, Gradle akan otomatis mengupgrade versi KGP Anda ke 2.2.10. Demikian pula, jika Anda menggunakan versi KSP yang lebih rendah dari 2.2.10-2.0.2, AGP akan mengupgradenya ke 2.2.10-2.0.2 agar sesuai dengan versi KGP.
Mengupgrade ke versi KGP yang lebih tinggi
Untuk menggunakan versi KGP atau KSP yang lebih tinggi, tambahkan kode berikut ke file build level teratas:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Downgrade ke versi KGP yang lebih rendah
Anda hanya dapat mendowngrade versi KGP jika telah menonaktifkan Kotlin bawaan. Hal ini karena AGP 9.0 mengaktifkan Kotlin bawaan secara default, dan Kotlin bawaan memerlukan KGP 2.2.10 atau yang lebih tinggi.
Untuk menggunakan versi KGP atau KSP yang lebih rendah, deklarasikan versi tersebut dalam file build level teratas menggunakan deklarasi versi ketat:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Perhatikan bahwa versi KGP minimum yang dapat Anda downgrade adalah 2.0.0.
Dukungan IDE untuk perlengkapan pengujian
AGP 9.0 menghadirkan dukungan IDE Android Studio penuh untuk perlengkapan pengujian.
Plugin Library Gabungan
Plugin Library Gabungan (Pratinjau) memungkinkan Anda memublikasikan beberapa library sebagai satu AAR Library Android. Hal ini dapat memudahkan pengguna untuk mengandalkan artefak yang Anda publikasikan.
Untuk mengetahui informasi tentang cara memulai, lihat Memublikasikan beberapa library Android sebagai satu library dengan Library Gabungan.
Perubahan perilaku
Plugin Android Gradle 9.0 memiliki perilaku baru berikut:
| Perilaku | Rekomendasi |
|---|---|
Plugin Android Gradle 9.0 menggunakan NDK versi r28c secara default.
|
Pertimbangkan untuk menentukan versi NDK yang ingin Anda gunakan secara eksplisit. |
| Plugin Android Gradle 9.0 secara default mengharuskan konsumen library untuk menggunakan versi SDK kompilasi yang sama atau lebih tinggi. |
Gunakan SDK kompilasi yang sama atau lebih tinggi saat menggunakan library.
Jika hal ini tidak memungkinkan, atau Anda ingin memberi konsumen library yang
Anda publikasikan lebih banyak waktu untuk beralih, tetapkan
AarMetadata.minCompileSdk
secara eksplisit.
|
AGP 9.0 menyertakan update pada default properti Gradle berikut. Dengan begitu, Anda dapat memilih untuk mempertahankan perilaku AGP 8.13 saat mengupgrade:
| Properti | Fungsi | Perubahan dari AGP 8.13 ke AGP 9.0 | Rekomendasi |
|---|---|---|---|
android. |
Gunakan antarmuka DSL baru, tanpa mengekspos implementasi lama
blok android.Hal ini juga berarti API varian lama, seperti android.applicationVariants
tidak dapat diakses lagi.
|
false → true |
Anda dapat memilih tidak ikut dengan menyetel
android.newDsl=false.Setelah semua plugin dan logika build yang digunakan project Anda kompatibel, hapus pilihan tidak ikut. |
android. |
Mengaktifkan Kotlin bawaan | false → true |
Migrasikan ke Kotlin bawaan jika Anda bisa atau pilih tidak ikut. |
android. |
Memastikan bahwa setiap library memiliki nama paket yang berbeda. | false → true |
Tentukan nama paket yang unik untuk semua library dalam project Anda. Jika tidak memungkinkan, Anda dapat menonaktifkan flag ini saat melakukan migrasi. |
android. |
Gunakan dependensi androidx secara default.
|
false → true |
Menggunakan dependensi androidx.
|
android. |
Menjalankan pengujian di perangkat dengan class
androidx.test.runner.AndroidJUnitRunner
secara default, menggantikan default
InstrumentationTestRunner
yang tidak digunakan lagi untuk
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Gunakan
AndroidJUnitRunner,
atau tentukan testInstrumentationRunner kustom Anda secara eksplisit.
|
android. |
Mengontrol penggunaan batasan dependensi antar-konfigurasi. Default di AGP 9.0 adalah false yang hanya menggunakan batasan dalam pengujian perangkat aplikasi (AndroidTest).
Jika disetel ke true, perilaku akan kembali ke versi 8.13.
|
true → false |
Jangan gunakan batasan dependensi di mana pun kecuali jika Anda membutuhkannya. Menerima default baru flag ini juga akan mengaktifkan pengoptimalan dalam proses impor project yang akan mengurangi waktu impor untuk build dengan banyak subproject library Android. |
android. |
Mengompilasi kode dalam aplikasi terhadap class R non-final, sehingga
kompilasi aplikasi sejalan dengan kompilasi library. Hal ini meningkatkan inkrementalitas dan membuka jalan bagi pengoptimalan performa di masa mendatang untuk alur pemrosesan resource. |
false → true |
Banyak project yang dapat mengadopsi perilaku baru tanpa perubahan sumber. Jika kolom class R digunakan di mana pun yang memerlukan konstanta, seperti kasus switch, lakukan refaktorisasi untuk menggunakan pernyataan if berantai. |
android. |
Menggunakan versi SDK kompilasi sebagai nilai default untuk versi SDK target di aplikasi dan pengujian. Sebelum perubahan ini, versi SDK target akan ditetapkan secara default ke versi SDK minimum. |
false → true |
Tentukan versi SDK target secara eksplisit untuk aplikasi dan pengujian. |
android. |
Hanya membuat komponen pengujian unit untuk jenis build yang diuji. Dalam project default, hal ini menghasilkan satu pengujian unit untuk debug, sedangkan perilaku sebelumnya adalah menjalankan pengujian unit untuk debug atau rilis. |
false → true |
Jika project Anda tidak memerlukan pengujian untuk dijalankan pada debug dan rilis, Anda tidak perlu melakukan perubahan apa pun. |
android. |
Menggagalkan build dengan error jika salah satu file keep yang ditentukan dalam DSL AGP tidak ada di disk. Sebelum perubahan ini, kesalahan ketik pada nama file akan menyebabkan file diabaikan secara otomatis. | false → true |
Hapus semua deklarasi file proguard yang tidak valid |
android. |
Memungkinkan R8 menyimpan lebih sedikit resource Android dengan mempertimbangkan class dan resource Android secara bersamaan. | false → true |
Jika aturan keep project Anda sudah lengkap, Anda tidak perlu melakukan perubahan apa pun. |
android. |
Memungkinkan R8 untuk menyimpan lebih sedikit dengan tidak menyimpan konstruktor default secara implisit
saat class disimpan.
Artinya, -keep class A tidak lagi menyiratkan
-keep class A { <init>(); } |
false → true |
Jika aturan keep project Anda sudah lengkap, Anda tidak perlu melakukan perubahan apa pun.
Ganti -keep class A
dengan
-keep class A { <init>(); }
dalam aturan keep project Anda untuk setiap kasus yang mengharuskan konstruktor default
dipertahankan.
|
android. |
Mengaktifkan
resValues
di semua subproject
|
true → false |
Aktifkan resValues hanya di subproject yang memerlukannya
dengan menetapkan hal berikut dalam file build Gradle project tersebut:
android {
buildFeatures {
resValues = true
}
} |
android. |
Mengaktifkan kompilasi shader di semua subproject | true → false |
Aktifkan kompilasi shader hanya di subproject yang berisi shader yang akan dikompilasi dengan menetapkan hal berikut dalam file build Gradle project tersebut:
android {
buildFeatures {
shaders = true
}
} |
android. |
Di AGP 9.0, getDefaultProguardFile() hanya akan mendukung proguard-android-optimize.txt, bukan proguard-android.txt. Hal ini untuk mencegah penggunaan flag dontoptimize yang tidak disengaja, yang disertakan dalam proguard-android.txt.
|
false → true |
Anda dapat secara eksplisit menentukan dontoptimize dalam proguardFile kustom jika ingin menghindari pengoptimalan, selain menggunakan proguard-android-optimize.txt. Pastikan untuk menghapus flag dontoptimize dari file ini jika memungkinkan, karena flag ini mengurangi manfaat pengoptimalan R8. Jika tidak, pilih tidak ikut dengan menetapkan android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
Mulai AGP 9.0, publikasi library Android dan modul fitur akan gagal jika file keep konsumen berisi konfigurasi Proguard yang bermasalah. File keep konsumen yang menyertakan opsi global seperti dontoptimize atau dontobfuscate hanya boleh digunakan dalam modul aplikasi, dan dapat mengurangi manfaat pengoptimalan bagi pengguna library. Kompilasi modul Aplikasi Android akan otomatis mengabaikan opsi global tersebut jika disematkan dalam dependensi yang telah dikompilasi sebelumnya (JAR atau AAR). Anda dapat melihat kapan hal ini terjadi dengan memeriksa configuration.txt (biasanya di jalur seperti <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) untuk komentar seperti: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
Library yang dipublikasikan harus menghapus aturan yang tidak kompatibel. Library internal harus memindahkan aturan yang tidak kompatibel, tetapi diperlukan, ke proguardFile dalam modul aplikasi. Memilih tidak ikut dengan menetapkan android.r8.globalOptionsInConsumerRules.disallowed=false. Setelah semua file Keep konsumen Anda kompatibel, hapus pilihan tidak ikut.
|
android. |
Larang penerusan penyedia untuk sumber yang dihasilkan menggunakan DSL
AndroidSourceSet.
|
false → true |
Gunakan API
Sources
di androidComponents untuk mendaftarkan sumber yang dihasilkan.
|
android. |
Memerlukan jalur compiler shader untuk ditetapkan secara eksplisit di
local.properties
jika kompilasi shader diaktifkan.
|
false → true |
Tambahkan glslc.dir=/path/to/shader-tools ke local.properties project Anda.
|
Fitur yang dihapus
Plugin Android Gradle 9.0 menghapus fungsi berikut:
- Dukungan aplikasi Wear OS tersemat
AGP 9.0 menghapus dukungan untuk menyematkan aplikasi Wear OS, yang tidak lagi didukung di Play. Hal ini termasuk menghapus konfigurasiwearAppdan DSLAndroidSourceSet.wearAppConfigurationName. Lihat Mendistribusikan ke Wear OS untuk mengetahui cara memublikasikan aplikasi ke Wear OS. - Tugas laporan
androidDependenciesdansourceSets - Dukungan APK pecahan kepadatan
AGP 9.0 menghapus dukungan untuk membuat APK pecahan berdasarkan kepadatan layar. Fungsi dan API terkait telah dihapus. Untuk memisahkan APK berdasarkan kepadatan layar menggunakan AGP 9.0 atau yang lebih tinggi, gunakan app bundle.
DSL yang Diubah
Plugin Android Gradle 9.0 memiliki perubahan DSL yang dapat menyebabkan gangguan berikut:
Parameterisasi
CommonExtensiontelah dihapus.Perubahan ini hanya merupakan perubahan yang dapat menyebabkan gangguan di tingkat sumber untuk membantu menghindari perubahan yang dapat menyebabkan gangguan di tingkat sumber pada masa mendatang, tetapi juga berarti bahwa metode blok perlu dipindahkan dari
CommonExtensionkeApplicationExtension,LibraryExtension,DynamicFeatureExtension, danTestExtension.Saat mengupgrade project ke AGP 9.0, lakukan refaktorisasi kode plugin Gradle yang menggunakan parameter atau metode blok tersebut. Misalnya, plugin berikut diperbarui untuk menghapus parameter jenis dan tidak mengandalkan metode blok yang dihapus:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Untuk plugin yang menargetkan berbagai versi AGP, penggunaan pengambil secara langsung akan kompatibel secara biner dengan versi AGP yang lebih rendah dari 9.0.
DSL yang Dihapus
Plugin Android Gradle 9.0 menghapus:
AndroidSourceSet.jni, karena tidak berfungsi.AndroidSourceSet.wearAppConfigurationName, karena terkait dengan dukungan aplikasi Wear OS tersemat yang dihapus.BuildType.isRenderscriptDebuggable, karena tidak berfungsi.DependencyVariantSelection. Class ini diganti denganDependencySelection, yang diekspos sebagaikotlin.android.localDependencySelectionInstallation.installOptions(String). Properti ini diganti dengan properti yang dapat diubah dariInstallation.installOptions.Blok
PostProcessingeksperimental, tetapi tidak pernah distabilkan.ProductFlavor.setDimension, yang digantikan oleh propertidimensionLanguageSplitOptions, yang hanya berguna untuk Google Play Instan, yang tidak digunakan lagi.DensitySplit, karena fitur ini tidak lagi didukung. Penggantinya adalah menggunakan App Bundle.
API yang Dihapus
Plugin Android Gradle 9.0 menghapus:
AndroidComponentsExtension.finalizeDSl. Class ini diganti denganfinalizeDslComponent.transformClassesWith. Class ini diganti denganInstrumentation.transformClassesWithComponent.setAsmFramesComputationMode. Class ini diganti denganInstrumentation.setAsmFramesComputationModeComponentBuilder.enabled. Class ini diganti denganComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Digantikan olehincludeInApkDependenciesInfoBuilder.includedInBundle. Digantikan olehincludeInBundleGeneratesApk.targetSdkVersion. Digantikan olehtargetSdkVariant.minSdkVersion. Digantikan olehminSdkVariant.maxSdkVersion. Digantikan olehmaxSdkVariant.targetSdkVersion. Digantikan olehtargetSdkVariant.unitTest, karena tidak berlaku untuk plugincom.android.test.unitTesttersedia di subjenisVariantBuilderyang memperluasHasUnitTest.VariantBuilder.targetSdkdantargetSdkPreview, karena tidak bermakna dalam library. GunakanGeneratesApkBuilder.targetSdkatauGeneratesApkBuilder.targetSdkPreviewsebagai gantinya.VariantBuilder.enableUnitTest, karena tidak berlaku untuk plugincom.android.test.enableUnitTesttersedia di subjenisVariantBuilderyang memperluasHasUnitTestBuilder.VariantBuilder.unitTestEnableddihapus dan diganti denganenableUnitTestyang diberi nama lebih konsisten pada subjenisVariantBuilderyang memperluasHasUnitTestBuilder.VariantOutput.enable. Digantikan olehenabledFeaturePlugindanFeatureExtensionyang tidak digunakan lagi dan dinonaktifkan.API
BaseExtension.registerTransformyang tidak digunakan lagi dan dinonaktifkan, yang hanya dipertahankan untuk memungkinkan kompilasi terhadap versi AGP terbaru saat menargetkan berjalan di AGP 4.2 atau yang lebih rendah.
Properti Gradle yang dihapus
Properti Gradle berikut awalnya ditambahkan sebagai cara untuk menonaktifkan fitur yang diaktifkan secara default secara global.
Fitur ini telah dinonaktifkan secara default sejak AGP 8.0 atau yang lebih rendah. Aktifkan fitur ini hanya di subproject yang menggunakannya untuk build yang lebih efisien.
| Properti | Fungsi | Penggantian |
|---|---|---|
android. |
Mengaktifkan kompilasi AIDL di semua subproject |
Aktifkan kompilasi AIDL hanya di subproject yang memiliki
sumber AIDL
dengan menetapkan properti berikut di file build Gradle project tersebut:
android {
buildFeatures {
aidl = true
}
} |
android. |
Mengaktifkan kompilasi RenderScript di semua subproject |
Aktifkan kompilasi renderscript hanya di subproject yang memiliki
sumber renderscript
dengan menetapkan properti berikut dalam file build Gradle project tersebut:
android {
buildFeatures {
renderScript = true
}
} |
Properti Gradle yang diterapkan
AGP 9.0 menampilkan error jika Anda menetapkan properti Gradle berikut.
Upgrade Assistant plugin Android Gradle tidak akan mengupgrade project ke AGP 9.0 yang menggunakan properti ini.
| Properti | Fungsi |
|---|---|
android. |
Penciutan resource kini selalu dijalankan sebagai bagian dari R8, implementasi sebelumnya telah dihapus. |
android. |
Penyingkatan resource kini selalu menggunakan penyingkatan resource yang akurat, sehingga memungkinkan lebih banyak resource dihapus. |
Perubahan R8
Perubahan R8 berikut disertakan dalam AGP 9.0.0.
Opsi konfigurasi baru -processkotlinnullchecks
Kami telah menambahkan opsi R8 baru, -processkotlinnullchecks, untuk mengonfigurasi R8 agar
memproses pemeriksaan null Kotlin. Opsi ini menggunakan argumen wajib yang harus berupa salah satu dari tiga nilai berikut: keep, remove_message, dan remove.
Opsi ini memproses pemeriksaan null berikut yang ditambahkan oleh compiler Kotlin:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Nilai opsi, yang diurutkan dari yang terlemah hingga terkuat, memiliki efek berikut:
keeptidak mengubah pemeriksaan.remove_messagemenulis ulang setiap panggilan metode pemeriksaan ke panggilan kegetClass()pada argumen pertama panggilan (secara efektif mempertahankan pemeriksaan null, tetapi tanpa pesan apa pun).removemenghapus pemeriksaan sepenuhnya.
Secara default, R8
menggunakan remove_message. Spesifikasi -processkotlinnullchecks
apa pun akan menggantikannya. Jika ditentukan beberapa kali, nilai terkuat akan
digunakan.
Berhenti menyebarkan info keep ke metode pendamping
Jika aturan keep cocok dengan metode antarmuka yang tunduk pada desugaring, R8 sebelumnya mentransfer bit disallow optimization dan disallow shrinking secara internal ke metode pendamping yang disintesis.
Mulai AGP 9.0, aturan keep tidak lagi berlaku untuk metode pendamping. Hal ini konsisten dengan fakta bahwa aturan keep tidak berlaku untuk kolom/metode/class lain yang disintesis compiler.
Dengan mentransfer bit disallow optimization dan disallow shrinking ke metode pendamping, kasus penggunaan berikut sebelumnya didukung:
- Kompilasi library dengan metode antarmuka
default/static/privateke DEX denganminSdk< 24 dan aturan yang mempertahankan metode antarmuka. - Kompilasi aplikasi dengan library di classpath dan
-applymapping. - Gabungkan aplikasi dan library.
Perhatikan bahwa hal ini hanya berfungsi dengan -applymapping karena bit disallow
obfuscation tidak ditransfer ke metode pendamping—yaitu, class pendamping yang dihasilkan dari langkah 1 akan memiliki nama metode yang di-obfuscate.
Ke depannya, kasus penggunaan ini tidak lagi didukung untuk minSdk <
24. Solusinya adalah melakukan hal berikut:
- Lakukan desugar pada library dengan metode antarmuka
default/static/privateke file class denganminSdk< 24. - Kompilasi artefak yang telah di-desugar menggunakan R8 dan aturan yang mempertahankan metode antarmuka pada class pendamping.
- Kompilasi aplikasi dengan library di classpath.
- Gabungkan aplikasi dan artefak yang telah di-desugar.
Efek samping lainnya adalah tidak mungkin lagi mempertahankan atribut class dalam dan metode penutup untuk class anonim dan lokal di dalam metode pendamping antarmuka.
Mengubah file sumber yang dikeluarkan default menjadi r8-map-id-<MAP_ID>
Perubahan ini ada di AGP mulai dari 8.12.0.
Atribut file sumber yang dikeluarkan secara default untuk class berubah dari
SourceFile menjadi r8-map-id-<MAP_ID> saat pelacakan ulang diperlukan (yaitu,
saat obfuscation atau pengoptimalan diaktifkan).
Dengan pelacakan tumpukan yang di-obfuscate, atribut file sumber baru memungkinkan ekstraksi ID file pemetaan yang diperlukan untuk pelacakan ulang, yang dapat digunakan untuk mendukung pelacakan ulang otomatis pelacakan tumpukan di Logcat.
Jika atribut file sumber kustom digunakan (-renamesourcefileattribute),
atribut file sumber kustom ini akan terus diprioritaskan.
Dalam mode kompatibilitas ProGuard (saat gradle.properties berisi
android.enableR8.fullMode=false), memunculkan atribut file sumber
r8-map-id-<MAP_ID> hanya akan berlaku jika atribut SourceFile
tidak dipertahankan. Aplikasi yang menggunakan mode kompatibilitas ProGuard dan ingin
menyertakan ID file pemetaan dalam stack trace-nya harus menghapus
-keepattributes SourceFile (atau bermigrasi ke mode penuh R8).
ID peta yang digunakan di r8-map-id-<MAP_ID> adalah hash peta lengkap, dan bukan awalan 7 karakter dari hash peta yang digunakan sebelumnya.
Mengaktifkan penggunaan nama sintetis yang diminimalkan dalam desugaring L8
Nama class sintetis yang dihasilkan oleh D8 biasanya berisi substring
$$ExternalSynthetic yang memberi tahu Anda bahwa ini adalah sintetis yang dihasilkan oleh D8.
Selain itu, nama sintetis juga mengenkode jenis sintetis (misalnya, Backport, Lambda). Hal ini berdampak negatif pada ukuran DEX yang dihasilkan, karena nama class menggunakan lebih banyak ruang di kumpulan string.
AGP 9.0 mengonfigurasi L8 (desugaring library inti) sehingga file DEX
yang berisi semua class j$ menggunakan format nama class baru yang dipersingkat
untuk class sintetis. Nama class baru menggunakan ID numerik (misalnya, $1).
Hapus dukungan untuk -addconfigurationdebugging
AGP 9.0 menghapus dukungan untuk -addconfigurationdebugging. Compiler kini
melaporkan peringatan jika flag digunakan.
Menghapus dukungan untuk membuat aturan L8 dari D8/R8
Perubahan ini hanya relevan untuk developer yang menggunakan command line atau API D8/R8 secara langsung.
R8 9.0 menghapus dukungan untuk membuat aturan keep untuk L8 dari D8 dan R8.
Sebagai gantinya, Anda harus menggunakan TraceReferences untuk tujuan ini.
Lebih spesifiknya, metode
D8Command.builder.setDesugaredLibraryKeepRuleConsumer dan
R8Command.Builder.setDesugaredLibraryKeepRuleConsumer dihapus, dan
dukungan untuk --desugared-lib-pg-conf-output dihapus dari opsi command line
D8 dan R8.
Perbaikan masalah
Plugin Android Gradle 9.0.0
| Perbaikan Masalah | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Plugin Android Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Integrasi Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Penyingkat (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||