Is there an explicit way to stop ProGuard from changing a class from implementing an interface?
I have a class that implements java.io.Serializable
, let's call it com.my.package.name.Foo
. I've found that after running through ProGuard, it no longer implements Serializable
. I get null
after I cast from Serializable
to Foo
and false
if I check an instance with instanceof Serializable
. I've made sure to set ProGuard to ignore this class:
-keep class com.my.package.name.Foo
I've also tried:
-keep class com.my.package.name.Foo { *; }
and I've also tried the whole package by doing this:
-keep class com.my.package.name.** { *; }
or:
-keep class com.my.package.** { *; }
and also just to keep all Serializable
classes:
-keep class * implements java.io.Serializable { *; }
but to no avail. I have another class in a sibling package (roughly: com.my.package.name2.Bar
) that also implements Serializable
and is used similarly but has no issues.
I'm not sure it's relevant, but I'm packing this in a jar for use with Android. The code that uses these classes include putting them in Bundle
s which is why I need Serializable
. I considered that perhaps somehow ProGuard thinks that Foo
is never used as a Serializable
but that seems unlikely given that I pass it as a parameter to Bundle.putSerializable(String, Serializable)
and also I do an implicit cast: Serializable serializable = foo;
. In fact, when I debug, I can see the Foo
get put into the Bundle
and I can examine the Bundle
and see the instance of Foo
there, but when retrieving it the cast fails.
javap
andFoo
doesn't implementSerializable
anymore. Your comment aboutClassCastException
makes sense to me too, but it just doesn't seem to work that way. My suspicion is that something has happened in the shrinking and optimization to change the behavior from what you might expect normal Java code to do as at that point it's no longer Java, but byte-code. – Ptero