R8 menyediakan opsi global yang mengubah pengoptimalan R8 di seluruh
aplikasi atau memengaruhi setiap aturan keep. Opsi ini dikelola dalam file
proguard-rules.pro
, bersama dengan aturan penyimpanan. Beberapa opsi global ini
mengonfigurasi pengoptimalan tambahan, sementara opsi lainnya menonaktifkan aspek tertentu dari
pengoptimalan.
Opsi global untuk pengoptimalan tambahan
Opsi global berikut memungkinkan pengoptimalan tambahan:
-repackageclasses [<optional-package-name>]
: Mengemas ulang class ke dalam satu paket yang ditentukan, untuk mengurangi ukuran aplikasi lebih lanjut. Jika Anda tidak memberikan nama paket opsional, class akan dipindahkan ke paket default yang kosong. Ini adalah setelan yang direkomendasikan untuk aplikasi.-allowaccessmodification
: Memungkinkan R8 mengubah (biasanya memperluas) visibilitas class, kolom, dan metode untuk melakukan pengoptimalan yang lebih ekstensif. Diaktifkan saatproguard-android-optimize.txt
digunakan. Sejak Plugin Android Gradle (AGP) 8.2, ini adalah konfigurasi default jika Anda menggunakan R8 dalam mode penuh.
Berikut adalah contoh konfigurasi dengan pengoptimalan tambahan diaktifkan:
-repackageclasses
-allowaccessmodification
Opsi global untuk membatasi pengoptimalan
Opsi global berikut memungkinkan Anda menonaktifkan aspek tertentu dari pengoptimalan aplikasi, dan berguna saat Anda menyempurnakan aturan penyimpanan atau mengaktifkan R8 untuk pertama kalinya.
-dontoptimize
: Mencegah pengoptimalan kode, misalnya penyisipan metode. Opsi ini dapat digunakan selama pengembangan, tetapi tidak boleh digunakan dalam build produksi.-dontshrink
: Mencegah penghapusan kode yang tidak direferensikan dan pengoptimalan kode. Opsi ini dapat digunakan selama pengembangan, tetapi tidak boleh digunakan dalam build produksi.-dontobfuscate
: Mencegah mempersingkat nama class dan metode. Menonaktifkan pengaburan selama proses debug dapat sangat membantu agar stack trace lebih mudah dibaca. Opsi ini dapat digunakan selama pengembangan, tetapi tidak boleh digunakan dalam build produksi.-keepattributes <attributes>
: Menerima daftar atribut yang dipisahkan koma yang harus dipertahankan. Jika Anda tidak menggunakanproguard-android-optimize.txt
default, R8 akan menghapus semua atribut, termasukRuntimeVisibleAnnotations
danSignature
, tetapi atribut ini dapat berguna untuk dipertahankan jika diperlukan dalam kasus seperti refleksi. Untuk daftar atribut yang dapat Anda tentukan, lihat Mempertahankan atribut.
Mempertahankan atribut
Atribut adalah informasi tambahan yang dilampirkan ke berbagai bagian kode Anda. Atribut menyimpan informasi seperti anotasi dan tanda tangan generik dari kode Anda.
Operasi reflektif tertentu memerlukan atribut spesifik agar tetap ada untuk eksekusi yang berhasil. Contoh:
- Saat mengakses struktur class dalam atau luar menggunakan
getEnclosingMethod()
ataugetDeclaredClasses()
, atributEnclosingMethod
danInnerClasses
diperlukan. - Saat mengakses tanda tangan generik menggunakan
getTypeParameters()
, atributSignature
diperlukan. Saat mengakses anotasi menggunakan
getAnnotation()
, atributRuntimeVisibleAnnotations
diperlukan.
Atribut yang umumnya diperlukan
Saat menggunakan file Proguard default (proguard-android-optimize.txt
atau
proguard-android.txt
), plugin Android Gradle (AGP) akan mempertahankan atribut berikut. Perhatikan bahwa beberapa atribut ini memerlukan AGP versi yang lebih baru:
Atribut | Deskripsi |
---|---|
AnnotationDefault |
Atribut ini ditemukan pada jenis anotasi itu sendiri dan menyimpan nilai default untuk elemen anotasi. Catatan: Atribut ini dipertahankan secara default sejak AGP 7.1, dan hanya perlu dipertahankan secara eksplisit di aplikasi yang menggunakan versi AGP yang lebih lama. |
EnclosingMethod |
Atribut ini ada di class dalam yang bukan class lokal atau anonim. Mengidentifikasi metode atau penginisialisasi yang langsung berisi class. |
InnerClasses |
Atribut ini mencatat informasi tentang class bertingkat (class dalam, class bertingkat statis, class lokal, dan class anonim) yang ditentukan dalam class lain. |
LineNumberTable |
Atribut ini memetakan petunjuk bytecode ke nomor baris yang sesuai dalam file sumber asli. Catatan: Atribut ini dipertahankan secara default sejak Plugin Android Gradle (AGP) 8.6, dan hanya perlu dipertahankan secara eksplisit di aplikasi yang menggunakan AGP versi sebelumnya. |
RuntimeVisibleAnnotations |
Atribut ini menyimpan anotasi yang terlihat saat runtime dengan refleksi. Biasanya, jika anotasi digunakan saat runtime, ini adalah satu-satunya anotasi dari atribut *Annotation yang diperlukan oleh aplikasi dan dalam aturan konsumen library. |
RuntimeVisibleParameterAnnotations |
Atribut ini menyimpan anotasi yang terlihat saat runtime dengan refleksi pada parameter metode. |
RuntimeVisibleTypeAnnotations |
Atribut ini menyimpan anotasi yang berlaku untuk penggunaan jenis, bukan hanya deklarasi. Atribut ini terlihat saat runtime. |
Signature |
Atribut ini menyimpan tanda tangan jenis yang lebih generik untuk class, metode, dan kolom, terutama saat menggunakan generik (seperti List<String> ). |
SourceFile |
Atribut ini menyimpan nama file sumber (file .kt atau .java ) tempat class dikompilasi. File ini terutama digunakan oleh debugger untuk menampilkan baris kode sumber asli saat menelusuri kode Java yang dikompilasi. Hal ini membantu developer melacak eksekusi kembali ke kode yang mereka tulis. Catatan: Atribut ini dipertahankan secara default sejak AGP 8.2, dan hanya perlu dipertahankan secara eksplisit di aplikasi yang menggunakan AGP versi sebelumnya. |
Untuk aplikasi yang menggunakan proguard-android-optimize.txt
, aturan penyimpanan yang ditentukan oleh AGP sudah memadai dalam sebagian besar skenario. Namun, jika Anda menulis kode untuk library, Anda harus menentukan semua atribut yang diperlukan oleh library dalam aturan penyimpanan konsumen, meskipun atribut tersebut ditentukan dalam daftar ini. Hal ini memastikan bahwa pustaka Anda kuat jika developer memutuskan untuk tidak menyertakan
proguard-android-optimize.txt
.
Atribut tetap tambahan
Anda dapat menentukan atribut tambahan yang akan dipertahankan, tetapi atribut tersebut tidak diperlukan untuk sebagian besar skenario akses JNI atau reflektif. Namun, beberapa di antaranya mungkin masih sering digunakan saat mengoptimalkan library.
Atribut | Deskripsi |
---|---|
MethodParameters |
Atribut ini memberikan informasi tentang parameter metode, khususnya nama dan flag aksesnya. |
Exceptions |
Atribut ini mencantumkan pengecualian yang diperiksa yang dideklarasikan oleh metode untuk ditampilkan. Atribut ini biasanya tidak digunakan untuk aplikasi. Untuk penulis library, biasanya tidak digunakan dalam aturan penyimpanan konsumen, tetapi sering digunakan saat membuat library. Untuk mengetahui detail tentang mengoptimalkan library, lihat Pengoptimalan untuk penulis library. |
RuntimeInvisibleAnnotations |
Atribut ini menyimpan anotasi yang tidak terlihat dengan refleksi saat runtime pada class, kolom, atau metode. Developer aplikasi tidak boleh menyimpan atribut ini. Untuk penulis library, atribut ini tidak relevan dalam aturan penyimpanan konsumen, tetapi sering digunakan saat membangun library. Untuk mengetahui detail tentang mengoptimalkan library, lihat Pengoptimalan untuk penulis library. |
RuntimeInvisibleParameterAnnotations |
Atribut ini menyimpan anotasi yang tidak terlihat dengan refleksi saat runtime pada parameter metode. Developer aplikasi tidak boleh menyimpan atribut ini. Untuk penulis library, atribut ini tidak relevan dalam aturan penyimpanan konsumen, tetapi sering digunakan saat membangun library. Untuk mengetahui detail tentang mengoptimalkan library, lihat Pengoptimalan untuk penulis library. |
RuntimeInvisibleTypeAnnotations |
Atribut ini menyimpan anotasi yang berlaku untuk penggunaan jenis, bukan hanya deklarasi. Atribut ini tidak terlihat saat runtime. Developer aplikasi tidak boleh menyimpan atribut ini. Untuk penulis library, atribut ini tidak relevan dalam aturan penyimpanan konsumen, tetapi sering digunakan saat membangun library. Untuk mengetahui detail tentang mengoptimalkan library, lihat Pengoptimalan untuk penulis library. |