转自:https://www.cnblogs.com/lmq3321/p/10320671.html

一、 ProGuard简介

附:proGuard官网

因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。

ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。

  1. 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
  2. 优化(Optimize):对字节码进行优化,移除无用的指令。
  3. 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
  4. 预检(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

  1. maven集成proguard  .pom文件配置方式有三种放在。
    1. 利用注解的方式在需要的混淆的文件中给上相应的注解。
    2. 直接以<option><option> 的方式编辑相应参数配置
    3. 加载配置文件的形式 .pro文件或.cfg 文件
    4. 配置文件模板.可参考附带项目列子 .pom 文件
    5. 注: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 混淆工具的用法 (适用于初学者参考)的更多相关文章

  1. proguard 混淆工具的用法 (适用于初学者参考)

    一. ProGuard简介 附:proGuard官网 因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的cla ...

  2. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

  3. java混淆工具Jocky和Proguard

    java混淆工具有很多种,这里介绍Jocky和Proguard 一:Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC).原本是方便Apusic 应用服务器的开发,现在开放出来,供大家 ...

  4. .NET代码混淆工具NET Reactor - 初学者系列-学习者系列文章

    这几天无事,除了看书,然后就倒腾原来的代码.想起.NET的代码混淆工具软件,所以今天就讲讲这个.NET代码混淆工具. .NET代码混淆工具软件,以前有了解和找过,但是当时需求不大,所以找了下就搁置了. ...

  5. proguard混淆jar文件

    Proguard是个优秀的java混淆工具,使用示例如下,一个java工程对外接口代码如下(无需混淆) package com.ciaos.open; import com.ciaos.inner.I ...

  6. Android 代码混淆、Android Proguard(混淆)

    Android Proguard(混淆)   混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.co ...

  7. 使用proguard混淆android代码

    当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的.为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等.我们须要对代码进行混淆,an ...

  8. Android(java)学习笔记128:使用proguard混淆android代码

    1.当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,an ...

  9. 利用Ant与Proguard混淆

    利用Ant与Proguard混淆 摘自:https://blog.csdn.net/forlong401/article/details/22956711 2014年04月04日 20:20:21 f ...

随机推荐

  1. 如何将声学的spectrogram(声谱图)重新反变换成时域语音信号

    最近在研究一些信号分析的事情,感兴趣如何将频谱信号反变换成时域信号.fft 与ifft可以顺畅的转变,但是这个是一帧信号,当时间较长的信号再一起是,通过反变换变成一帧一帧的时域信号,如何把他们拼接起来 ...

  2. cpu内核态与用户态

    1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...

  3. css语法规范、选择器、字体、文本

    css语法规范 使用 HTML 时需要遵从一定的规范,CSS 也是如此.要想熟练地使用 CSS 对网页进行修饰,首先需要了解CSS 样式规则. CSS 规则由两个主要的部分构成:选择器以及一条或多条声 ...

  4. Effective C++ 总结笔记(二)

    二.构造/析构/赋值运算 05.了解C++默默编写并调用那些函数 如果自己不声明, 编译器就会暗自为class创建一个default构造函数.一个copy构造函数.一个copy assignment操 ...

  5. 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码

    从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...

  6. [bzoj1071]组队

    题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大 ...

  7. [loj3364]植物比较

    结论:设$b_{i}$满足该限制,则$a_{i}$合法当且仅当$\forall i\ne j,a_{i}\ne a_{j}$且$\forall |i-j|<k,[a_{i}<a_{j}]= ...

  8. Class类简介

    Class类 Java中所有的类.接口.枚举.注解.数组.基本数据类型.void关键字,都有Class对象.通过Class对象可以得到类的完整结构,一个Class对象在jvm中只有一个实例. 获取类实 ...

  9. 【Spring】(1)-- 概述

    Spring框架 -- 概述 2019-07-07  22:40:42  by冲冲 1. Spring的概念 ① Spring框架的关键词:开源框架.轻量级框架.JavaEE/J2EE开发框架.企业级 ...

  10. ound interface org.elasticsearch.common.bytes.BytesReference, but class was expected

    es得版本和本地项目不一致.. 配置es版本,现在使用得是5.2得版本,可是 maven上看到 elasticsearch-rest-high-level-client 最低也得6版本.下载安装高版本 ...