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.*

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 *;
}

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.


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


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.


Diese Antwort ist die aktuellste Antwort, denke ich. Danke.
Gogo-the-Cat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.