一 、代码的混淆操作步骤:
- 打开混淆开关 build.gradle:app> buildTypes> release minifyEnabled true
release {
//清理无用资源
shrinkResources true
//是否启动ZipAlign压缩
zipAlignEnabled true
//是否混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
//配置签名
signingConfig signingConfigs.release
}
2. 混淆规则的文件:
3. 编写混淆的代码:
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
##***********************************混淆模板*************************##
###混淆规则
## 关闭压缩
#-dontshrink
## 关闭优化
#-dontoptimize
## 关闭混淆
#-dontobfuscate
## 表示保存该包下的类,但是子类会被混淆
#-keep class com.android.xx.*
## 表示保存该包下的类, 子类不会被混淆
#-keep class com.android.xx.**
## 想避免类中的成员不会被混淆
#-keep class com.android.xx.**{*;}
#指定压缩级别 1-7
-optimizationpasses 5
#不跳过非公共的库的类成员
-dontskipnonpubliclibraryclassmembers
#混淆是采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#混淆类中额方法名也混淆了
#-useuniqueclassmembernames
#优化是允许访问并修改修饰符的类和类的成员
-allowaccessmodification
#将文件来源从命名为"SourceFile"字符串
-renamesourcefileattribute SourceFile
#保留行号
-keepattributes SourceFile,LineNumberTable
#保持泛型
-keepattributes Signature
##***********************************************************************##
#保持所有实现Serializable 接口的类成员
-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 * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator * ;
}
-keepclassmembers class * implements android.os.Parcelable {
public <fields>;
private <fields>;
}
# 保持测试相关代码
-dontnote junit.framework.**
-dontnote junit.runner.**
-dontwarn android.test.**
-dontwarn android.support.test.**
-dontwarn org.junit.**
#Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep public class * extends androidx.fragment.app.Fragment
#Android SDK
#-keep class android.app.**{*;}
-keep public class * extends androidx.appcompat.app.AppCompatActivity
-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.preference.Preference
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.annotation.**
-keep public class * extends android.support.v7.**
-keep public class * extends androidx.**
-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.** {*;}
-keep class androidx.** {*;}
-keep class android.**{*;}
#自定义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);
}
# 自己的view
-keep class com.liuguilin.fragment.view.**{*;}
#枚举
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#保持native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
##****************************以上都是官方通用的模板*************************
##******************************第三方SDK****************
##******************** HttpClient *******************
-keep public class org.apache.commons.httpclient.** {*;}
-keep public class org.apache.commons.httpclient.auth.** {*;}
-keep public class org.apache.commons.httpclient.cookie.** {*;}
-keep public class org.apache.commons.httpclient.methods.** {*;}
-keep public class org.apache.commons.httpclient.params.** {*;}
-keep public class org.apache.commons.httpclient.util.** {*;}
-keep public class org.apache.commons.codec.** {*;}
-keep public class org.apache.commons.codec.net.** {*;}
-keep public class org.apache.commons.codec.binary.** {*;}
-keep public class org.apache.commons.logging.** {*;}
-keep public class org.apache.commons.logging.impl.** {*;}
##************************ Bmob ****************************
# 不混淆BmobSdk
-dontwarn cn.bmob.v3.**
-keep class cn.bmob.v3.** {*;}
-keep class c.b.** {*;}
-keep class c.b.a.** {*;}
#保证继承自BmobObject,BmobUser类的JavaBean不被混淆
-keep class * extends cn.bmob.v3.BmobObject {
*;
}
#如果你是使用了okhttp,okio的包 请添加一下混淆代码
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** {*;}
-keep interface com.squareup.okhttp.** {*;}
#************************* Rxjava RxAndroid **********************
-dontwarn rx.*
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQuene*Field*{
long produceIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
##********************** Gson *************************
# Gson specific classes
-keep class sun.misc.Unsafe {*;}
#-keep class com.google.gson.stream.** {*;}
#Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** {*;}
-keep class com.liuguilin.framework.gone.TextBean.** {*;}
-keep class com.liuguilin.framework.gone.TokenBean.** {*;}
-keep class com.liuguilin.framework.gone.VoiceBean.** {*;}
##************************* 3D ***************************
-keep class com.moxun.tagcloudlib.** {*;}
##*************************** circleImageView ******************
-keep class de.hdodenhof.circleimageview.** {*;}
##************************** Glide **************************
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.** {*;}
-keep public class * implements com.bumptech.glide.module.AppGlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
}
##************************** DatePicker 日历 *********************
-keep class cn.aigestudio.datepicker.** {*;}
##************************** Bugly 检查bug *********************
-dontwarn com.tencent.bugly.**
-keep class com.tencent.bugly.** {*;}
##******************************* 高德地图 *******************
#集合包 3D地图 3.3.2 导航1.8.0 定位2.5.0
-dontwarn com.amap.api.**
-dontwarn com.autonavi.**
-keep class com.amap.api.** {*;}
-keep class com.autonavi.** {*;}
#地图服务
-dontwarn com.amap.api.services.**
-keep class com.amap.api.services.** {*;}
# 3D地图
-dontwarn com.amap.api.mapcore.**
-dontwarn com.amap.api.maps.**
-dontwarn com.autonavi.amap.mapcore.**
-keep class com.amap.api.mapcore.** {*;}
-keep class com.amap.api.maps.** {*;}
-keep class com.autonavi.amap.mapcore.** {*;}
#定位
-dontwarn com.amap.api.location.**
-dontwarn com.aps.**
-keep class com.amap.api.location.** {*;}
-keep class com.aps.** {*;}
#导航
-dontwarn com.amap.api.navi.**
-dontwarn com.autonavi.**
-keep class com.amap.api.navi.** {*;}
-keep class com.autonavi.** {*;}
##******************************** 讯飞语音 *********************
-dontwarn com.iflytek.**
-keep class com.iflytek.** {*;}
##********************************* LitePal ************************
-keep class org.litepal.** {*;}
-keep class * extends org.litepal.crud.DataSupport {*;}
-keep class * extends org.litepal.crud.LitePalSupport {*;}
##************************************ EventBus ********************
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode {*;}
##************************************ Tablayout *******************
-keep class com.google.android.** {*;}
##********************************* PhotoView *********************
-keep class com.github.chrisbanes.** {*;}
##******************************** ZxingLibaray *********************
-dontwarn com.google.zxing.**
-keep class com.google.zxing.** {*;}
-keep class cn.yipianfengye.android.** {*;}
-keepclasseswithmembernames class * {native <methods>;}
##**************************** jiaozivideoplayer **********************
-keep public class cn.jzvd.JZMediaSystem {*;}
-keep public class cn.jzvd.demo.CustomMedia.CustomMedia {*;}
-keep public class cn.jzvd.demo.CustomMedia.JZMediaIjk {*;}
-keep public class cn.jzvd.demo.CustomMedia.JZMediaSystemAssertFolder {*;}
-keep class tv.danmaku.ijk.media.player.** {*;}
-dontwarn tv.danmaku.ijk.media.player.*
-keep interface tv.danmaku.ijk.media.player.** {*;}