So verhindern Sie, dass ProGuard die serialisierbare Schnittstelle von einer Klasse entfernt

7

Gibt es eine explizite Möglichkeit, ProGuard daran zu hindern, eine Klasse durch die Implementierung einer Schnittstelle zu ersetzen?

Ich habe eine Klasse, die java.io.Serializable implementiert, nennen wir es com.my.package.name.Foo . Ich habe festgestellt, dass nach dem Ausführen von ProGuard Serializable nicht mehr implementiert wird. Ich erhalte null , nachdem ich von Serializable auf Foo und false gewirkt habe, wenn ich eine Instanz mit instanceof Serializable überprüfe. Ich habe sichergestellt, dass ProGuard diese Klasse ignoriert:

%Vor%

Ich habe es auch versucht:

%Vor%

und ich habe auch das ganze Paket ausprobiert, indem ich das getan habe:

%Vor%

oder:

%Vor%

und auch nur um% Serializable classes zu behalten:

%Vor%

aber ohne Erfolg. Ich habe eine andere Klasse in einem Geschwisterpaket (ungefähr: com.my.package.name2.Bar ), das auch Serializable implementiert und ähnlich verwendet wird, aber keine Probleme hat.

Ich bin mir nicht sicher, ob es relevant ist, aber ich packe das in ein Glas für die Verwendung mit Android. Der Code, der diese Klassen verwendet, enthält das Einfügen in Bundle s, weshalb ich Serializable benötige. Ich dachte, dass ProGuard irgendwie denkt, dass Foo niemals als Serializable verwendet wird, aber das scheint unwahrscheinlich, da ich es als Parameter an Bundle.putSerializable(String, Serializable) übergebe und auch eine implizite Umwandlung: Serializable serializable = foo; . Tatsächlich kann ich beim Debuggen sehen, wie Foo in Bundle gesetzt wird und ich kann Bundle untersuchen und dort die Instanz von Foo sehen, aber beim Abrufen schlägt die Umwandlung fehl.

    
kabuko 18.04.2013, 01:41
quelle

2 Antworten

4

ProGuard entzieht Schnittstellen, die in Bibliotheken (wie Serializable) definiert sind, niemals aus Klassen in Code, der verarbeitet wird (wie Foo). Der Bibliothekscode kann auf diese Schnittstellen übertragen werden, sodass sie nicht entfernt werden können.

  

Ich bekomme null nachdem ich von Serializable nach Foo umgewandelt habe

Dies bedeutet, dass die Instanz null sein muss, um damit zu beginnen. Ihre Analyse wäre korrekt, wenn Sie eine ClassCastException erhalten würden. Sie können überprüfen, ob Foo weiterhin Serializable mit javap implementiert. Das Problem liegt wahrscheinlich woanders. Für Tipps zur Serialisierung können Sie sich das ProGuard Handbuch & gt; Beispiele & gt; Serialisierbare Klassen verarbeiten .

Aktualisierung:

In diesem Fall stellt sich heraus, dass es sich um ein Konfigurationsproblem handelt. ProGuard kann Klassendateien nur dann verarbeiten, wenn sie alles über ihre Hierarchie wissen (genau wie ein Compiler). Sie müssen wirklich die Laufzeitklassen angeben:

%Vor%

oder für Android:

%Vor%

Die Android Ant / Eclipse-Builds geben automatisch alle erforderlichen -injars / -outjars / -libraryjars-Optionen für Sie an, aber in einem benutzerdefinierten Build-Prozess müssen Sie sie selbst angeben. Cfr. ProGuard Handbuch & gt; Beispiele & gt; Eine vollständige Android-Anwendung .

Beachten Sie, dass die Option -dontwarn die Warnungen weglässt, aber nicht die Probleme. Verwenden Sie es nur, wenn es wirklich notwendig ist.

    
Eric Lafortune 20.04.2013, 22:42
quelle
21

Ich hatte das gleiche Problem behoben, indem ich unter config.

verwendete %Vor%

Offizielle Dokumentation Ссылка

    
Sabeer Mohammed 29.05.2015 14:49
quelle