为保护自身代码的安全性,混淆代码能有效防止被反编译,进而提高商业安全
一般代码混淆我总结为以下几点:
1、order指令区,即每次混淆时都必要导入的部分:
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -verbose -printmapping proguardMapping.txt -optimizations !code/simplification/cast,!field/*,!class/merging/* -keepattributes *Annotation*,InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable
2、keep保持区,即保持代码不混淆的部分:
(当中最基本的包括四大控件不混淆等)
-keep public class * extends android.app.Fragment -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.support.v4.** -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.** {*;} -keepclasseswithmembernames class * { native <methods>; } -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } -keep class **.R$* { *; } -keepclassmembers class * { void *(**On*Event); }
3、实体类的保留
-keep class 你的实体类所在的包.** { *; } #例如:-keep class com.example.dotawang.puding.bean.** { *; }
4、第三方包不混淆(build.gradle里面的compile中导入的包)
#log4j #-libraryjars log4j-1.2.17.jar -dontwarn org.apache.log4j.** -keep class org.apache.log4j.** { *;}
5、与js互相调用的类
-keep class 你的类所在的包.** { *; } -keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; } #内部类的情况 #例如-keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface { # <methods>; #}
6、与反射相关的类和方法
-keep class 你的类所在的包.** { *; }
7、WebView区
-keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *; } -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, jav.lang.String); }
最后,完成混淆的代码书写后要将build.gradle里面的minifyEnabled改为true 方能完成混淆效果,否则不能实现。
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }