一 混淆的目的 ,避免项目被反编译。
二 混淆的步骤(本文只针对Android studio)
1 在model目录的build.build文件中 android 节点下
buildTypes {
debug {
buildConfigField "boolean", "IS_TEST", "true"
}
release {
//代码混淆
minifyEnabled true
//zipalign优化
zipAlignEnabled true
//自定义字段【true:测试地址 false:线上地址】
buildConfigField "boolean", "IS_TEST", "false"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
debug 代表的是没有签名的版本 release代表的是 签名的版本 所在在 release 节点下 设置 混淆开关 //代码混淆 minifyEnadbled true (true为混淆 false为不混淆) 关联混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
2 配置混淆文件 我们设置了混淆开关 true 代表 项目被混淆 但是由于有一些内容是不能被混淆的 所以 我们需要在配置文件中声明 不能被混淆的内容
a 通用配置:
#指定代码的压缩级别 -optimizationpasses 5 #混淆时所采用的算法 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #优化 不优化输入的类文件 -dontoptimize #包明不混合大小写 -dontusemixedcaseclassnames #混淆时是否记录日志 -verbose #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers #保护注解 -keepattributes *Annotation* -keepattributes *JavascriptInterface* #避免混淆泛型 如果混淆报错建议关掉 -keepattributes Exceptions,InnerClasses,Signature -keepattributes SourceFile,LineNumberTable #忽略警告 -ignorewarning
b 关于安卓的基本过滤
#------------------ Android基本类过滤 ---------------- -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 com.android.vending.licensing.ILicensingService -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.support.v4.app.FragmentActivity -keep public class android.webkit.** -keep public class javax.** -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*(...); } #保持 native 方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } #保持自定义控件类不被混淆 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } #保持自定义控件类不被混淆 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #保持自定义控件类不被混淆 -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } ##保持 Serializable 不被混淆并且enum 类也不被混淆 #-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(); #} #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } #保持 Parcelable 不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #保持 Serializable 不被混淆 -keepnames class * implements java.io.Serializable #不混淆资源类 -keepclassmembers class **.R$* { public static <fields>; } -keepclassmembers class * { public <init>(org.json.JSONObject); }
c 共性的排除项目
#------------------ 下方是共性的排除项目 ---------------- # 方法名中含有“JNI”字符的,认定是Java Native Interface方法,自动排除 # 方法名中含有“JRI”字符的,认定是Java Reflection Interface方法,自动排除 -keepclasseswithmembers class * { ... *JNI*(...); } -keepclasseswithmembernames class * { ... *JRI*(...); } -keep class **JNI* {*;}
d 避免混淆的第三方jar包
#------------------ 第三方包 ---------------- #-keep class android.support.v4.** { *; } #-keep class android.support.v7.** { *; } #-keep class android.support.v13.** { *; } #-keep class org.apache.commons.net.** { *; } #-keep class android.support.design.** { *; } #-keep class com.google.gson.** { *; } #-keep class com.android.volley.** { *; } #-keep class com.viewpagerindicator.** { *; } #-keep class uk.co.senab.photoview.** { *; } #-keep class com.github.mikephil.charting.** { *; } #-keep class android.support.annotation.** { *; } #-keep class com.readystatesoftware.systembartint.** { *; } #-keep class com.google.zxing.** { *; }
e 忽略警告
#忽略警告 -keep class android.support.**{*;} -dontwarn android.support.** -dontwarn android.webkit.WebView
f 第三方的sdk 本文中收录的 第三方的sdk 混淆代码 如果 没有被收录的请自行百度
# 百度地图过滤 -keep class com.baidu.** {*;} -keep class vi.com.** {*;} -dontwarn com.baidu.** # butterknife7.0 -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepnames class * { @butterknife.Bind *;} -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # Glide -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # retrofit1.9.0 -dontwarn rx.** -dontwarn com.google.appengine.api.urlfetch.** -keep class retrofit.** { *; } -keepclasseswithmembers class * { @retrofit.http.* <methods>; } -keepattributes Signature -keepattributes *Annotation* # retrofit2.0 -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions # okhttp -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } # Okio -keep class sun.misc.Unsafe { *; } -dontwarn java.nio.file.** -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -dontwarn okio.** # universal-image-loader -dontwarn com.nostra13.universalimageloader.** -keep class com.nostra13.universalimageloader.** { *; } # 阿里百川 -keepattributes Signature -keep class sun.misc.Unsafe { *; } -keep class com.taobao.** {*;} -keep class com.alibaba.** {*;} -keep class com.alipay.** {*;} -dontwarn com.taobao.** -dontwarn com.alibaba.** -dontwarn com.alipay.** -keep class com.ut.** {*;} -dontwarn com.ut.** -keep class com.ta.** {*;} -dontwarn com.ta.** -keep class anet.**{*;} -keep class org.android.spdy.**{*;} -keep class org.android.agoo.**{*;} -dontwarn anet.** -dontwarn org.android.spdy.** -dontwarn org.android.agoo.** # ShareSDK -keep class cn.sharesdk.**{*;} -keep class com.sina.**{*;} -keep class **.R$* {*;} -keep class **.R{*;} -dontwarn cn.sharesdk.** -dontwarn **.R$* # 微信支付分享 -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;} # 支付宝 -keep class com.alipay.android.app.IALiPay{*;} -keep class com.alipay.android.app.IALixPay{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} # 百度云推送 #-libraryjars libs/pushservice-5.2.0.12.jar -dontwarn com.baidu.** -keep class com.baidu.**{*; }
g 针对项目的 bean文件 R文件 和 webView 需要添加的代码
#------------------ 得威电商 ---------------- -keep class com.e_dewin.dewinapp.bean.** { *; } -keep public class com.e_dewin.dewinapp.R$*{ public static final int *; } #WebView调用JS代码的类都需要加这个 -keep class com.pandaol.ui.login.LoginActivity$CommonScriptInterface { *; }三 配置文件下载地址 点击打开链接