Plugin Android Gradle 3.6.0 (Februari 2020)

Versi plugin Android ini perlu beberapa hal berikut:

Fitur baru

Versi plugin Android Gradle ini menyertakan fitur baru berikut.

View Binding

View binding memberikan keamanan waktu kompilasi saat mereferensikan tampilan dalam kode Anda. Kini Anda dapat mengganti findViewById() dengan referensi class binding yang dibuat secara otomatis. Untuk mulai menggunakan View binding, sertakan baris berikut di setiap file build.gradle modul:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Untuk mempelajari lebih lanjut, baca dokumentasi View Binding.

Dukungan untuk plugin Maven Publish

Plugin Android Gradle menyertakan dukungan untuk plugin Maven Publish Gradle, yang memungkinkan Anda memublikasikan artefak build ke repositori Apache Maven. Plugin Android Gradle membuat component untuk setiap artefak varian build di aplikasi atau modul library yang dapat Anda gunakan untuk menyesuaikan publication ke repositori Maven.

Untuk mempelajari lebih lanjut, buka halaman tentang cara menggunakan plugin Maven Publish .

Alat pengemasan default baru

Saat membangun versi debug aplikasi, plugin akan menggunakan alat pengemasan baru bernama zipflinger untuk membangun APK. Alat baru ini akan memberikan peningkatan kecepatan build. Jika alat pengemasan baru tidak berfungsi seperti yang Anda harapkan, laporkan bug. Anda dapat kembali menggunakan alat pengemasan versi lama dengan menyertakan baris berikut dalam file gradle.properties:

        android.useNewApkCreator=false
      

Atribusi build native

Kini Anda dapat mengetahui durasi yang diperlukan Clang untuk membuat dan menautkan setiap file C/C++ dalam project Anda. Gradle dapat menghasilkan rekaman aktivitas Chrome yang berisi stempel waktu untuk peristiwa compiler ini, sehingga Anda bisa lebih mengetahui waktu yang diperlukan untuk membuat project. Untuk menghasilkan file atribusi build ini, lakukan hal berikut:

  1. Tambahkan flag -Pandroid.enableProfileJson=true saat menjalankan build Gradle. Contoh:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Buka browser Chrome dan ketik chrome://tracing di kotak penelusuran.

  3. Klik tombol Load dan buka <var>project-root</var>/build/android-profile untuk menemukan file. Nama filenya adalah profile-<var>timestamp</var>.json.gz.

Anda dapat melihat data atribusi build native di dekat bagian atas layar:

Rekaman aktivitas atribusi build native di Chrome

Perubahan perilaku

Saat menggunakan plugin versi ini, Anda mungkin mendapati perubahan perilaku berikut.

Secara default, library native dikemas tanpa dikompresi

Saat Anda mem-build aplikasi, kini plugin akan menyetel extractNativeLibs ke "false" secara default. Artinya, library native Anda akan disejajarkan dengan halaman dan dikemas tanpa dikompresi. Meskipun hal ini menyebabkan ukuran upload menjadi lebih besar, pengguna akan mendapatkan manfaat sebagai berikut:

  • Ukuran instal aplikasi menjadi lebih kecil karena platform dapat mengakses library native secara langsung dari APK yang terinstal, tanpa membuat salinan library.
  • Ukuran download menjadi lebih kecil karena kompresi Play Store biasanya akan lebih efektif jika Anda menyertakan library native yang tidak dikompresi dalam APK atau Android App Bundle.

Jika Anda ingin agar plugin Android Gradle memaketkan library native yang dikompresi, sertakan baris berikut dalam manifes aplikasi:

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

Catatan: Atribut manifes extractNativeLibs telah diganti dengan opsi DSL useLegacyPackaging. Untuk mengetahui informasi selengkapnya, lihat catatan rilis Menggunakan DSL untuk memaketkan library native terkompresi.

Versi NDK default

Jika Anda mendownload beberapa versi NDK, kini plugin Android Gradle akan memilih versi default untuk digunakan dalam proses kompilasi file kode sumber. Sebelumnya, plugin memilih NDK versi terbaru yang didownload. Gunakan properti android.ndkVersion dalam file build.gradle modul untuk mengganti versi default yang dipilih oleh plugin.

Pembuatan class R yang disederhanakan

Plugin Android Gradle menyederhanakan classpath kompilasi dengan membuat satu class R saja untuk setiap modul library dalam project Anda, dan berbagi class R tersebut dengan dependensi modul lainnya. Pengoptimalan ini akan mempercepat proses build, tetapi Anda harus memperhatikan hal-hal berikut:

  • Karena compiler ini berbagi class R dengan dependensi modul upstream, setiap modul dalam project Anda harus memiliki nama paket yang unik.
  • Visibilitas class R suatu library terhadap dependensi project lainnya ditentukan oleh konfigurasi yang digunakan untuk menyertakan library sebagai dependensi. Misalnya, jika Library A menyertakan Library B sebagai dependensi 'api', Library A dan library lain yang bergantung pada Library A akan memiliki akses ke class R Library B. Namun, library lain mungkin tidak memiliki akses ke class R pada Library B jika Library A menggunakan konfigurasi dependensi implementation. Untuk mempelajari lebih lanjut, baca konfigurasi dependensi.

Menghapus resource yang tidak ditemukan dalam konfigurasi default

Untuk modul Library, jika Anda menyertakan resource untuk bahasa yang tidak disertakan ke dalam kumpulan resource default—misalnya, jika Anda menyertakan hello_world sebagai resource string di /values-es/strings.xml tetapi tidak menetapkan resource itu di /values/strings.xml—plugin Android Gradle tidak akan menyertakan resource tersebut saat mengompilasi project. Perubahan perilaku ini akan mengurangi pengecualian runtime Resource Not Found dan meningkatkan kecepatan build.

D8 kini menerima kebijakan retensi CLASS untuk anotasi

Saat mengompilasi aplikasi, kini D8 akan menerima ketika anotasi menerapkan kebijakan retensi CLASS, dan anotasi tersebut tidak lagi tersedia pada runtime. Perilaku ini juga terjadi ketika SDK target aplikasi disetel ke API level 23, yang sebelumnya mengizinkan akses ke anotasi tersebut selama runtime jika aplikasi dikompilasi menggunakan plugin Android Gradle dan D8 versi yang lebih lama.

Perubahan perilaku lainnya

  • aaptOptions.noCompress tidak lagi peka huruf besar/kecil pada semua platform (untuk APK dan paket) dan menerima jalur yang menggunakan karakter huruf besar.
  • Data binding kini bersifat inkremental secara default. Untuk mempelajari lebih lanjut, lihat masalah #110061530.

  • Semua pengujian unit, termasuk pengujian unit Roboelectric, kini sepenuhnya dapat disimpan dalam cache. Untuk mempelajari lebih lanjut, lihat masalah #115873047.

Perbaikan bug

Plugin Android Gradle versi ini menyertakan perbaikan bug berikut:

  • Pengujian unit Robolectric kini didukung di modul library yang menggunakan data binding. Untuk mempelajari lebih lanjut, lihat masalah #126775542.
  • Kini Anda dapat menjalankan tugas connectedAndroidTest di beberapa modul saat mode eksekusi paralel Gradle diaktifkan.

Masalah umum

Bagian ini menjelaskan masalah umum yang ada di plugin Android Gradle 3.6.0.

Performa lambat pada tugas Android Lint

Android Lint memerlukan waktu lebih lama untuk menyelesaikan beberapa project karena adanya regresi dalam infrastruktur parsing-nya, sehingga komputasi jenis yang ditentukan untuk lambda berjalan lebih lambat dalam konstruksi kode tertentu.

Masalah ini dilaporkan sebagai bug di IDEA dan akan diperbaiki di Plugin Android Gradle 4.0.

Class Manifes tidak ada {:#agp-missing-manifest}

Jika aplikasi Anda menetapkan izin kustom dalam manifesnya, plugin Android Gradle biasanya akan membuat class Manifest.java yang menyertakan izin kustom sebagai konstanta string. Plugin memaketkan class ini dengan aplikasi Anda, sehingga Anda dapat lebih mudah merujuk ke izin tersebut saat runtime.

Pembuatan class manifes tidak dapat dilakukan di plugin Android Gradle 3.6.0. Jika Anda mem-build aplikasi dengan plugin versi ini, dan plugin tersebut mereferensikan class manifes, Anda mungkin akan melihat pengecualian ClassNotFoundException. Untuk mengatasi masalah ini, lakukan salah satu langkah berikut:

  • Rujuk izin kustom Anda dengan nama yang sepenuhnya memenuhi syarat. Misalnya: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Tentukan konstanta Anda sendiri, seperti yang ditunjukkan di bawah:

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