开启混淆:
// build.grdle
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 签名文件
signingConfig signingConfigs.release
}
在proguard-rules.pro配置混淆的模版:
# 代码混淆压缩比,在0~7之间,默认为5,一般不需要改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 不进行预校验,Android不需要,可加快混淆速度。
-dontpreverify
# 混淆时记录日志(打印混淆的详细信息)
-verbose
# printmapping指定映射文件的名称
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 避免混淆Annotation、内部类、泛型、匿名类
-keepattributes *Annotation*,InnerClasses
# 防止埋点代码逻辑给剔除了
-dontshrink
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆
-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
-keep class android.support.** {*;}
# androidx
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**
# 表示不混淆任何包含native方法的类的类名以及native方法名
-keepclasseswithmembernames class * {
native <methods>;
}
# 不能混淆枚举中的value和valueOf方法,因为这两个方法是静态添加到代码中进行,也会被反射使用,所以无法混淆这两种方法。
# 应用使用枚举将添加很多方法,增加了包中的方法数,将增加 dex 的大小。
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 表示不混淆任何一个View中的setXxx()和getXxx()方法,
# 因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。
# 保留我们自定义控件(继承自View)不被混淆
-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);
}
# 表示不混淆Parcelable实现类中的CREATOR字段,
# 毫无疑问,CREATOR字段是绝对不能改变的,包括大小写都不能变,不然整个Parcelable工作机制都会失败。
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 这指定了继承Serizalizable的类的如下成员不被移除混淆
-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();
}
# 不混淆资源类下static的
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
#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);
}
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.WebChromeClient{
public void openFileChooser(...);
}
-keepattributes *JavascriptInterface*
# 自己项目的
# 实体Model不能混淆,否则找不到对应的属性获取不到值,包括所有包名的model
-dontwarn 自己包名.model.**
-keep class 自己包名.model.** { *; }
#=== ijk播放器
-keep class tv.danmaku.ijk.media.player.**{*;}
#=== ijk播放器
#Gson
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.** { *;}
-keepattributes Signature
-keepattributes EnclosingMethod
#okHttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.{*;}
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform
#retrofit2
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn javax.annotation.**
-dontwarn javax.inject.**
-keepattributes *JavascriptInterface*
#-keepattributes SourceFile,LineNumberTable #保持代码的行数
-keepattributes Signature
-keep public class * extends com.lecloud.js.http.parser.BaseJsParser
-keepclassmembers class android.os.SystemProperties{
public <fields>;
public <methods>;
}
#========glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#========glide
#========eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
#========eventbus
# ==== ARouter ====
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider
# ==== ARouter ====
#=== 腾讯TBS
#即便腾讯提供的TBS jar 已经混淆过,App 混淆时可以不再混淆TBS jar;
#但在glide v4使用后,仍然出现了混淆导致打包失败,故使用了如下混淆代码;
-keep class com.tencent.smtt.export.external.**{*;}
-dontwarn com.tencent.smtt.export.external.**
-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**
-keep class com.tencent.smtt.** {
*;
}
-keep class com.tencent.tbs.** {
*;
}
#=== 腾讯TBS