• 1、日常开发Debug包时不用混淆,正式发布Release包前开启代码混淆;
  • 2、混淆好处① → 类、方法、变量名变成短且无意义的名字,提高反编译后代码的阅读成本;
  • 3、混淆好处② → 删除无用的类、方法与属性,缩减了APK包的大小;
  • 4、混淆好处③ → 对字节码进行优化,移除无用指令,应用运行更快;
  • 5、怎么混淆 → 主项目的 build.gradle 设置 minifyEnabled trueproguard-rules.pro 加入混淆规则;
  • 6、混淆规则哪里来 → 网上搜索通用混淆模板复制粘贴,项目依赖到的第三方库官方文档复制粘贴;

app层级的build.gradle加下release的签名和编译配置:

signingConfigs {release {storeFile file('../test.jks')storePassword '123456'keyAlias 'test'keyPassword '123456'}
}buildTypes {release {// 启用代码压缩、优化及混淆minifyEnabled true// 启用资源压缩,需配合 minifyEnabled=true 使用shrinkResources true// 指定混淆保留规则proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'// 包签名signingConfig signingConfigs.release}
}

1. 混淆设置参数

-optimizationpasses 5                       # 代码混淆的压缩比例,值介于0-7,默认5
-verbose                                    # 混淆时记录日志
-dontoptimize                               # 不优化输入的类文件
-dontshrink                                 # 关闭压缩
-dontpreverify                              # 关闭预校验(作用于Java平台,Android不需要,去掉可加快混淆)
-dontoptimize                               # 关闭代码优化
-dontobfuscate                              # 关闭混淆
-ignorewarnings                             # 忽略警告
-dontwarn com.squareup.okhttp.**            # 指定类不输出警告信息
-dontusemixedcaseclassnames                 # 混淆后类型都为小写
-dontskipnonpubliclibraryclasses            # 不跳过非公共的库的类
-printmapping mapping.txt                   # 生成原类名与混淆后类名的映射文件mapping.txt
-useuniqueclassmembernames                  # 把混淆类中的方法名也混淆
-allowaccessmodification                    # 优化时允许访问并修改有修饰符的类及类的成员
-renamesourcefileattribute SourceFile       # 将源码中有意义的类名转换成SourceFile,用于混淆具体崩溃代码
-keepattributes SourceFile,LineNumberTable  # 保留行号
-keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod # 避免混淆注解、内部类、泛型、匿名类
-optimizations !code/simplification/cast,!field/ ,!class/merging/   # 指定混淆时采用的算法
复制代码

2. 保持不被混淆的设置

语法组成

[保持命令] [类] {[成员]
}
复制代码

保持命令

-keep                           # 防止类和类成员被移除或被混淆;
-keepnames                      # 防止类和类成员被混淆;
-keepclassmembers               # 防止类成员被移除或被混淆;
-keepclassmembernames           # 防止类成员被混淆;
-keepclasseswithmembers         # 防止拥有该成员的类和类成员被移除或被混淆;
-keepclasseswithmembernames     # 防止拥有该成员的类和类成员被混淆;
复制代码

  • 具体的类
  • 访问修饰符 → public、private、protected
  • 通配符(*) → 匹配任意长度字符,但不包含包名分隔符(.)
  • 通配符(**) → 匹配任意长度字符,且包含包名分隔符(.)
  • extends → 匹配实现了某个父类的子类
  • implements → 匹配实现了某接口的类
  • $ → 内部类

成员

  • 匹配所有构造器 → <init>
  • 匹配所有域 → <field>
  • 匹配所有方法 → <methods>
  • 访问修饰符 → public、private、protected
  • 除了 *** 通配符外,还支持 *** 通配符,匹配任意参数类型
  • ... → 匹配任意长度的任意类型参数,如void test(...)可以匹配不同参数个数的test方法

常用自定义混淆规则范例

# 不混淆某个类的类名,及类中的内容
-keep class cn.coderpig.myapp.example.Test { *; }# 不混淆指定包名下的类名,不包括子包下的类名
-keep class cn.coderpig.myapp*# 不混淆指定包名下的类名,及类里的内容
-keep class cn.coderpig.myapp* {*;}# 不混淆指定包名下的类名,包括子包下的类名
-keep class cn.coderpig.myapp**# 不混淆某个类的子类
-keep public class * extends cn.coderpig.myapp.base.BaseFragment# 不混淆实现了某个接口的类
-keep class * implements cn.coderpig.myapp.dao.DaoImp# 不混淆类名中包含了"entity"的类,及类中内容
-keep class **.*entity*.** {*;}# 不混淆内部类中的所有public内容
-keep class cn.coderpig.myapp.widget.CustomView$OnClickInterface {public *;
}# 不混淆指定类的所有方法
-keep cn.coderpig.myapp.example.Test {public <methods>;
}# 不混淆指定类的所有字段
-keep cn.coderpig.myapp.example.Test {public <fields>;
}# 不混淆指定类的所有构造方法
-keep cn.coderpig.myapp.example.Test {public <init>;
}# 不混淆指定参数作为形参的方法
-keep cn.coderpig.myapp.example.Test {public <methods>(java.lang.String);
}# 不混淆类的特定方法
-keep cn.coderpig.myapp.example.Test {public test(java.lang.String);
}# 不混淆native方法
-keepclasseswithmembernames class * {native <methods>;
}# 不混淆枚举类
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}#不混淆资源类
-keepclassmembers class **.R$* {public static <fields>;
}# 不混淆自定义控件
-keep public class * entends android.view.View {*** get*();void set*(***);public <init>;
}# 不混淆实现了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();
}# 不混淆实现了parcelable接口的类成员
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}# 注意事项:
#
# ① jni方法不可混淆,方法名需与native方法保持一致;
# ② 反射用到的类不混淆,否则反射可能出问题;
# ③ 四大组件、Application子类、Framework层下的类、自定义的View默认不会被混淆,无需另外配置;
# ④ WebView的JS调用接口方法不可混淆;
# ⑤ 注解相关的类不混淆;
# ⑥ GSON、Fastjson等解析的Bean数据类不可混淆;
# ⑦ 枚举enum类中的values和valuesof这两个方法不可混淆(反射调用);
# ⑧ 继承Parceable和Serializable等可序列化的类不可混淆;
# ⑨ 第三方库或SDK,请参考第三方提供的混淆规则,没提供的话,建议第三方包全部不混淆;

来源: https://juejin.cn/post/6966526844552085512

最全面的Android混淆相关推荐

  1. 最全面的Android Studio使用教程【申明:来源于网络】

    最全面的Android Studio使用教程[申明:来源于网络] http://www.admin10000.com/document/5496.html 转载于:https://www.cnblog ...

  2. 最全面的Android资料大全

    手记 \ 最全面的Android资料大全 看到很多人提问非科班该如何学习编程,其实科班也基本靠自学.有句话叫"师傅领进门修行靠个人",再厉害的老师能教你的东西都是很有限的,真正的修 ...

  3. 最全面的Android工程师知识图谱推荐

    平时看见不错的Android工程师知识图谱,都会习惯性地瞅两眼,今天浏览了一个小程序,发现其中有Android工程师相关的图谱,闲着没事就点进去看了一下,写的东西很实用,全是Android工程师岗位必 ...

  4. 非常全面的Android Bitmap知识点梳理

    在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识. 所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析. 1 ...

  5. 最全面的Android热修复技术

    2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以 及微信Tinker,它们在原理各有不同,适用场景各异, ...

  6. 全面的Android studio的setting设置,

    有时候,需要,需要去设置一些东西,,这个比较全面,记录一下,下次就直接找 Android  studio  的setting的配置. https://blog.csdn.net/m0_37711172 ...

  7. 【安卓真机调试】较全面的Android真机调试详解

    目录 1. 启动调试功能 1.1 配置设备上的开发者选项 1.2 运行可调试的 build 变体 2 开始调试 2.1 设置断点 2.2 选择设备 2.3 在工具栏中点击Debug图标 2.4 打开D ...

  8. 史上最全的Android面试题集锦

    Android基本知识点 1.常规知识点 1. Android类加载器 在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的.只不过And ...

  9. 2020史上最全的Android面试题集锦

    Android基本知识点 1.常规知识点 1. Android类加载器 在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的.只不过And ...

  10. 史上最全的Android性能优化面试题集锦

    前言 很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场. ...

最新文章

  1. java 集成grizzly_java – 在Grizzly上使用JaaS和Jersey
  2. 2.3.2 Batch Norm介绍
  3. How to Review a Paper
  4. AngularJS之ng-class(十一)
  5. Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg
  6. openshift_OpenShift上具有NetBeans的Java EE
  7. java tcp 仿真工具_MODBUS-TCP Client Tester(免费从站仿真工具)V1.01 最新版
  8. IDC:物联网计划对IT基础设施影响重大
  9. 增加 magento top_menu菜单
  10. 关于判断后该数据类型是否发生了转变
  11. 自下而上分析法基本问题
  12. 免费源码赠送之 printf(C语言简化版)
  13. Windows+Linux 双系统安装教程
  14. 当你发现自己U盘里文件夹有了“.exe”后缀该怎么办
  15. SI9000阻抗计算安装教程
  16. php怎么做性格测试题目,PHP和原生JS实现九型人格在线测试(144题)
  17. HTML5响应式手机模板:MUI手机app前端页面开发框架模板HTML+CSS+JavaScript
  18. 手把手教你快速搭建Struts2框架【详细教程,建议收藏】
  19. CSS去掉border框的方法
  20. Win11U盘拒绝访问怎么办?Win11U盘拒绝访问的有效解决方法

热门文章

  1. 使用Daemontools监控管理服务
  2. Java实习日记(2-1)
  3. uniapp手写_uniapp 手写 Steps 步骤条
  4. 谐振功率放大器的工作原理
  5. 高频小信号谐振放大器的matlab仿真,高频小信号谐振放大器的MATLAB仿真
  6. 常用的excel函数—汇总
  7. 工作站Linux双显卡BIOS设置,在BIOS Setup里面设置双显卡机型的双显卡模式教程
  8. 转动惯量与惯性矩(截面)比较
  9. 《电路》邱关源 思维导图 第二章 电阻电路的等效变换
  10. 单交换机的vlan划分