2016-08-17 136 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

抹黑我,我現在就試一試,儘快答覆,謝謝你很多) –