Jak zachować / wykluczyć określoną ścieżkę pakietu podczas korzystania z programu Proguard?

110

Chcę wykluczyć niektóre ścieżki plików z ProGuard. Przykładcom.myapp.customcomponents

W jaki sposób mogę to zrobić? Nienawidzę umieszczać flagi -keep dla każdego pliku komponentu niestandardowego, który mam w tym katalogu.

Próbowałem następujących rzeczy, ale to nie działa:

-keep public class com.myapp.customcomponents.*
Jona
źródło

Odpowiedzi:

241

Nie określasz, w jaki sposób to nie działa. Twoja konfiguracja zachowuje nazwy wszystkich klas publicznych w określonym pakiecie:

-keep public class com.myapp.customcomponents.*

Poniższa konfiguracja zachowuje nazwy wszystkich klas publicznych w określonym pakiecie i jego podpakietach:

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

Poniższa konfiguracja zachowuje nazwy wszystkich publicznych / chronionych klas / pól / metod w określonym pakiecie i jego podpakietach:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}
Eric Lafortune
źródło
6
Podwójne gwiazdki (**) już się nie kompilują (Android Studio 4.0)
Daniel
1
Android Studio 4.x pokaże błędy, takie jak „Nierozwiązana nazwa klasy” itp. Dla podwójnych gwiazdek (**), ale będzie działać zgodnie z oczekiwaniami.
Mahmudul Hasan Shohag
Został
56

Dodaj następujący wiersz u dołu konfiguracji ProGuard:

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

Zmień odpowiednio nazwę pakietu, w tym przypadku pakiet com.facebookzostanie wykluczony z ProGuard.

Pawan Maheshwari
źródło
13
dlaczego trzymać i nie używać razem
Jongz Puangput
@Jongz Puangput, jeśli mam rację - jeśli aplikacja nie korzysta z pakietu com.facebook, to przy kompilacji pojawi się notatka „konfiguracja odnosi się do nieznanej klasy…”. -dontwarn wyłącz tę notatkę.
Yura Shinkarev
14
co to { *; }znaczy
Muhammad Babar
15
@MuhammadBabar i oznacza każdego członka, metodę, klasę w każdym zakresie, w skrócie wszystko!
Omar El Don
1

Wiele osób wydaje się polecać -keep class com.myapp.customcomponents.** { *; }jako sposób na wykluczenie ścieżki z przetwarzania. Spójrz tutaj:

  1. wyklucz pakiety z proguard
  2. Spraw, aby Proguard całkowicie ignorował pakiet
  3. Zapobiegaj zaciemnianiu katalogu przez proguard

Problem z tym rozwiązaniem polega na tym, że nadal występuje pewien poziom zaciemniania, który może złamać twój kod. Mapowanie można zobaczyć na wydruku mapowania:

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

Rozwiązanie, które wybrałem, to proces dwuetapowy. Najpierw użyj injarsz filtrem, aby wybrać ścieżkę pakietu, którą chciałbym przetworzyć. Możliwe jest dodanie innych ścieżek pakietów jako bibliotek.

-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)

Po drugie, połącz przetworzony słoik z oryginalnym słoikiem, ale tylko te ścieżki, które zostały pominięte.

-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

Rezultatem jest scalony plik jar będący połączeniem ścieżki przetworzonego pakietu i pominiętych ścieżek. To ćwiczenie jest nieważne, jeśli ktoś może zapewnić sposób na całkowite pominięcie przetwarzania niektórych ścieżek (których nie znalazłem).

PLG
źródło
1

To, co zadziałało dla mnie w Android Studio 4.0, to:

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

Podwójne gwiazdki (**) w innych odpowiedziach nie działały u mnie. Próbowałem też powyższej konfiguracji z R8, działa dobrze.

mtsahakis
źródło
Myślę, że ta odpowiedź jest najbardziej aktualna. Dziękuję Ci.
Gogo-the-Cat