Menambahkan opsi global

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 saat proguard-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 menggunakan proguard-android-optimize.txt default, R8 akan menghapus semua atribut, termasuk RuntimeVisibleAnnotations dan Signature, 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() atau getDeclaredClasses(), atribut EnclosingMethod dan InnerClasses diperlukan.
  • Saat mengakses tanda tangan generik menggunakan getTypeParameters(), atribut Signature diperlukan.
  • Saat mengakses anotasi menggunakan getAnnotation(), atribut RuntimeVisibleAnnotations 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.