一 混淆的目的 ,避免项目被反编译。
二 混淆的步骤(本文只针对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 {
*;
}
三