美文网首页Android studio【idea】
Android 混淆大法 摘记

Android 混淆大法 摘记

作者: 吾乃韩小呆 | 来源:发表于2019-07-25 16:20 被阅读38次

    写在前面

    各位亲朋好友们,各位简书的兄弟姐妹,我想死你们啦!此处应有掌声,消失了即将两个月的韩小呆,我又回来了了,再次需要掌声,呆者终于适应了新公司的各种模式(其实是手撸了一个从0-1的项目)。下面呆者将开始完成之前未完成的使命与责任。开门营业第一天,先不来难的,咱们来说说混淆吧,其实我是被友盟的混淆给坑了。最后,谢谢各位朋友的关心与支持,我们进入正题。

    一、打开混淆

    1、找到项目的 app 的 model 的 gradle 文件


    目标文件

    2、打开混淆开关


    打开开关
    3、找到混淆规则文件
    混淆规则文件

    二 、混淆规则解释

    -include {filename}    从给定的文件中读取配置参数   
    -basedirectory {directoryname}    指定基础目录为以后相对的档案名称   
    -injars {class_path}    指定要处理的应用程序jar,war,ear和目录   
    -outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称   
    -libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件   
    -dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。   
    -dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。  
    
    保留选项   
    -keep {Modifier} {class_specification}    保护指定的类文件和类的成员   
    -keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好  
    -keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。   
    -keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)   
    -keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)   
    -keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)   
    -printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件   
    
    压缩   
    -dontshrink    不压缩输入的类文件   
    -printusage {filename}   
    -dontwarn   如果有警告也不终止  
    -whyareyoukeeping {class_specification}       
    
    优化   
    -dontoptimize    不优化输入的类文件   
    -assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用   
    -allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员   
    
    混淆   
    -dontobfuscate    不混淆输入的类文件   
    -printmapping {filename}   
    -applymapping {filename}    重用映射增加混淆   
    -obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称   
    -overloadaggressively    混淆时应用侵入式重载   
    -useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆   
    -flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中   
    -repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中   
    -dontusemixedcaseclassnames    混淆时不会产生形形色色的类名   
    -keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and   
    
    InnerClasses.   
    -renamesourcefileattribute {string}    设置源文件中给定的字符串常量  
    

    三、常用混淆规则

    #指定代码的压缩级别
    -optimizationpasses 5
    
    #包明不混合大小写
    -dontusemixedcaseclassnames
    
    #不去忽略非公共的库类
    -dontskipnonpubliclibraryclasses
    
     #优化  不优化输入的类文件
    -dontoptimize
    
     #预校验
    -dontpreverify
    
     #混淆时是否记录日志
    -verbose
    
     # 混淆时所采用的算法
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
    #忽略警告
    -ignorewarnings
    #如果有引用v4包可以添加下面这行
    -keep public class * extends android.support.v4.app.Fragment
    #列出从 apk 中删除的代码
    -printusage proguard/unused.txt
    #混淆前后的映射
    -printmapping proguard/mapping.txt
    
    #如果引用了v4或者v7包
    -dontwarn android.support.**
    #保持 native 方法不被混淆
    #-keepclasseswithmembernames class * {
    #    native <methods>;
    #}
    #保持自定义控件类不被混淆
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
    }
    #保持自定义控件类不被混淆
    -keepclassmembers class * extends android.app.Activity {
      public void *(android.view.View);
    }
    -keep public class * extends android.view.View {
        public <init>(android.content.Context);
      public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
       public void set*(...);
    }
    #保持 Parcelable 不被混淆
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    
    #保持 Serializable 不被混淆
    -keepnames class * implements java.io.Serializable
    #不混淆资源类
    -keepclassmembers class **.R$* {
       public static <fields>;
    }
    #避免混淆泛型 如果混淆报错建议关掉
    #-keepattributes Signature
    #移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
    -assumenosideeffects class android.util.Log {
        public static *** v(...);
        public static *** i(...);
       public static *** d(...);
        public static *** w(...);
        public static *** e(...);
    }
    
    #---------------------------------实体类---------------------------------
    #修改成你对应的包名
    -keep public class com.test.test.entity.**{*;}
    #---------------------------------第三方包-------------------------------
    #---------------------------------友盟-------------------------------
    -dontwarn com.taobao.**
    -dontwarn anet.channel.**
    -dontwarn anetwork.channel.**
    -dontwarn org.android.**
    -dontwarn org.apache.thrift.**
    -dontwarn com.xiaomi.**
    -dontwarn com.huawei.**
    
    -keepattributes *Annotation*
    
    -keep class com.taobao.** {*;}
    -keep class org.android.** {*;}
    -keep class anet.channel.** {*;}
    -keep class com.umeng.** {*;}
    -keep class com.xiaomi.** {*;}
    -keep class com.huawei.** {*;}
    -keep class org.apache.thrift.** {*;}
    
    -keep class com.alibaba.sdk.android.**{*;}
    -keep class com.ut.**{*;}
    -keep class com.ta.**{*;}
    
    -keep public class **.R$*{
       public static final int *;
    }
    #---------------------------------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 *;
    }
    
    ## for DexGuard only
    #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
    
    #---------------------------------百度ocr-------------------------------
    -keep class com.baidu.ocr.sdk.**{*;}
    -dontwarn com.baidu.ocr.**
    #---------------------------------fastJson-------------------------------
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.fastjson.** { *; }
    
    #---------------------------------banner-------------------------------
    -keep class com.youth.banner.** {
        *;
     }
    
    #---------------------------------support v4-------------------------------
    -dontwarn android.support.v4.**
    -keep class android.support.v4.app.** { *; }
    -keep interface android.support.v4.app.** { *; }
    -keep class android.support.v4.** { *; }
    
    #---------------------------------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.**
    
    # support-v7
    #-dontwarn android.support.v7.**
    #-keep class android.support.v7.internal.** { *; }
    #-keep interface android.support.v7.internal.** { *; }
    #-keep class android.support.v7.** { *; }
    
    # support design
    #---------------------------------support design-------------------------------
    -dontwarn android.support.design.**
    -keep class android.support.design.** { *; }
    -keep interface android.support.design.** { *; }
    -keep public class android.support.design.R$* { *; }
    #-------------- Retrofit----------------------------------------
    #-dontwarn retrofit2.**
    #-keep class retrofit2.** { *; }
    
    -dontnote retrofit2.Platform
    -dontnote retrofit2.Platform$IOS$MainThreadExecutor
    -dontwarn retrofit2.Platform$Java8
    -keepattributes Signature
    -keepattributes Exceptions
    
    
    
    #-keepattributes Signature-keepattributes Exceptions
    # --------------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;
    }
    
    #-------------- Gson------------------------
    -keep class com.google.gson.stream.** { *; }
    -keepattributes EnclosingMethod
    
    

    两个月没有写东西,小试牛刀,谢谢各位亲朋好友,对了这个文章部分内容来自:Android混淆 特别感谢。

    四、补充

    有没有发现当你在文件内配置了如下代码 ,但是 正式版依旧输出 log 。

    -assumenosideeffects class android.util.Log {
        public static *** v(...);
        public static *** i(...);
        public static *** d(...);
        public static *** w(...);
        public static *** e(...);
    }
    

    解决办法如下

     release {// 生产环境
                    buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志
                    buildConfigField("String", "URL_PERFIX", "\"https://release.cn/\"")// 配置URL前缀
                    minifyEnabled true//是否对代码进行混淆
                    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
                    signingConfig signingConfigs.release//设置签名信息
                    shrinkResources true
                    pseudoLocalesEnabled false//是否在APK中生成伪语言环境,帮助国际化的东西,一般使用的不多
                    zipAlignEnabled true//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
                    debuggable false//是否支持断点调试
                }
    

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro''proguard-android.txt文件替换为 proguard-android-optimize.txt 文件就好了 ,然后在自己的 混淆文件加入 log的 禁止打印规则, 对了 proguard-android-optimize.txt文件的位置 在 SDK目录/tools/proguard/ 目录下面

    相关文章

      网友评论

        本文标题:Android 混淆大法 摘记

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