最近项目开始混淆,找了好多资料,顺便在这里记录一下一些常用的,留待备用!(如果有错误欢迎留言指出,我会及时修改)
常用命令
keep命令:
-keep xxx.xxx.* 一颗星表示不混淆该包下的类,而子包下的类还是会被混淆。
-keep xxx.xxx.** 两颗星表示都不被混淆。
-keep xxx.xxx.** { *; } 表示类内部的方法和变量都不被混淆
哪些要进行混淆设置的
1.使用了自定义控件那么要保证它们不参与混淆
2.使用了枚举要保证枚举不被混淆
3.对第三方库中的类不进行混淆
4.运用了反射的类也不进行混淆
5.使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
6.在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
7.有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
8.Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常
常用不被混淆的命令
- 基本不被混淆的规则
#--------------------------------------------------------Begin:基本规则--------------------------------------------
# 代码混淆压缩比,在0和7之间,默认为5,一般不需要改
-optimizationpasses 5
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的4个步骤之一
# Android不需要preverify,去掉这一步可加快混淆速度
-dontpreverify
# 有了verbose这句话,混淆后就会生成映射文件
-verbose
# 然后使用printmapping指定映射文件的名称
-printmapping proguardMapping.txt
# 指定混淆时采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不改变
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
# 保护代码中的Annotation不被混淆,这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation*
# 避免混淆泛型,这在JSON实体映射时非常重要,比如fastJson
-keepattributes Signature
# 抛出异常时保留代码行号,在异常分析中可以方便定位
-keepattributes SourceFile,LineNumberTable
# 用于告诉ProGuard,不要跳过对非公开类的处理。默认情况下是跳过的,因为程序中不会引用它们,有些情况下人们编写的代码与类库中的类在同一个包下,并且对包中内容加以引用,此时需要加入此条声明。
-dontskipnonpubliclibraryclasses
# 这个是给Microsoft Windows用户的,因为ProGuard假定使用的操作系统是能区分两个只是大小写不同的文件名,但是Microsoft Windows不是这样的操作系统,所以必须为ProGuard指定-dontusemixedcaseclassnames选项
-dontusemixedcaseclassnames
# 保留R$*类中静态字段的字段名
-keepclassmembers class **.R$* {
public static <fields>;
}
# 保留继承Android四大组件的子类
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
# 保留了继承自Application的子类
-keep public class * extends android.app.Application
# 保留所有继承自View的类(即:所有自定义View)
# 保留自定义控件(继承自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);
}
# 下面这3行不是很懂,有知道的说明一下!
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
# 保留在Activity中的方法参数是view的方法,从而我们在layout里面编写onClick就不会被影响
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
# 保留Parcelable序列化的类不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留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();
}
# 注意如果要去除日志类,要将系统默认的混淆文件改为:`proguard-android-optimize.txt` 因为它已经默认打开优化开关
# 将日志设置为无效(实际APP不打印Log)
# 去除系统的Log类
-assumenosideefects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
#--------------------------------------------------------End:基本规则--------------------------------------------
- 针对APP自身的不被混淆的设置
#-------------------------------------------------------Begin:针对app自身不被混淆的规则-------------------------------------
# 注意如果要去除日志类,要将系统默认的混淆文件改为:`proguard-android-optimize.txt` 因为它已经默认打开优化开关
# 去除自定义的Log类(这里使用了LoggerUtils封装了Logger)
-assumenosideefects classxxx.xx.xxx {
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
# 保留实体类和成员不被混淆(这里建议把项目中所有的bean放入到同一个包名下面,方便设置)
-keep public class xxxx.com.xxx.bean.** {
public void set*(***);
public *** get*();
public *** is*();
}
# 枚举类不能被混淆(如果用到的话)
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 对WebView的处理
-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, java.lang.String);
}
# 保留JS方法不被混淆
-keepclassmembers class com.example.xxx.MainActivity$JSInterface1 {
<methods>;
}
# 保留所有的本地native方法不被混淆(如果使用了NDK)
-keepclasseswithmembernames class * {
native <methods>;
}
#-------------------------------------------------------End:针对app自身不被混淆的规则--------------------------------------
- 针对依赖的库、包的设置
# -----------------------------------------------------Begin:针对依赖的库、包的规则--------------------------------------
# 这里没有设置 libs 文件夹下面的 jar文件,因为看到有文章说不用设,姑且一试。
# -------------------------------1. 官方的库、依赖文件 -----------------------------
# 保留android-support-v4 所有类
-keep class android.support.v4.**
# 保留v4的所有接口
-keep interface android.support.v4.**
# 保留系统中继承v4/v7包的类,不被混淆
-keep class android.support.** { *; }
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep public class * extends android.support.v7.**
-keep interface android.support.v7.app.** { *; }
-dontwarn android.support.**
# 保留系统中继实现v4/v7包的接口,不被混淆
-keep public class * implements android.support.v4.**
-dontwarn android.support.v4.**
# Design包不混淆
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
# -------------------------------1. 第三方的库、依赖文件 -----------------------------
#百度地图
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
#BaseRecyclerViewAdapterHelper库混淆规则
-keep class com.chad.library.adapter.** {
*;
}
-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
-keep public class * extends com.chad.library.adapter.base.BaseViewHolder
-keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder {
<init>(android.view.View);
}
# Glide 混淆配置
-keep public class * implements com.bumptech.glide.module.GlideModule
#-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# banner 的混淆代码
-keep class com.youth.banner.** {
*;
}
# zxing 的混淆代码
-keep class com.google.zxing.client.android.** {
*;
}
# okgo
#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
#okio
-dontwarn okio.**
-keep class okio.**{*;}
# takephoto混淆
-keep class com.jph.takephoto.** { *; }
-dontwarn com.jph.takephoto.**
-keep class com.darsh.multipleimageselect.** { *; }
-dontwarn com.darsh.multipleimageselect.**
-keep class com.soundcloud.android.crop.** { *; }
-dontwarn com.soundcloud.android.crop.**
# 沉浸式状态栏
-keep class com.gyf.barlibrary.* {*;}
# Gson的混淆,最下面原来还有一行的,类似于上面对所有bean对象的设置
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
##---------------End: proguard configuration for Gson ----------
#地区3级联动选择器citypickerview
-keep class com.lljjcoder.**{*;}
### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
#-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
#-dontwarn rx.**
# Brvah万能适配器
-keep class com.chad.library.adapter.** {
*;
}
-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
-keep public class * extends com.chad.library.adapter.base.BaseViewHolder
-keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder {
<init>(...);
}
# Rxjava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
# butterKnife黄油刀
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
# ---------------------------下面的是找不到混淆的设置,先预留位置,如果报错就设置------------------------------------
# Expanble:可折叠列表sectioned-recyclerview
#-keep class com.afollestad.** { *; }
# google的流式布局
#-keep class com.google.android.flexbox.** { *; }
# photoview
#-keep class com.github.chrisbanes.** { *; }
# logger日志
# XTabLayout
# ---------------------------------------------------End:针对依赖的库、包的规则--------------------------------------