Esiste un modo esplicito per impedire a ProGuard di modificare una classe dall'implementazione di un'interfaccia?Come impedire a ProGuard di rimuovere l'interfaccia Serializable da una classe
Ho una classe che implementa java.io.Serializable
, chiamiamolo com.my.package.name.Foo
. Ho scoperto che dopo aver attraversato ProGuard, non implementa più Serializable
. Ottengo null
dopo aver lanciato da Serializable
a Foo
e false
se controllo un'istanza con instanceof Serializable
. Ho fatto in modo di impostare ProGuard di ignorare questa classe:
-keep class com.my.package.name.Foo
Ho anche provato:
-keep class com.my.package.name.Foo { *; }
e ho provato anche l'intero pacchetto in questo modo:
-keep class com.my.package.name.** { *; }
o:
-keep class com.my.package.** { *; }
e anche solo per mantenere tutte le classi Serializable
:
-keep class * implements java.io.Serializable { *; }
ma senza alcun risultato. Ho un'altra classe in un pacchetto fratello (circa: com.my.package.name2.Bar
) che implementa anche Serializable
e viene utilizzata allo stesso modo ma non presenta problemi.
Non sono sicuro che sia rilevante, ma lo sto imballando in un barattolo per l'utilizzo con Android. Il codice che utilizza queste classi include inserirli in Bundle
s, motivo per cui ho bisogno di Serializable
. Ho pensato che forse in qualche modo ProGuard pensa che Foo
non sia mai usato come Serializable
ma sembra improbabile dato che lo passo come parametro a Bundle.putSerializable(String, Serializable)
e faccio anche un cast implicito: Serializable serializable = foo;
. Infatti, quando eseguo il debug, posso vedere il Foo
immettersi nel Bundle
e posso esaminare il Bundle
e vedere l'istanza di Foo
lì, ma quando lo si recupera il cast fallisce.
Grazie per l'input, ma ho controllato con '' javap' e foo' non implementa più 'Serializable'. Il tuo commento su 'ClassCastException' ha senso anche per me, ma non sembra funzionare in questo modo. Il mio sospetto è che sia accaduto qualcosa nella riduzione e nell'ottimizzazione per cambiare il comportamento da ciò che potreste aspettarvi dal normale codice Java, poiché a quel punto non è più Java, ma codice byte. – kabuko
Ho scoperto che se ho ProGuard impostato su '-dontshrink' e quindi uso esplicitamente' -keep, allowoptimization, allowhrinking, allowobfuscation Foo' allora 'Foo' implementerà ancora' Serializable', ma sfortunatamente non è una soluzione per me come mi piacerebbe restringere in generale. – kabuko
Se si dispone di un piccolo esempio che illustra il problema, lo esaminerò. È possibile trovare il mio indirizzo e-mail nella pagina dei commenti del sito Web ProGuard. –