Android Proguard介绍

来源:互联网 发布:mac机如何配置ant 编辑:程序博客网 时间:2024/04/29 04:50

ProGuard算是Android上的一大利器,主要进行java代码的裁剪压缩,优化,混淆以及预校验,在日常工作中有时会出现一些很奇怪的问题,明明我的代码里面有

这个类,属性或者接口,可是为啥到用的时候死活提示就没有了呢?这类奇葩问题在还没有接触ProGuard的亲面前可谓是相当无语,当你知道有ProGuard之后一切

都迎刃而解了,都是ProGuard在做优化裁剪的时候可能没有human beings这么智能,它并不知道你后期要用,在ProGuard的视线范围内如果你没有用到,它就会给

你干掉~~


那么知道ProGuard工作具体是做什么的之后,还想从官方文档中能够得到一些官方对其的定义和指南,你就可以到Marshamallow/external/proguard/docs目录中看看

官方的解释,如下的内容是我阅读该文档的时候了解到的,也可以说是翻译的,仅供参考!


ProGuard是一个免费的java类文件裁剪器,优化器,混淆器以及预校验器。它检测并且删除没有用到的类,字段,方法和属性。它优化字节码和删除无用的指令。

为了混淆原有的代码,它用毫无意义的简短名字为保留下来的类,字段和方法重命名,为执行代码在Java 6或者更高的Java版本以及Java微型版本的执行做预校验

处理。

ProGuard的一些用处:

1.创建更加紧凑的代码,为了更小的代码文件,更快的通过网络传输,更快的加载以及更少的占用内存。

2.使得程序和代码库更难被反编译。

3.列出死代码,也就是没有使用过的代码,列出来之后就可以从源码中将这部分没用的代码移除。

4.将现有的代码在Java 6或者更高版本上进行重定位和预校验,以便充分利用其快速的类加载优势。

ProGuard相较于其它代码混淆器的主要优势可能就是其紧凑的基于模板的配置了。一些直观的命令行选项或者一个简单配置文件就足矣。用户手册会解释所有的有效

选项并且会展示这种强大的配置风格的例子。

ProGuard工具很快,处理几M的程序和代码库仅需要几秒时间。

ProGuard是一个命令行工具带有可选图形用户界面(proguardgui.sh以及proguard.sh)。其同时可以是 Ant, Gradle, 以及JME Wireless Toolkit.的插件。


或许通过上面的描述,你还有很多关于ProGuad的疑问,例如官方文档中的如下问题,让我们来看看解释:

1.What is shrinking?

  什么是裁剪,压缩,缩减?Java源码(.java文件)通常会被编译成字节码(.class文件)。字节码比java源码更加紧凑,但是它有可能还包含一些没有用过的代码,尤其是当

其包含运行时类库时。类似ProGuard这类缩减程序可以分析字节码,并且删除没有用到的类,字段以及方法。被处理过的程序仍然保留和删减之前的相同的功能,对原

程序的功能没有任何影响,包括在发生exception时打印的调用栈信息也一样的。

2.What is obfuscation?

  什么是混淆?默认情况下,编译出的字节码仍然会包含一些调试信息:源码文件名,代码行号,字段名称,方法名称,参数名称,变量名称等等。这些信息直接为反编译

字节码以及逆向整个工程提供了有力的帮助。有的时候,这是不合我们的意。类似ProGuard这类的混淆器可以删除这些调试信息,并且用毫无意义的字符序列替换所有的名

称,使得逆向工程变得更加困难。当然这样删除调试信息,将名称进行替换更进一步对代码进行了压缩。混淆之后的代码同未做混淆之前的代码拥有同样的功能,但是除了

exception调用栈中的类名,方法名以及代码的行号。

3.What is preverification?

  什么是预校验?当加载class文件时,类加载器会对字节码执行一系列复杂的校验操作。这个检验分析用来确保将要加载进来的代码不会有意或者无意的打破虚拟机沙箱。

JME(Java Micro Edition)和Java 6采用的拆分校验。这就意味着JME预校验和Java 6的编译器会添加预校验的信息到class文件上(分别是StackMap and StackMapTable 

attributes),为了能够简化类加载器的实际校验步骤。Class文件会被加载的更款并且更有效的利用内存。ProGuard同样可以执行预校验步骤,例如在Java 6上允许老的class

文件的重定位。

4.What kind of optimizations does ProGuard support?

  ProGuard都支持什么类型的优化?除了在缩减步骤中删除没有用到的类,字段和方法,ProGuard也能对方法内和方法间在字节码级别进行优化。多亏有类似控制流分析,

数据流分析,局部评估,静态单次赋值,全局值计数,和活跃度分析这些技术,ProGuard能够做到一下这些优化:

  1) 评估常量表达式

  2) 移除不必要的字段读取以及方法调用

  3) 移除不必要的流程分支

  4) 移除不必要的比较以及实例类型测试操作

  5) 移除没有用到的代码块

  6) 合并相等的代码块

  7) 减少变量分配

  8) 移除只写字段和没有用到的方法参数

  9) 内联常量字段,方法参数以及返回值

  10) 内联那些短小的或者只调用一次的方法

  11) 简化尾递归调用

  12) 合并类和接口

  13) 尽可能的将方法转化为private,static和final的

  14) 尽可能将类转化为static和final的

  15) 替换仅有单实现的接口

  16) Perform over 200 peephole optimizations, like replacing ...*2 by ...<<1.

  17) 可选者性的移除日志代码

这些优化给你的代码所带来的积极影响需要依赖于你的代码实现以及所要运行的虚拟机。简单的虚拟机能够比带有JIT编译器的高级虚拟机获益更多。

但是最起码,你的字节码肯定会变小一些。

一些曾经显著的优化现在已经不支持了:

  1) 将常量表达式从循环中移出来

  2) 跟 escape analysis 有关的优化(现在DexGuard来进行) 

5.Can I use ProGuard to process my commercial application?

  我可以用ProGuard来处理我的商业应用吗?当然可以,虽然ProGuard在GPL协议下发布,但是这并不应用用它处理过的程序。你的代码仍然是你自

己的,其版权并不会改变。
6.Does ProGuard work with Java 2, 5, ..., 8?

   ProGurad对Java2,5...8所有版本都适用吗?是的,ProGuard支持所有JDK版本包括从1.1开始到8.0。Java 2在class文件格式上有一些小的不同。Java

5给通用场景以及注解添加了一些属性。Java 6采用了可选预校验属性。Java 7使预校验成为必须的步骤并且对动态语言进行支持。Java 8添加了更多的

属性以及默认方法。ProGuard能够正确的处理基于任何Java版本所开发的程序。
7.Does ProGuard work with Java Micro Edition?

   ProGurad能够工作于JME版本么?可以的,ProGuard自己运行与Java标准版本,但是你可以根据你的程序所运行的版本随意指定其运行的环境,包括

JME。ProGuard也会执行必须的预校验,比传统的第三方预校验生成更加紧凑的处理结果。ProGuard还为JME无线工具包配备了一个混淆插件。
8.Does ProGuard work for Google Android code?

  ProGuard对Google Android Code有效吗?有的,Google的dx编译器会将普通的jar文件转换成能够在Android设备上运行的文件。通过预处理普通的jar文

件,ProGuard可以显著的减小文件的大小并且提升代码的运行性能。其作为Android SDK的一部分进行发布。DexGuard和ProGuard是一对Android上的闭

源兄弟,为Android提供额外的性能优化和代码保护。
9.Does ProGuard work for Blackberry code?

  ProGuard对Blackberry代码有效吗?这是应该的,RIM版权所有的 rapc 编译器将JME jar文件转化成能够在BlackBerry设备运行的代码文件。该编译器已经

执行了很多优化动作,但是通过ProGuard进行预处理可以减小最终代码的大小。然而,rapc 编译器似乎有一些bug。有时候其混淆的代码在JME或者VM上会

无效或者不被接受的。因此可能你的旅途可以是多样的,即你可以选择ProGuard伴你左右^_^

10.Does ProGuard have support for Ant?

   ProGurad支持Ant吗?是的,ProGuard提供了一个Ant任务,因此其可以无缝的合成到Ant编译处理中。你可以仍然用仅ProGurad能读懂的配置格式。另外

如果你比较喜欢XML,你也可以用XML来进行相关配置。
11.Does ProGuard have support for Gradle?

  ProGuard支持Gradle吗?是的,ProGuard同样提供了一个Gradle任务,因此它可以合成到你的Gradle编译处理中。你可以用ProGuard自己的配置文件格式进行

配置也可以嵌入到Groovy配置中。
12.Does ProGuard have support for Maven?

  ProGuard支持Maven吗?有Maven插件可以支持,ProGuard的jar文件通过通过Maven中心仓库进行发布。有一些Maven的第三方插件支持ProGuard,例如 

android-maven-plugin 和 IDFC Maven ProGuard Plug-in。DexGuard同样有一些Maven的插件。

13.Does ProGuard come with a GUI?

   ProGurad有GUI界面版本码?有的,首先,ProGuard是一个完全可以在命令行使用的工具,这样它可以非常容易的合成到任何自动编译流程中。对于临时用户来说,

提供了图形化界面来简化创建,加载,编辑,执行和保存ProGuad配置。
14.Does ProGuard handle Class.forName calls?

  ProGuard会处理Class.forName调用吗?是的,ProGuard会自动处理类似Class.forName和SomeClass.class的构造方法。这个方法涉及的类会在缩减阶段被保留,

同时这些字符串参数会在混淆阶段被正确的替换。

  根据可变字符串参数,一般情况下是不太可能能够确定其可能的值的。例如它们可能会从某个配置文件中去读取。ProGuard会将这些构造用“(SomeClass)Class.

forName(variable).newInstance()”来进行记录。这些会说明类或者接口SomeClass以及它的实现是需要被保留的。开发人员可以相应的调整自己的配置。

15.Does ProGuard handle resource files?

  ProGuard会处理资源文件吗?是的,ProGuard会拷贝所有的资源文件,在混淆阶段选择性的修改他们的名字和内容。
16.Does ProGuard encrypt string constants?

  ProGuard会对字符串常量进行加密吗?不会,程序中的加密字符串通过定义是完全可逆的,所以其仅提高了混淆的难度。它增加了代码的足迹。然而,大多数需求,

ProGuard在Android上的闭源兄弟,DexGuard提供了字符串加密,同时还有更多的保护技术来对抗静态和动态的分析。
17.Does ProGuard perform control flow obfuscation?

   ProGuard会执行控制流混淆吗?不是很明确,通过在字节码中添加流程分支来混淆控制流,用来尝试欺骗反编译者。ProGuard并不会这么做,为了不影响程序的执行

性能以及代码的大小。然而即使ProGuard没有做这方面的操作,但是在优化阶段以及基本上已经重构源代码到了能够让反编译者困惑的程度了。
18.Does ProGuard support incremental obfuscation?

  ProGurad支持增量混淆吗?是的,这个功能会允许你在一个新的混淆阶段指定一个之前的模糊映射文件,以便可以为已经混淆的代码生成附加内容或者补丁。其实也

就是说你之前混淆过一段代码,但是你现在不想整个混淆了,你在源代码里新加了一些东西,你现在要对新加的内容进行混淆,那么你就可以用增量混淆这个功能了。
19.Can ProGuard obfuscate using reserved keywords?

  ProGuard混淆能使用预留关键字吗?可以,你可以定义你自己的混淆字典,例如一个保留关键字的列表,用来表示外国语言字符,随机源码文件,亦或是莎士比亚的名句。

需要注意的是这样虽然很有创意,但是几乎并不会提高混淆的程度。有点专业程度的反编译者都能自动的替换掉预留关键字,并且这个效果会非常容易的被再次用简短名字

混淆给冲掉。
20.Can ProGuard reconstruct obfuscated stack traces?

  ProGuard能够重新创建混淆过的调用栈吗?可以,ProGuard有伴随的工具叫做ReTrace,它可以为被混淆的应用生成的调用栈“去混淆”。这个重建工作需要依赖ProGuard

工具所写的映射文件。如果行号被混淆没有了,会有一个可供选择的方法名列表被呈现给每一个拥有反向映射的被混淆的方法。

========================================================================================

好了,基本上上面的内容你都了解了应该对"ProGuard是个什么洋的工具,工具的工作阶段都有哪些,每个阶段都做些什么,适用场景都有哪些"有了很清楚的了解了,

其实接下来你就应该选择一个平台来学习学习它具体要怎么用了,这篇文整的篇幅已经太长了,ProGurad的使用手册会在后面的文章进行介绍~~

0 0
原创粉丝点击