混淆总结

最近项目开始混淆,找了好多资料,顺便在这里记录一下一些常用的,留待备用!(如果有错误欢迎留言指出,我会及时修改)

常用命令

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 异常

常用不被混淆的命令

  1. 基本不被混淆的规则
#--------------------------------------------------------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:基本规则--------------------------------------------

  1. 针对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自身不被混淆的规则--------------------------------------
  1. 针对依赖的库、包的设置
# -----------------------------------------------------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:针对依赖的库、包的规则--------------------------------------
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • 如何开启混淆 eclipse 只需要在工程中找到projiect.properties文件,在这个文件中修改下面一...
    mymdeep阅读 3,064评论 0 1
  • 纯粹是个人学习总结,如有不对的地方请吐槽。 -include {filename} 从给定的文件中读取配置参...
    junwu_123阅读 3,339评论 0 0
  • 混淆 关于混淆的概念请移步郭霖大神博客:Android安全攻防战,反编译与混淆技术完全解析(下)。小白必看,全面易...
    _戏_梦阅读 5,443评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,169评论 25 709

友情链接更多精彩内容