Android 混淆大法 摘记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiangshiweiyu_hd/article/details/97271540

写在前面

各位亲朋好友们,各位简书的兄弟姐妹,我想死你们啦!此处应有掌声,消失了即将两个月的韩小呆,我又回来了了,再次需要掌声,呆者终于适应了新公司的各种模式(其实是手撸了一个从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/ 目录下面

猜你喜欢

转载自blog.csdn.net/xiangshiweiyu_hd/article/details/97271540