Saat Anda mengaktifkan pengoptimalan aplikasi, setelan isShrinkResources = true
akan menginstruksikan pengoptimal untuk menghapus resource yang tidak digunakan, yang membantu mengurangi
ukuran aplikasi Anda. Penyingkatan resource hanya berfungsi bersama dengan penyingkatan
kode, jadi jika Anda mengoptimalkan resource, tetapkan juga isMinifyEnabled = true
,
misalnya:
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
...
}
}
Jika Anda ingin mempertahankan atau menghapus resource tertentu, buat file keep XML di
resource project, misalnya res/raw/my.package.keep.xml
. File keep
memiliki komponen berikut:
- Tag
<resources>
— Berisi semua elemen resource turunan dan atribut simpan/hapus. - Atribut
tools:keep
— Menerima daftar nama resource yang dipisahkan koma yang mengidentifikasi resource yang akan disimpan - Atribut
tools:discard
— Menerima daftar nama resource yang dipisahkan koma yang mengidentifikasi resource yang akan dihapus
Gunakan karakter tanda bintang sebagai karakter pengganti untuk mereferensikan beberapa resource dalam folder yang sama, misalnya:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2" />
Menentukan resource yang akan dihapus mungkin tampak berlebihan karena Anda bisa langsung menghapusnya, tetapi menghapus resource dapat berguna saat menggunakan varian build.
Menargetkan varian build tertentu
Untuk menghapus resource hanya di beberapa varian build, masukkan semua resource ke dalam
direktori project umum, lalu buat file
my.package.build.variant.keep.xml
yang berbeda untuk setiap varian build di direktori
resource varian. Dalam file keep, tentukan resource yang akan dihapus secara manual saat
resource tertentu tampaknya digunakan dalam kode (dan karenanya tidak dihapus oleh
pempersingkat), tetapi Anda tahu bahwa resource tersebut sebenarnya tidak akan digunakan untuk varian build tertentu.
Menghapus resource alternatif yang tidak digunakan
Pengoptimal hanya menghapus resource yang tidak direferensikan oleh kode aplikasi Anda, yang berarti pengoptimal tidak akan menghapus resource alternatif untuk konfigurasi perangkat yang berbeda.
Gunakan properti resConfigs
Android Gradle dalam file build.gradle
modul
aplikasi untuk menghapus file resource alternatif yang tidak diperlukan aplikasi.
Misalnya, jika Anda menggunakan library yang menyertakan resource bahasa (seperti
Layanan Google Play), aplikasi Anda akan menyertakan semua string bahasa yang diterjemahkan
untuk pesan di library tersebut, tanpa melihat apakah bagian lain aplikasi Anda diterjemahkan
ke bahasa yang sama atau tidak. Untuk hanya mempertahankan bahasa yang resmi
didukung aplikasi, tentukan bahasa tersebut menggunakan properti resConfigs
.
Setiap sumber daya bahasa yang tidak ditetapkan akan dibuang.
Cuplikan berikut menunjukkan cara membatasi resource bahasa hanya ke bahasa Inggris dan Prancis:
android {
defaultConfig {
...
resourceConfigurations.addAll(listOf("en", "fr"))
}
}
atau
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
Saat Anda memublikasikan aplikasi menggunakan format Android App Bundle (AAB), secara default hanya bahasa yang dikonfigurasi di perangkat pengguna yang didownload saat pengguna menginstal aplikasi. Demikian pula, hanya resource yang cocok dengan kepadatan layar perangkat dan library native yang cocok dengan ABI perangkat yang disertakan dalam download. Untuk mengetahui informasi selengkapnya, lihat Mengaktifkan ulang atau menonaktifkan jenis APK konfigurasi.
Untuk aplikasi lama yang dirilis dengan APK (dibuat sebelum Agustus 2021), Anda dapat menyesuaikan kepadatan layar atau resource ABI yang akan disertakan dalam APK dengan mem-build beberapa APK yang menargetkan konfigurasi perangkat yang berbeda.
Menghindari konflik saat menggabungkan resource
Secara default, plugin Android Gradle (AGP) menggabungkan resource bernama identik,
seperti drawable dengan nama sama yang berada di folder resource yang berbeda.
Perilaku ini tidak dikontrol oleh properti shrinkResources
dan tidak dapat
dinonaktifkan karena perilaku ini diperlukan untuk menghindari error saat beberapa
resource memiliki nama yang dirujuk oleh kode Anda.
Penggabungan resource hanya terjadi saat dua atau beberapa file menggunakan nama, jenis, dan penentu resource yang sama. AGP memilih file yang diidentifikasi sebagai pilihan terbaik di antara duplikat tersebut (berdasarkan urutan prioritas yang dijelaskan di bawah) dan meneruskan hanya satu resource tersebut ke AAPT untuk didistribusikan dalam artefak build akhir.
AGP mencari resource duplikat di lokasi berikut:
- Resource utama, yang terkait dengan set sumber utama, biasanya terletak di
src/main/res/
- Overlay varian, dari jenis build dan ragam build
- Dependensi project library
AGP menggabungkan resource duplikat dalam urutan prioritas berikut:
Misalnya, jika resource duplikat muncul di resource utama dan ragam build, Gradle akan memilih resource di ragam build.
Jika resource identik muncul dalam set sumber yang sama, Gradle tidak dapat menggabungkannya
dan akan mengeluarkan error penggabungan resource. Hal ini dapat terjadi jika Anda menentukan beberapa set
sumber di properti sourceSet
dari file build.gradle
modul, misalnya, jika src/main/res/
dan src/main/res2/
berisi resource
yang sama.
Memecahkan masalah penyusutan resource
Saat Anda menyusutkan resource, jendela Build akan menampilkan ringkasan resource yang dihapus dari aplikasi. (Klik Toggle view di sisi kiri jendela untuk menampilkan output teks mendetail dari Gradle.) Contoh:
:android:shrinkDebugResources
Removed unused resources: Resource data reduced from 2570KB to 1711KB: Removed 33%
:android:validateDebugSigning
Gradle juga membuat file diagnostik bernama resources.txt
di
<module-name>/build/outputs/mapping/release/
(folder yang sama dengan file output
ProGuard). File ini menyertakan detail seperti resource mana yang mereferensikan resource
lain, dan resource mana yang digunakan atau dihapus.
Misalnya, untuk mengetahui alasan @drawable/ic_plus_anim_016
masih berada dalam aplikasi,
buka file resources.txt
dan telusuri nama file tersebut. Anda mungkin mendapati bahwa
file tersebut direferensikan dari resource lain:
16:25:48.005 [QUIET] [system.out] @drawable/add_schedule_fab_icon_anim : reachable=true
16:25:48.009 [QUIET] [system.out] @drawable/ic_plus_anim_016
Sekarang Anda perlu mengetahui alasan @drawable/add_schedule_fab_icon_anim
dapat diakses;
dan jika menelusuri ke atas, Anda akan menemukan resource yang tercantum di bawah judul
The root reachable resources are: di resources.txt
.
Ini berarti ada referensi kode ke add_schedule_fab_icon_anim
, yaitu
ID R.drawable
-nya ditemukan dalam kode yang dapat diakses.
Kecuali jika Anda menggunakan pemeriksaan ketat, ID resource dapat ditandai sebagai dapat diakses jika ada konstanta string yang tampaknya dapat digunakan untuk membuat nama resource bagi resource yang dimuat secara dinamis. Dalam hal ini, jika menelusuri output build untuk nama resource tersebut, Anda mungkin menemukan pesan seperti ini:
10:32:50.590 [QUIET] [system.out] Marking drawable:ic_plus_anim_016:2130837506
used because its format-string matches string pool constant ic_plus_anim_%1$d.
Jika Anda melihat salah satu string ini dan yakin bahwa string tersebut tidak
digunakan untuk memuat resource yang diberikan secara dinamis, gunakan atribut tools:discard
dalam file keep untuk memberi tahu sistem build agar menghapus resource.