ProGuard不会完全混淆Serializable类

时间:2016-08-17 19:51:55

标签: android proguard serializable

在我的应用程序中,我有一些类,它实现了Serializable/Externalizable接口。

实现SerializableExternalizable的反编译类具有模糊名称,如a, b等,但字段和方法的名称保持不变。方法体也被混淆了。

同样的问题影响Enum,它有方法和字段(除了它们自己的实例)。

我的proguard-rules.pro文件是下一个

-optimizationpasses 5

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

-dontwarn android.support.**

-keepclasseswithmembernames, includedescriptorclasses class * {
    native <methods>;
}

-keep public class android.support.v7.widget.** { *; }
-keep public class android.support.v7.internal.widget.** { *; }
-keep public class android.support.v7.internal.view.menu.** { *; }
-keep public class * extends android.support.v4.view.ActionProvider {
    public <init>(android.context.Context);
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

-keepclassmembers, allowoptimization enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

还有一个细节:在添加-keepclassmembers class * implements java.io.Serializable {...}部分之前,我的应用程序在反序列化步骤中失败了。我在ProGuard的网站上尝试了examples,但只有最后一个有效。

那么在这种情况下我该怎么办?是否有配置来混淆类,完全实现Serializable/Externalizable

1 个答案:

答案 0 :(得分:0)

-keepclassmembers行确实保留了大多数字段和方法的名称。如ProGuard手册中所述&gt;例子&gt; Processing serializable classes,如果序列化没有serialVersionUID字段的类,则可能需要此行。如果添加这些字段,则可能使用较不保守的配置来混淆更多方法。