2016-08-17 206 views
0

在我的应用程序中,我有一些类,它实现了Serializable/Externalizable接口。ProGuard不会完全混淆Serializable类

反编译类后,实现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的类?

回答

0

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

+0

抹黑我,我现在就试一试,尽快答复,谢谢你很多) –