Plugin Android Gradle 9.0.1 (Januari 2026)

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.android tidak kompatibel dengan DSL baru.
  • Alihkan project KMP ke Plugin Library Android Gradle untuk KMP: Penggunaan plugin org.jetbrains.kotlin.multiplatform di subproject Gradle yang sama dengan plugin com.android.library dan com.android.application tidak 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 applicationVariants dan API serupa dengan androidComponents API baru. Hal ini mungkin lebih kompleks, karena androidComponents API 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, dan
unitTestVariants
Titik ekstensi untuk plugin guna menambahkan fungsi baru ke AGP. Ganti dengan API androidComponents.onVariants, misalnya:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
Mungkin tidak ada pengganti langsung untuk semua API sebelumnya. Laporkan masalah jika ada kasus penggunaan yang tidak tercakup oleh API varian baru.
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 dan
testServer
Pendaftaran lingkungan pengujian kustom untuk menjalankan pengujian terhadap perangkat Android dan emulator. Beralih ke perangkat yang dikelola Gradle.
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable, dan
adbExe
Menggunakan berbagai komponen Android SDK untuk tugas kustom. Beralih ke androidComponents.sdkComponents.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider, dan
wrapJavaSourceSet
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.newDsl 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.builtInKotlin Mengaktifkan Kotlin bawaan false → true Migrasikan ke Kotlin bawaan jika Anda bisa atau pilih tidak ikut.
android.uniquePackageNames 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.useAndroidx Gunakan dependensi androidx secara default. false → true Menggunakan dependensi androidx.
android.default.androidx.test.runner 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.dependency.useConstraints 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.enableAppCompileTimeRClass 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.sdk.defaultTargetSdkToCompileSdkIfUnset 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.onlyEnableUnitTestForTheTestedBuildType 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.proguard.failOnMissingFiles 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.r8.optimizedResourceShrinking 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.r8.strictFullModeForKeepRules 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.defaults.buildfeatures.resvalues 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.defaults.buildfeatures.shaders 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.r8.proguardAndroidTxt.disallowed 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.r8.globalOptionsInConsumerRules.disallowed 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.sourceset.disallowProvider Larang penerusan penyedia untuk sumber yang dihasilkan menggunakan DSL AndroidSourceSet. false → true Gunakan API Sources di androidComponents untuk mendaftarkan sumber yang dihasilkan.
android.custom.shader.path.required 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 konfigurasi wearApp dan DSL AndroidSourceSet.wearAppConfigurationName. Lihat Mendistribusikan ke Wear OS untuk mengetahui cara memublikasikan aplikasi ke Wear OS.
  • Tugas laporan androidDependencies dan sourceSets
  • 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 CommonExtension telah 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 CommonExtension ke ApplicationExtension, LibraryExtension, DynamicFeatureExtension, dan TestExtension.

    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:

API yang Dihapus

Plugin Android Gradle 9.0 menghapus:

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.defaults.buildfeatures.aidl 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
  }
}
dalam file build Gradle dari setiap subproject yang berisi sumber AIDL
android.defaults.buildfeatures.renderscript 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.r8.integratedResourceShrinking Penciutan resource kini selalu dijalankan sebagai bagian dari R8, implementasi sebelumnya telah dihapus.
android.enableNewResourceShrinker.preciseShrinking 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:

  • keep tidak mengubah pemeriksaan.
  • remove_message menulis ulang setiap panggilan metode pemeriksaan ke panggilan ke getClass() pada argumen pertama panggilan (secara efektif mempertahankan pemeriksaan null, tetapi tanpa pesan apa pun).
  • remove menghapus 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:

  1. Kompilasi library dengan metode antarmuka default/static/private ke DEX dengan minSdk < 24 dan aturan yang mempertahankan metode antarmuka.
  2. Kompilasi aplikasi dengan library di classpath dan -applymapping.
  3. 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:

  1. Lakukan desugar pada library dengan metode antarmuka default/static/private ke file class dengan minSdk < 24.
  2. Kompilasi artefak yang telah di-desugar menggunakan R8 dan aturan yang mempertahankan metode antarmuka pada class pendamping.
  3. Kompilasi aplikasi dengan library di classpath.
  4. 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
Permintaan Fitur: Memasukkan versi AGP ideal sebagai properti
Menstabilkan SingleArtifact.VERSION_CONTROL_INFO_FILE
Output logcat androidTest connectedCheck rusak
Dukungan Kotlin bawaan di AGP tidak boleh disinkronkan dengan sourceset Kotlin
missingDimensionStrategy lebih memilih ragam yang cocok dengan namanya sendiri, bahkan dari dimensi yang tidak terkait
Dukungan Kotlin bawaan di AGP tidak boleh disinkronkan dengan sourceset Kotlin
AGP 9.0.0-rc01 tidak me-resolve library Kotlin melalui fungsi kotlin()
Built-in-kotlin tidak memublikasikan batasan dependensi kotlin-stdlib di pom maven
Menambahkan kasus pengujian untuk perbedaan antara compileSdk dan targetSdk
nilai resConfigs kosong menyebabkan error aapt yang tidak jelas
Project Java murni memiliki dependensi pada kotlin stdlib.
Menghapus properti KotlinMultiplatformAndroidCompilationBuilder yang tidak digunakan lagi di AGP 9.0
`com.android.tools.build:gradle:9.0.0-alpha05` harus memiliki dependensi API pada KGP dan gradle-api
Mengganti nama plugin Gradle com.android.experimental.built-in-kotlin
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` tidak berfungsi
Pemeriksaan metadata Aar pada SDK kompilasi menggunakan DSL lama
Menghapus properti `com.android.build.api.dsl.ManagedDevices.devices` yang tidak digunakan lagi
Dukungan Kotlin bawaan di AGP tidak boleh disinkronkan dengan sourceset Kotlin
Gagal memublikasikan library Android jika file keep konsumen berisi -dontobfuscate
Tidak Ada Opsi untuk Mencetak Pemetaan Resource yang Dioptimalkan
Membuat error untuk memanggil finalizeDsl setelah fase ini dilewati
AGP menginisialisasi konfigurasi jetifier meskipun jetifier dinonaktifkan
built in kotlin tidak menambahkan kotlinStdlib sebagai dependensi waktu kompilasi jika `kotlin.stdlib.default.dependency` bernilai benar (true) untuk file modul dan pom
DSL pengoptimalan baru tidak membuat configuration.txt secara default
AGP 8.13.0 gagal memverifikasi grafik navigasi dalam modul
AGP menggunakan Gradle API yang tidak digunakan lagi: notasi multi-string
Memperingatkan pengguna yang mencoba menggunakan library multidex lama dengan minSdkVersion >=21
Build akan gagal jika ada tugas pembuatan kode
Dengan `android.builtInKotlin=false` dan `android.newDsl=false` dan `android.enableLegacyVariantApi=false`, penggunaan plugin `kotlin-android` akan gagal dengan pesan "API 'applicationVariants' is obsolete"
Kotlin bawaan gagal me-resolve kotlin-stdlib tanpa versi saat kotlin.stdlib.default.dependency=false
DexData membuka file tanpa menutupnya, sehingga mencegah pembersihan
AndroidSourceDirectorySet harus berhenti memperluas PatternFilterable di AGP 9.0
Error Peralatan Pengujian di modul khusus pengujian
Error yang salah saat menggunakan penerima konteks di fixture pengujian
Error IDE yang salah untuk kode Kotlin di testFixtures
Plugin `legacy-kapt` melewati pemrosesan anotasi, tidak seperti `kotlin-kapt`
compileSdkSpec.minorApiLevel tidak berfungsi dengan SettingsExtension
[fused lib - public] Generated fused library does not include sources
extractNativeLibs dan useEmbeddedDex tidak boleh berasal dari manifes
Peringatan dari R8 di AGP 9.0.0-alpha09
Menghapus AndroidSourceSet.jni yang tidak digunakan lagi di AGP 9.0
Menghapus Installation.installOptions() di AGP 9.0
Menghapus BuildType.isRenderscriptDebuggable di AGP 9.0.
Menghapus android.defaults.buildfeatures.renderscript
`com.android.kotlin.multiplatform.library` error dengan Perangkat yang Dikelola Gradle
Menghapus flag gradle.properties default `android.defaults.buildfeatures.aidl`
Gagalkan build saat file proguard tidak ada
menghapus flag gradle.properties default buildconfig
Mengubah nilai default targetSdk aplikasi agar didasarkan pada compileSdk, bukan minSdk
Jika `isIncludeAndroidResources` diaktifkan, `process{Variant}UnitTestManifest` gagal menggabungkan penggunaan tools:overrideLibrary di AGP 8.12.0
AGP menyebabkan peringatan penghentian penggunaan di Gradle untuk tugas pengujian JVM
DependencyReportTask tidak kompatibel dengan cache konfigurasi
Mengubah versi Java sumber/target default dari Java 8 ke Java 11 di AGP 9.0
Mengubah default android.useAndroidX menjadi true
Pengecualian yang lebih baik saat menerapkan plugin kapt dengan Kotlin bawaan.
android.proguard.failOnMissingFiles tidak berfungsi untuk consumerProguardFiles
Mengupdate dependensi plugin Kotlin Gradle ke 2.2.10
Membuat KotlinJvmAndroidCompilation menggunakan KGP API
Mode API eksplisit Kotlin diterapkan ke sumber pengujian
Lint
AGP 8.11.0: tugas lintAnalyzeRelease error saat menerapkan file .gradle.kts dengan apply(from = "...")
Pemeriksaan Lint ChecksSdkIntAtLeast tidak memeriksa apakah nilai yang dianotasi sudah benar
Kotlin bawaan tidak menambahkan .kotlin_module ke META-INF
Classpath lint berisi class duplikat dalam versi yang berbeda
Solusi penggantian resource pribadi tidak berfungsi (tools:override = "true")
Bug: penghapusan resource yang tidak digunakan tidak menghapus terjemahannya, dan tidak menanyakan hal tersebut
Lint menampilkan peringatan "Could not clean up K2 caches"
Lint menampilkan peringatan "Could not clean up K2 caches"
Integrasi Lint
Cache AndroidLintAnalysisTask tidak ditemukan di berbagai vendor JDK atau versi minor karena perbedaan systemPropertyInputs.javaVersion
Lint otomatis menggunakan SDK terbaru yang diinstal meskipun compileSdk, tidak mendaftar sebagai input tugas, dan merusak cache
Penyingkat (R8)
Penyingkatan resource yang dioptimalkan R8 gagal secara otomatis jika menggunakan ID resource final