Update API plugin Android Gradle

Halaman ini melacak penghentian dan penghapusan API plugin Android Gradle (AGP), serta memberikan info tentang cara memperbarui kode Anda.

Pelacak penghentian dan penghapusan API

Tabel berikut merangkum saat API AGP tidak digunakan lagi dan dihapus, dalam hal versi AGP.

API Tidak digunakan lagi di versi AGP Dihapus dari versi AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
Transform 7.2 8.0

AGP 8.0

Berikut ini adalah update API yang penting untuk AGP 8.0.

Transform API dihapus

Mulai dari AGP 8.0, Transform API dihapus. Ini berarti semua class dalam paket com.android.build.api.transform dihapus.

Transform API dihapus untuk meningkatkan performa build. Project yang menggunakan Transform API memaksa AGP menggunakan alur yang kurang dioptimalkan untuk build yang dapat menimbulkan regresi besar dalam waktu build. Selain itu, sulit untuk menggunakan Transform API dan menggabungkannya dengan fitur Gradle lainnya; API pengganti bertujuan untuk memperluas AGP tanpa menimbulkan masalah performa atau ketepatan build.

API Pengganti

Tidak ada satu pun pengganti Transform API. Terdapat API baru yang ditargetkan untuk setiap kasus penggunaan. Semua API pengganti berada dalam blok androidComponents {}. Semua API ini tersedia pada AGP 7.2.

Dukungan untuk mengubah bytecode

Untuk mengubah bytecode, gunakan Instrumentation API. Untuk library, Anda dapat mendaftarkan instrumentasi hanya untuk class project lokal; untuk aplikasi dan pengujian, Anda dapat memilih untuk mendaftarkan instrumentasi hanya untuk class lokal atau semua class, termasuk dependensi lokal dan jarak jauh. Untuk menggunakan API ini, instrumentasi berjalan secara independen di setiap class, dengan akses terbatas ke class lain di classpath (lihat createClassVisitor() untuk informasi selengkapnya). Batasan ini meningkatkan performa build penuh dan inkremental, serta menjaga platform API tetap sederhana. Setiap library diinstrumentasi secara paralel segera setelah siap, bukan setelah semua kompilasi selesai. Selain itu, perubahan pada satu class berarti bahwa hanya class yang terpengaruh yang harus diinstrumentasi kembali dalam build inkremental. Untuk contoh cara menggunakan Instrumentation API, lihat Mengubah class dengan ASM Resep AGP.

Dukungan untuk menambahkan class yang dihasilkan ke aplikasi Anda

Untuk menambahkan class lain yang dihasilkan ke aplikasi, gunakan Artifacts API dengan MultipleArtifact.ALL_CLASSES_DIRS. Secara khusus, gunakan

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

dengan MultipleArtifact.ALL_CLASSES_DIRS untuk menambahkan direktori tambahan yang dihasilkan ke class project. Artifacts API akan secara otomatis memilih lokasi unik untuk menghasilkan tugas kustom Anda. Lihat Resep addToAllClasses contoh cara menggunakan API ini.

Dukungan untuk transformasi berdasarkan keseluruhan analisis program

Untuk menerapkan transformasi berdasarkan keseluruhan analisis program, semua class dapat diubah menjadi satu tugas. Pendekatan ini harus digunakan dengan hati-hati karena memiliki biaya performa build yang jauh lebih tinggi dibandingkan menggunakan Instrumentation API. Jika plugin Anda menggunakan API ini, sebaiknya sertakan transformasi per jenis build, sehingga developer aplikasi dapat menonaktifkannya untuk build pengembangan.

Untuk mendaftarkan tugas yang mengubah semua class secara bersamaan, plugin Android Gradle 7.4 akan memperkenalkan Artifacts.forScope API. Untuk mengubah semua class dalam project saat ini, gunakan Artifacts.forScope.PROJECT. Untuk mengubah semua class dalam project saat ini, project yang diimpor, dan semua dependensi eksternal, gunakan Artifacts.forScope.ALL. Kode berikut menunjukkan cara menggunakan Artifacts.forScope.ALL untuk mendaftarkan tugas yang mengubah semua class secara bersamaan:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

Lihat urutan langkahmodifyProjectClasses contoh cara menggunakan API ini, dan urutan langkahcustomizeAgpDsl untuk mengetahui contoh cara mendaftarkan ekstensi kustom ke jenis build Android.

Jika kasus penggunaan Anda tidak termasuk dalam salah satu cakupan AndroidComponents API, harap laporkan bug.

Beberapa plugin yang umum digunakan telah dimigrasikan untuk menggunakan API baru ini, termasuk plugin Firebase performance monitoring (1.4.1 kompatibel dengan AGP 8.0) dan plugin Gradle Hilt (2.40.1 kompatibel dengan AGP 8.0). Upgrade Assistant AGP juga akan membantu developer project mengupgrade plugin yang umum digunakan sesuai kebutuhan.

Jika Anda menggunakan Transform API melalui plugin pihak ketiga, harap beri tahu penulis bahwa plugin mereka perlu diupdate agar berfungsi dengan API baru untuk AGP 8.0.

AGP 7.2

Berikut ini adalah update API yang penting untuk AGP 7.2.

RenderScript tidak digunakan lagi

Mulai AGP 7.2, RenderScript API tidak digunakan lagi. API tersebut akan terus berfungsi, tetapi akan memanggil peringatan, dan akan dihapus sepenuhnya dalam versi AGP mendatang. Untuk panduan cara beralih dari RenderScript, lihat Bermigrasi dari RenderScript.

Component.transformClassesWith dan Component.setAsmFramesComputationMode tidak digunakan lagi

Mulai AGP 7.2, API instrumentasi bytecode class Component.transformClassesWith dan Component.setAsmFramesComputationMode tidak digunakan lagi. API tersebut telah dipindahkan ke blok baru, Component.instrumentation, yang berisi semua API terkait konfigurasi proses instrumentasi. Untuk terus menggunakan fitur instrumentasi ini, gunakan API yang sesuai dalam blok baru, seperti yang ditunjukkan oleh cuplikan kode berikut:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }