Plugin Android Gradle 3.6.0 (Februari 2020)
Versi plugin Android ini perlu beberapa hal berikut:
Versi minimum | Versi default | Catatan | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | Untuk mempelajari lebih lanjut, lihat mengupdate Gradle. |
SDK Build Tools | 28.0.3 | 28.0.3 | Instal atau konfigurasi SDK Build Tools. |
Update minor ini mendukung kompatibilitas dengan setelan default baru dan fitur untuk visibilitas paket di Android 11.
Lihat catatan rilis 4.0.1 untuk detailnya.
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:
-
Tambahkan flag
-Pandroid.enableProfileJson=true
saat menjalankan build Gradle. Contoh:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Buka browser Chrome dan ketik
chrome://tracing
di kotak penelusuran. -
Klik tombol Load dan buka
<var>project-root</var>/build/android-profile
untuk menemukan file. Nama filenya adalahprofile-<var>timestamp</var>.json.gz
.
Anda dapat melihat data atribusi build native di dekat bagian atas layar:
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"; } }