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:
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:
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.
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.
Ich hatte das gleiche Problem behoben, indem ich unter config.
verwendete %Vor%Offizielle Dokumentation Ссылка
Tags und Links java android serializable proguard