proguard 混淆工具的用法 (适用于初学者参考)
一、 ProGuard简介
因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。
ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。
- 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
- 优化(Optimize):对字节码进行优化,移除无用的指令。
- 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
- 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
总而言之,根据官网的翻译:Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。
ProGuard工作原理
ProGuar由shrink、optimize、obfuscate和preveirfy四个步骤组成,每个步骤都是可选的,我们可以通过配置脚本来决定执行其中的哪几个步骤。

混淆就是移除没有用到的代码,然后对代码里面的类、变量、方法重命名为人可读性很差的简短名字。
那么有一个问题,ProGuard怎么知道这个代码没有被用到呢?
这里引入一个Entry Point(入口点)概念,Entry Point是在ProGuard过程中不会被处理的类或方法。在压缩的步骤中,ProGuard会从上述的Entry Point开始递归遍历,搜索哪些类和类的成员在使用,对于没有被使用的类和类的成员,就会在压缩段丢弃,在接下来的优化过程中,那些非Entry Point的类、方法都会被设置为private、static或final,不使用的参数会被移除,此外,有些方法会被标记为内联的,在混淆的步骤中,ProGuard会对非Entry Point的类和方法进行重命名。
二、proGuard基本使用之UI界面操作
1.去proGuard 官网下载地址下载并解压proguard,执行 bin目录下的proguardgui.bat 如下图。
2.启动后如下图所示,我们重按展示顺序一步一步向下走ProGuard。

注:红色圈内为加载配置文件按钮.官方推介”myconfig.pro”文件格式,其他博客写的配置文件都为xxx.cfg格式.在没有配置文件下可不做此操作。
3.Input/Output展示如下图。

注:工具很强大,可以导入各种的包如(jar,war,ears,zips)等格式的进行操作。由于对其他格式的文件操作不熟不知会产生什么莫名错误。所以就以jar文件做为例子.
Add input:导入需要操作的文件。
Add Outinput: 需要输入的文件。
Filter: 过滤导入文件内那些不需要操作的文件。
Add an enty:添加支持库library jars. 对添加的项目支持 jar文件或者其他文件不会进行处理。
3.shrinking如下图。

注:proGuard的压缩属性。删除无效的代码(未研究)
4.Obfuscation 代码混淆的主要配置如下图

注:勾选中为需要做什么什么操作。
1. obfuscate 代码混淆
2. Print Mapping 输出映射文件即混淆后与混淆前的映射
3. Apply mapping 应用映射文件
4. Obfuscation dictionary 自定义混淆的类名,方法名,变量名字典,替换原先的a,b,c.这中格式的
5. Class Obfuscation dictionary
6. Package Obfuscation dictionary
7. Overload aggressively 混淆的时候大量使用重载,减小包体积,增加理解难度
8. User unique clssmember names 指定相同的混淆名对应相同的方法名
9. User mixed-case class names 指定在混淆的时候使用大小写混用的类名
10. Keep package names 声明不混淆指定的包名
11. Flatten package hierarchy 所有重新命名的包都重新打包
12. Repackage Classes 所有重新命名过的类都重新打包
13. Keep attributes 指定受保护的属性
14. Keep parameter names 指定被保护的方法的参数类型和参数名不被混淆
15. Rename sourceFile attribute 指定一个字符串常量设置到源文件的类的属性中
16. Adapt class strings 指定字符串常量如果与类名相同,也需要被混淆
17. Adapt resource file names 如果资源文件与某类名同,那么混淆后资源文件被命名为与之对应的类的混淆名
18. Adapt resource file names 指定资源文件的中的类名随混淆后的名字更新
ADD 操作 添加自定义的一些文件不被混淆 使用通配符的形式进行匹配
5.Optimization 代码优化 如下图

6.Information 如下图 一些输出或后台执行信息的配置 默认就好

8.Process 执行操作界面 包含查看配置文件,保存配置文件和执行按钮操作

三、 Maven项目配置ProGuard
- maven集成proguard .pom文件配置方式有三种放在。
- 利用注解的方式在需要的混淆的文件中给上相应的注解。
- 直接以<option><option> 的方式编辑相应参数配置
- 加载配置文件的形式 .pro文件或.cfg 文件
- 配置文件模板.可参考附带项目列子 .pom 文件
- 注:proguard并没有提供直接打成war的方式。一般情况都市生成jar包并把jar包做混淆,之后替换原有的class文件。
四、 ProGuard一些注意事项
a. 反射使用。比如 setName() 方法通过混淆被映射为了 a() 如果我们希望通过方法名 setName 来调用类中的该方法,在写代码的时候,我们也不会知道这个名字将会被映射为 a ,混淆之后,会找不到方法的。 混淆使得方法名发生改变,而我们还在使用原来的方法名进行反射。
b. bean 文件使用。对于 bean 文件,很多时候,它们作为和服务器之间的通信实体。如果在这种情况下进行了混淆,当数据发给服务器之后,服务器是看不懂的,因为属性名都变了,而服务端保存的是原来的 bean 文件(序列化问题,json问题)。
c. 回调函数。这是一个值得注意的地方。比如在 Activity 中的 onTouchEvent 回调,如果被你混淆了,而系统实际上不知道的,混淆是你的个人行为。它不会知道到该回调的,同样因为找不到。
d. 枚举。在使用枚举类型的时候,应当注意不要对它们进行混淆。因为枚举会使用反射进行操作。
e. native 方法不要混淆。
f. 内嵌类经常会被混淆,结果在调用的时候为空就崩溃了。(开发尽量避免内嵌类)
# 保留内嵌类不被混淆 列:-keep class com.example.xxx.MainActivity$* { *; }
详细请查考附件:proGuard-example
proguard 混淆工具的用法 (适用于初学者参考)的更多相关文章
- 转 proguard 混淆工具的用法 (适用于初学者参考)
转自:https://www.cnblogs.com/lmq3321/p/10320671.html 一. ProGuard简介 附:proGuard官网 因为Java代码是非常容易反编码的,况且An ...
- Java代码混淆工具ProGuard
目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...
- java混淆工具Jocky和Proguard
java混淆工具有很多种,这里介绍Jocky和Proguard 一:Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC).原本是方便Apusic 应用服务器的开发,现在开放出来,供大家 ...
- .NET代码混淆工具NET Reactor - 初学者系列-学习者系列文章
这几天无事,除了看书,然后就倒腾原来的代码.想起.NET的代码混淆工具软件,所以今天就讲讲这个.NET代码混淆工具. .NET代码混淆工具软件,以前有了解和找过,但是当时需求不大,所以找了下就搁置了. ...
- Android 代码混淆、Android Proguard(混淆)
Android Proguard(混淆) 混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.co ...
- proguard混淆jar文件
Proguard是个优秀的java混淆工具,使用示例如下,一个java工程对外接口代码如下(无需混淆) package com.ciaos.open; import com.ciaos.inner.I ...
- 利用Ant与Proguard混淆
利用Ant与Proguard混淆 摘自:https://blog.csdn.net/forlong401/article/details/22956711 2014年04月04日 20:20:21 f ...
- apk反编译(6)用ProGuard 混淆、压缩代码,压缩资源。
1.android官方文档 https://developer.android.com/studio/build/shrink-code 主要内容如下: 1.1 压缩代码 混淆生成的文件:<m ...
- Android Proguard混淆对抗之我见
关于何为Proguard,可以参考GuardSquare官网其优化业务及Wikipedia相关条目. Proguard:https://www.guardsquare.com/proguard Wik ...
随机推荐
- 设计模式学习-使用go实现建造者模式
建造者模式 定义 适用范围 与工厂模式的区别 优点 缺点 参考 建造者模式 定义 Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式. 建造者模式(Builder Patt ...
- idea关联数据库
时区错误解决方法
- vm扩展磁盘容量后不能启动
主要原因是,新添加的磁盘空间没有分配,系统识别不出来,导致不能开机. 解决方法: 找到虚拟机的文件路径地址,默认是C:\Users\用户名\Documents\Virtual Machines\Cen ...
- redis客户端修改了key-value对之后有时会报MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o...错误,不能持久化
解决方案,连接redis客户端 redis目录下:redis-cli -h 127.0.0.1 -p 6379-h后为redis服务器ip,-p后为端口号进入redis-client之后输入命令 co ...
- 全程精髓无废话,腾讯强推Redis深度笔记我粉了
作为目前主流的NoSQL技术,redis在Java互联网中得到了非常广泛的使用,个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多 ...
- 【数据结构&算法】12-线索二叉树
目录 前言 线索二叉树的概念 线索二叉树的实现 线索二叉树的寻点思路二 类双向链表参考图 参考代码 中序遍历线索化 前言 在<大话数据结构>P190 页中有一句话:其实线索二叉树,就等于是 ...
- Mybatis:插入数据返回自增主键
使用Mybatis作为工具连接MySQL,要求在插入数据之后返回自增主键 一开始也很迷惑,Mybatis使用insert之后,成功返回的是1,失败会报错或返回0,主键去哪找来 后来知道Mybatis可 ...
- 手把手教你学Dapr - 6. 发布订阅
上一篇:手把手教你学Dapr - 5. 状态管理 介绍 发布/订阅模式允许微服务使用消息相互通信.生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息.这涉及将它们写入输入通道.同样,消 ...
- 逐浪CMSv8.2发布-集成Node与Vue脚手架和PowerShell支持的新一代网站管理系统
极速下载:https://www.z01.com/down/3713.shtml 楼倚霜树外,镜天无一毫. 南山与秋色,气势两相高. -(唐)杜牧 北京时间2020年10月20日:领先的CMS与web ...
- UML常用建模工具简介,安装方法和各自的优点
这学期学习了统一建模语言,自己初学时对各种建模工具十分陌生,各种名词都不懂,软件也都不了解,开始很是不知所措.为了防止其他初学者陷入我的困境,自己对各种工具进行了总结: Visio:介绍:Visio是 ...