官方文档:在这儿


使用ProGuard的命令:

java -jar proguard.jar options ...

在ProGuard发布的文件夹中,lib目录下可以找到ProGuard的jar文件

或者,可以在bin目录下找到ProGuard的命令行文件,也可以这样使用:

java -jar proguard.jar @myconfig.pro

也可以将命令行选项和配置文件选项结合使用,例如:

java -jar proguard.jar @myconfig.pro -verbose

在配置文件中可以添加行注释,以#字符开头,表示该行为注释

单词和定界符中间多余的空格会被忽略。有回车或者特殊字符的文件名称最好加上单引号或者双引号

在配置文件中设置选项时,最佳的格式是强制性的按照功能分组,一行一行的描述。这样有利于扩展其他的功能

配置选项的顺序通常是不相关的。为了更快的完成配置文件,你可以用他们的最开头的不同的首字符来简写他们


下面是各个参数的配置细节:

Input/Output options:

filename:是-include filename的简写:对于给定的文件名称,逐级递归读取配置选项

-basedirectory directoryname:在这个配置文件或者这些配置的参数中,为后来的相关的文件名称指定基本目录

-injars class path:为正在执行的应用指定输入的文件(jars,aars,wars,ears,zips,apks,or directories)他们会被执行,而且会被写入输入文件。默认情况下,任何没有类的文件都会被不加任何修改的赋值到输出文件。当你从目录中直接读取输入文件的时候,尤其要记得关注IDE产生的任何缓存文件。正如在filter节中解释过的,类路径中的入口点可能会被过滤掉。为了代码有更好的可读性,类的入口点可以用-injars选项来特别指定

-outjars class path:为正在执行的应用指定输出的文件(jars,aars,wars,ears,zips,apks,or directories)有-injars选项的输入会被写入到jar文件中。我们可以收集到与输入jar文件相关的内容,并且以组的方式整合到输出的jar中。另外,输出的入口点也可以被过滤。当有匹配的过滤条件和输出jar文件时,每个正在执行的类文件或者资源文件都会被写入第一个输出的入口点

-libraryjars classpath:指定类文件(jars,aars,wars,ears,zips,apks,or directories)这些文件将不会输出到jars文件。特定的类jars文件至少包含哪些应用类文件扩展后的类文件。即使只被调用的类文件有利于优化阶段的结果,它们不必在output中存在。为了更好的可读性,最好加上-libraryjars可选项。需要注意的是,当程序查找library文件时,需要指定运行ProGuard的根目录和类目录的环境设置。这意味着你的代码将会无误的指定运行jars文件。即使偶尔会发生某些错误,我们可以在不同的运行环境下来运行应用程序。

-skipnonpubliclibraryclasses:在读取library jars文件的时候,跳过非public的类,来加速程序运行,并且减少ProGuard的使用内存。默认情况下,ProGuard读取非public的类和public的类的方法是一样的。然而,当非public的类与输入jars文件中实际的程序不匹配时,大多时候是不相关的。因此,我们可以忽略这些非public函数来用来对ProGuard进行加速,而且不会影响到output文件。不幸的是,有些libraries(例如最新的JSE运行库),包含有一些非public的library类是从public的library类扩展而来。这时候你不能使用这个选项。如果设置了这个选项导致了错误,ProGuard会输出警告信息

-dontskipnonpubliclibraryclasses:对于特定的非public library类不会忽略。不在4.5版本中是默认配置

-dontskipnonpbliclibraryclassmembers:对于特定的包中可见的库类成员和方法不会忽略。在默认设置中,当程序分析类函数时,因为通常情况下它们不会被执行,所以,ProGuard会跳过这些类成员。然而,程序类和类库会驻留在同一个包名下,然后它们都可见。这种情况下,读取类成员是有意义的,需要保证程序代码的逻辑和顺序上的完整性。

-keepdirectories:默认情况下,目录的入口点都会被移除。这样做会减小jar文件的大小,但是可能的副作用是当程序代码尝试找如同“mypackage.MyClass.class.getResource”而找不到的话会中止程序执行。这时候就需要这个选项来保留在包中与目录相关的内容。如果这个选项不加过滤,那么所有的目录都会保留下来。有过滤选项的话,只有那么匹配的目录得以保留。

-target version:在程序的类文件中指定版本号。默认配置下,类文件的版本是不变的。

-forceprocessing:根据时间戳的比较,来确定输入、输出文件和配置文件与目录有无改变,对于变化的输入强制对输出进行更新。


-keep:强制保留代码中的类和类成员、方法等。

-keepclassmembers:强制保留类成员。

-keepnames class specification(Short for -keep allowshrinking class specification):

类和类成员如果在压缩阶段没有被移除的话,那么保留他们的名字。

-keepclassmembernames:


Shrinking options:压缩选项

-dontshrink:默认情况下,会对程序进行Shrink压缩的;除非那么有特定的-keep选项要求保留的类和类成员,其他的都会直接或者间接的删除。每一次优化阶段之后,都会执行一个压缩阶段。

-printusage:可以输出在应用中所有的使用过的或者未使用的代码。

-whyareyoukeeping:在压缩阶段,输出保留类和类成员的原因。如果你对于输出之中某些元素的存在表示疑惑不解,那么这个选项是一个好选择。通常来说,这是有很多不同的原因的。这个可选项会输出每个特定类和类成员作为种子或者入口点的最短路径。


Optimization options:优化选项

-donttooptimize:不做优化处理。默认情况下,ProGuard会对程序进行字节码级别的优化。

-optimizations:在更精准的级别上,强制对程序进行可能的优化。只有可以被执行到的代码才会被优化。

-optimizationpasses n

默认情况下,n=1。n越大,理论上的优化效果越好。当找不到可以优化的地方时,优化过程结束

-assumenosideeffects class specification:

假设程序没有错误(当有错误的时候,不返回错误信息,继续执行程序)在优化阶段,ProGuard会判断方法的返回值是否被用到,用不到的会被移除掉。还可以使用remove logging code来删除日志文件中的信息。使用这个选项是有风险的,有时候会轻易地损坏执行文件。

-allowaccessmodification:

在代码的执行过程之中,类和类成员的准入点可能会变多,被扩展。这个参数可以提高优化阶段的结果


Obfuscation options:

-dontoobfuscate:默认情况下,会执行混淆函数。除了那些有-keep选项的类和类成员,其他的名称都会以更短的随机字符串的名字所替代。便于调试和跟踪的内容,例如源代码名称,变量名,行号等这些属性信息都会被删除

-printmapping:

输出重命名的内容的前后对应关系。print内容会到标准输出(屏幕)或是指定的文件下。

-applymapping: