Proguard摘要
Proguard流程
Proguard可对Java字节码文件进行压缩,优化,混淆及预校验。
步骤流程图-
shrink:检测和移除封装应用中未使用的类、字段和属性,包括 自带代码库中的未使用项。
-
optimize:可优化字节码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码。移除未使用的代码指令。
-
obfuscate:使用短且没有语义的名字重命名非入口类的类名,变量名,方法名。入口类的名字保持不变。
-
preverify:预校验代码是否符合Java1.6或更高的规范。preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
自定义混淆规则keep
-keep 指定类和类的成员变量是入口节点,保护它们不被移除混淆。对一个可执行jar包来说,需要保护main的入口类;对于一个类库来说需要保护它的所有public元素。
如果只声明保护一个类,并没有指定受保护的成员。proguard只会保护它的类名和它的无参构造函数。其它成员依旧会被压缩、优化、混淆。
如果声明保护一个方法,proguard会把它当作程序的入口点,方法名不会变,但它里面的代码依旧会被优化、混淆。
-printmapping [filename] 指定输出新旧元素名的对照表的文件。映射表会被输出到标准输出流或者是一个指定的文件。
-applymapping filename 指定重用一个已经写好了的map文件作为新旧元素名的映射。元素名已经存在在mapping文件中的元素,按照映射表重命名;没有存在到mapping文件的元素,重新赋一个新的名字。mapping文件可能引用到输入文件中的类和类库中的类。这里只允许设置一个mapping文件。仅在obfuscate阶段有效。
Android编译输出文件:
R.java
包含应用所使用的资源ID,不管是程序员指派或者sdk定义的。
mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。
这个文件在追踪异常的时候是有用的,在{android_sdk_home}/tools/proguard/lib目录下有一个retrace.jar文件。我们可以把混淆后的Stack Trace用这个工具处理一下,就会转变成容易阅读的类。所以,做app应用的同学每次发版本的时候都要把这个文件留下来,并标记清楚版本。这对线上版本的调试非常重要。
dump.txt
说明APK中所有类文件的内部结构。
-verbose 声明在处理过程中输出更多信息。添加这项配置之后,如果处理过程中出现异常,会输出整个StackTrace而不是一条简单的异常说明。
-dontpreverify #不做预校验。Proguard每个环节都可自定义选择是否启动。