为什么要做这个混淆 1、压缩(Shrink):侦测并移除代码中无用的类、字段、方法、和特性(Attribute)。 2、优化(OPtimize):对字节码惊醒优化,移除无用指令。 3、混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名。 4、预检(Preveirfy): 在java平台上对处理后的代码进行预检。
参数说明 1、基础指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -verbose -printmapping priguardMapping.txt -optimizations !code/simplification/artithmetic,!field/*,!class/merging/* -keepattributes *Annotation* -keepattributes Signature -keepattributes SourceFile,LineNumberTable
2、需要保留的东西 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 # 保留所有的本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保留了继承自Activity 、Application 这些类的子类 # 因为这些子类有可能被外部调用 # 比如第一行就保证了所有Activity 的子类不要被混淆 -keep public class * extends android .app .Activity -keep public class * extends android .app .Application -keep public class * extends android .app .Service -keep public class * extends android .content .BroadcastReceiver -keep public class * extends android .content .ContentProvider -keep public class * extends android .app .backup .BackupAgentHelper -keep public class * extends android .preference .Preference -keep public class * extends android .view .View -keep public class com .android .vending .licensing .ILicensingService # 如果有引用android-support-v4 .jar包,可以添加下面这行 -keep public class com .null .test .ui .fragment .** {*;}# 保留Activity 中的方法参数是view的方法, # 从而我们在layout里面编写onClick就不会影响 -keepclassmembers class * extends android .app .Activity { public void * (android.view.View ); } # 枚举类不能被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String ); } # 保留自定义控件(继承自View )不能被混淆 -keep public class * extends android .view .View { public <init>(android.content.Context ); public <init>(android.content.Context , android.util.AttributeSet ); public <init>(android.content.Context , android.util.AttributeSet , int); public void set*(***); *** get* (); } # 保留Parcelable 序列化的类不能被混淆 -keep class * implements android .os .Parcelable { public static final android.os.Parcelable $Creator *; } # 保留Serializable 序列化的类不被混淆 -keepclassmembers class * implements java .io .Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField [] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream ); private void readObject(java.io.ObjectInputStream ); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对R 文件下的所有类及其方法,都不能被混淆 -keepclassmembers class ** .R$* { *; } # 对于带有回调函数onXXEvent的,不能混淆 -keepclassmembers class * { void *(**On *Event ); }
3、匹配符说明
APP个性化 保留实体类和成员 对于实体,要保留它们的get和set方法,对于boolean型get方法有的命名是isXXX类型,不要遗漏
1 2 3 4 5 6 7 8 9 10 11 -keep class com .null .test .entities .** { *; } -keep class com .null .test .entities .** { public void set *(***); public *** get *(); public *** is *(); }
内嵌页 1 2 3 -keep class com.null.test .MainActivity$* { }
Webview 1 2 3 4 5 6 7 -keepclassmembers class * extends android .webkit .WebViewClient { public void *(android.webkit.WebView , java.lang.String , android.graphics.Bitmap ); public boolean *(android.webkit.WebView , java.lang.String ); } -keepclassmembers class * extends android .webkit .WebViewClient { public void *(android.webkit.WebView , java.lang.String ); }
JavaScript 1 2 3 -keepclassmembers class com .null .test .MainActivity $JSInterfacel { <methods>; }
第三方jar 1 2 3 4 5 6 7 8 9 -libraryjars ./libs/android-support-v4.jar -dontwarn android.support.v4.** -dontwarn **CompatHoneycomb -dontwarn **CompatHoneycombMR2 -dontwarn **CompatCreatorHoneycombMR2 -keep interface android.support.v4.app.** { *; } -keep class android .support .v4 .** { *; } -keep public class * extends android .support .v4 .** -keep public class * extends android .app .Fragment
ref: 1、参数翻译 2、不错的文章参考