Wie kann ein bestimmter Paketpfad bei Verwendung von Proguard beibehalten / ausgeschlossen werden?

110

Ich möchte einige Dateipfade von ProGuard ausschließen. Beispielcom.myapp.customcomponents

Wie kann ich das machen? Ich hasse es, -keep-Flags für jede einzelne benutzerdefinierte Komponentendatei zu platzieren, die ich in diesem Verzeichnis habe.

Ich habe Folgendes versucht, aber es funktioniert nicht:

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

Antworten:

241

Sie geben nicht an, auf welche Weise es nicht funktioniert. Ihre Konfiguration enthält die Namen aller öffentlichen Klassen im angegebenen Paket:

-keep public class com.myapp.customcomponents.*

In der folgenden Konfiguration werden die Namen aller öffentlichen Klassen im angegebenen Paket und seinen Unterpaketen beibehalten:

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

In der folgenden Konfiguration werden die Namen aller öffentlichen / geschützten Klassen / Felder / Methoden im angegebenen Paket und seinen Unterpaketen beibehalten:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}
Eric Lafortune
quelle
5
Doppelte Sternchen (**) werden nicht mehr kompiliert (Android Studio 4.0)
Daniel
55

Fügen Sie die folgende Zeile am Ende Ihrer ProGuard-Konfiguration hinzu:

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

Ersetzen Sie den Paketnamen entsprechend, hier wird das Paket com.facebookvon ProGuard ausgeschlossen.

Pawan Maheshwari
quelle
13
Warum behalten und nicht zusammen verwenden
Jongz Puangput
@Jongz Puangput, wenn ich recht habe - wenn die App das com.facebook-Paket nicht verwendet, wird beim Erstellen der Hinweis "Die Konfiguration bezieht sich auf die unbekannte Klasse ..." angezeigt. -dontwarn deaktiviert diesen Hinweis.
Yura Shinkarev
14
was { *; }bedeutet das
Muhammad Babar
15
@ MuhammadBabar Ich meine jedes Mitglied, jede Methode, jede Klasse in jedem Bereich, kurz alles!
Omar El Don
1

Viele Leute scheinen zu empfehlen -keep class com.myapp.customcomponents.** { *; }, einen Pfad von der Verarbeitung auszuschließen. Siehe hier:

  1. Pakete von Proguard ausschließen
  2. Lassen Sie Proguard das Paket vollständig ignorieren
  3. Verhindern Sie die Verschleierung eines Verzeichnisses

Das Problem bei dieser Lösung ist, dass immer noch ein gewisses Maß an Verschleierung auftritt, das Ihren Code beschädigen kann. Sie können das Mapping im Mapping-Ausdruck sehen:

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

Die Lösung, für die ich mich entschieden habe, ist ein zweistufiger Prozess. Verwenden Sie zunächst injarseinen Filter, um den Paketpfad auszuwählen, den ich verarbeiten möchte. Es ist möglich, die anderen Paketpfade als Bibliotheken hinzuzufügen.

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

Zweitens führen Sie das verarbeitete Glas mit dem ursprünglichen Glas zusammen, aber nur die Pfade, die übersprungen wurden.

-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

Das Ergebnis ist ein zusammengeführtes Glas, das die Kombination aus dem verarbeiteten Paketpfad und den übersprungenen Pfaden darstellt. Diese Übung ist ungültig, wenn jemand die Möglichkeit bietet, die Verarbeitung bestimmter Pfade vollständig zu überspringen (was ich nicht gefunden habe).

PLG
quelle
1

Was für mich mit Android Studio 4.0 funktioniert hat, ist:

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

Doppelte Sternchen (**) in anderen Antworten haben bei mir nicht funktioniert. Ich habe auch die obige Konfiguration mit R8 ausprobiert, funktioniert einwandfrei.

Mtsahakis
quelle
Diese Antwort ist die aktuellste Antwort, denke ich. Danke.
Gogo-the-Cat