Selain aturan penyimpanan umum, jenis aturan penyimpanan tambahan, dan opsi global, Anda dapat menggunakan aturan tertentu untuk memecahkan masalah pengoptimalan.
-checkdiscard
Aturan -checkdiscard memungkinkan Anda memeriksa apakah R8 telah berhasil menghapus class atau anggotanya yang Anda harapkan untuk dihapus. Jika
class atau anggota yang ditentukan tidak dihapus, build akan gagal.
Sintaksis untuk -checkdiscard adalah sebagai berikut:
-checkdiscard <class_specification>
Dalam contoh berikut, build akan gagal jika kolom userId atau metode setLabel() dari class com.example.models.User dipertahankan:
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
Kode class mungkin masih ada di aplikasi jika metodenya di-inline ke class lain. Untuk memastikan bahwa kode telah dihapus sepenuhnya dan tidak hanya di-inline, tambahkan aturan yang sesuai yang mencegah R8 melakukan pengoptimalan pada class target, dengan menggabungkan -checkdiscard dengan aturan -keep,allowshrinking. Hal ini melarang pengoptimalan seperti penggabungan dan inline class. Jika aturan -checkdiscard lulus, tidak ada konten dari class yang cocok di aplikasi yang dioptimalkan.
Contoh berikut menunjukkan penggunaan ini:
# Either keep or remove the class, don't rename or otherwise optimize it
-keep,allowshrinking class com.example.foo { *; }
# Verify that the class and all of its fields and methods are removed.
-checkdiscard class com.example.foo
-whyareyoukeeping
Gunakan aturan -whyareyoukeeping untuk menentukan alasan R8 mempertahankan class, kolom, atau metode tertentu dalam build aplikasi Anda. Item dapat disimpan karena beberapa alasan;
namun, aturan ini hanya memberikan alasan yang menjelaskan jalur terpendek ke
item dari item yang disimpan. Jika Anda menghapus jalur ini dari kode, Anda mungkin masih melihat item dipertahankan, tetapi karena alasan yang berbeda.
Kemungkinan alasannya adalah:
Aturan keep: Aturan keep dapat berasal dari aplikasi, library yang digunakan, atau aturan yang dibuat oleh AAPT (Android Asset Packaging Tool).
Referensi transitif dari kode atau resource yang dipertahankan: Jika kode atau XML (seperti tata letak) dipertahankan oleh R8, semua yang direferensikannya secara statis akan dipertahankan.
Sintaksisnya adalah:
-whyareyoukeeping <class_specification>
Contoh:
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
Output dicetak ke konsol.
Jika Anda tidak memiliki aturan yang mempertahankan setLabel(), outputnya adalah:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/build/intermediates/aapt_proguard_file/release/processReleaseResources/aapt_rules.txt:4:1
Nothing is keeping void com.example.foo.MainActivity.setLabel()
Jika Anda memiliki aturan penyimpanan yang menargetkan setLabel(), outputnya akan mirip dengan
berikut:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1
void com.example.foo.MainActivity.setLabel()
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1