美文网首页
混淆总结

混淆总结

作者: YbSTGing | 来源:发表于2017-11-29 17:53 被阅读202次

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

    常用命令

    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:针对依赖的库、包的规则--------------------------------------
    

    相关文章

      网友评论

          本文标题:混淆总结

          本文链接:https://www.haomeiwen.com/subject/bulpbxtx.html