Bagaimana cara menyimpan / mengecualikan jalur paket tertentu saat menggunakan proguard?


110

Saya ingin mengecualikan beberapa jalur file dari ProGuard. Contohcom.myapp.customcomponents

Bagaimana saya bisa melakukan ini? Saya benci menempatkan tanda -keep untuk setiap file komponen kustom yang saya miliki di direktori ini.

Saya telah mencoba yang berikut ini tetapi tidak berhasil:

-keep public class com.myapp.customcomponents.*

Jawaban:


241

Anda tidak menentukan dengan cara apa itu tidak berhasil. Konfigurasi Anda menyimpan nama semua kelas publik dalam paket yang ditentukan:

-keep public class com.myapp.customcomponents.*

Konfigurasi berikut menyimpan nama semua kelas publik dalam paket yang ditentukan dan subpaketnya:

-keep public class com.myapp.customcomponents.**

Konfigurasi berikut menyimpan nama semua kelas / bidang / metode publik / dilindungi dalam paket yang ditentukan dan subpaketnya:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
Tanda bintang ganda (**) tidak dapat dikompilasi lagi (Android Studio 4.0)
Daniel

1
Android Studio 4.x akan menampilkan kesalahan seperti "Nama kelas yang belum terselesaikan" dll. Untuk tanda bintang ganda (**), tetapi ini akan berfungsi seperti yang diharapkan.
Mahmudul Hasan Shohag

Ini diperbaiki dan tidak akan memberikan kesalahan dalam rilis mendatang, periksa detailnya di sini
shadygoneinsane

56

Tambahkan baris berikut di bagian bawah konfigurasi ProGuard Anda:

-keep class com.facebook.** { *; }

Ganti nama paket yang sesuai, di sini paket com.facebookakan dikeluarkan dari ProGuard.


13
mengapa simpan dan jangan peringatkan untuk digunakan bersama
Jongz Puangput

@Jongz Puangput, jika saya benar - jika aplikasi tidak menggunakan paket com.facebook, maka pada build akan ditampilkan catatan "konfigurasi mengacu pada kelas yang tidak diketahui ...". -dontwarn nonaktifkan catatan ini.
Yura Shinkarev

14
apa { *; }artinya
Muhammad Babar

15
@MuhammadBabar i berarti setiap anggota, metode, kelas di setiap ruang lingkup, singkatnya semuanya!
Omar El Don

1

Tampaknya banyak orang merekomendasikan -keep class com.myapp.customcomponents.** { *; }sebagai cara untuk mengecualikan jalur agar tidak diproses. Lihat disini:

  1. kecualikan paket dari proguard
  2. Buat Proguard mengabaikan paket sepenuhnya
  3. Cegah direktori dari obfuscation proguard

Masalah dengan solusi ini adalah masih ada beberapa tingkat kebingungan yang terjadi, yang dapat merusak kode Anda. Anda dapat melihat pemetaan di cetakan pemetaan:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

Solusi yang saya pilih adalah proses dua langkah. Pertama, gunakan injarsdengan filter untuk memilih jalur paket yang ingin saya proses. Dimungkinkan untuk menambahkan jalur paket lain sebagai perpustakaan.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

Kedua, gabungkan toples yang sudah diproses dengan toples asli, tetapi hanya jalur yang dilewati.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

Hasilnya adalah jar gabungan yang merupakan kombinasi dari jalur paket yang diproses dan jalur yang dilewati. Latihan ini tidak valid, jika seseorang dapat memberikan cara untuk melewati pemrosesan jalur tertentu sepenuhnya (yang belum saya temukan).


1

Apa yang berhasil untuk saya menggunakan Android Studio 4.0 adalah:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

Tanda bintang ganda (**) di jawaban lain tidak berhasil untuk saya. Saya juga mencoba konfigurasi di atas dengan R8, berfungsi dengan baik.


jawaban ini adalah jawaban paling mutakhir menurut saya. Terima kasih.
Gogo-the-Cat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.