因为项目的要求,需要对Eclipse中生成的 Jar包(Java 源码 Export输出)进行混淆,Google官方提供的 Proguard工具 因为其免费性、可视性、可选择性,成为了我的选择。
(只是个人总结,不想那么多废话——码字码的手累)
使用 Proguard工具 过程中,最重要的又3个步骤,分别是压缩、混淆、优化。个人认为,我的主要目的是混淆代码,自然混淆这一步是我最为关心的。
一、关键步骤解析
压缩:
Java 源代码(.java文件)编译后形成字节码文件(.class文件),字节码比 Java源文件更简洁,但是它仍然包含大量的无用代码。
ProGuard工具 能分析字节码,并删除无用的类、字段和方法,程序只保留功能上的等价,包括异常堆栈描述所需要的信息,从而减小生成的自己码文件的体积。
混淆:
编译后的字节码包含了大量的调试信息:源文件名,行号,字段名,方法名,参数名,变量名等等。这些信息使得它很容易被反编译和通过逆向工程获得完整的程序。
ProGuard混淆器能删除这些调试信息,并用无意义的字符序列来替换所有名字,使得它很难进行逆向工程,它进一步免费的精简代码。除了异常堆栈信息所需要的类名,方法名和行号外,程序只会保留功能上的等价。
优化:
压缩阶段删除了无用类,字段和方法外,ProGuard在字节码级也提供了性能优化,内部方法有:
不必要的字段存取
删除不必要的方法调用
删除不必要的分支
删除不必要的比较和instanceof验证
删除未使用的代码
只写字段
删除未使用的方法参数
像push/pop简化一样的各种各样的peephole优化
在可能的情况下为类添加static和final修饰符
在可能的情况下为方法添加private, static和final修饰符
在可能的情况下使get/set方法成为内联的
当接口只有一个实现类的时候,就取代它
选择性的删除日志代码
实际的优化效果是依赖于代码和执行代码的虚拟机。简单的虚拟机比有复杂JIT编译器的高级虚拟机更有效。无论如何,你的字节码会变得更小。
二、Proguard 混淆步骤
(声明:该步骤主体转载自 http://www.cnblogs.com/rayray/p/3421028.html ,
在自己理解的基础上做了相应的修改)
1、拷贝Android项目中“proguard.cfg”文件到你指定的位置,并改名为“proguard.pro”。
(新版本的 ADT 中已经没有了 “proguard.cfg”文件,只需要将其中的内容拷贝到proguard-project.txt 中即可)
2、在 Android SDK 的安装路径下双击 Proguard-gui,以启动 Proguard混淆器。
(如: Android/adt-bundle-mac/sdk/tools/proguard/bin 目录下 )
3、加载“1”中的"proguard.pro"配置文件
4、配置需要混淆的jar包:
“Add Input”:添加要被混淆的 Jar包;
“Add Output”:输出 混淆后 Jar包 的包名;
下半部分是 要混淆的Jar包 所依赖的包——最好是将 Jar包 的 Java 源码中的所依赖的 包都添加进去;
5、压缩:
“Keep” 表示压缩时候需要保留的内容——原作者保留了“Library”、"Enumeration" 2部分——这个看自己的需求,选择哪些部分不压缩。
6、混淆:
这一步是“混淆”,是本次混淆行为的最核心内容,具体选择混淆什么、不混淆什么,要仔细的在这个界面上选择。
注意红框的选项,勾选后混淆出来的jar包有时导致在主项目中使用时报错:“conversion to dalvik format failedwith error 1”。
7、优化:
具体怎么选择,自己根据项目需要、选择相应的界面。
8、Informaition——混淆的一些软、硬件信息
红框1,正确选择target下拉框对应的jdk版本,否则可能出现异常错误。
红框2,编译时如果遇到未找到定义的警告,那么在这里添加需要忽略的内容。
9、
点击“View configuration”,出现自己对 Proguard混淆工具的 配置信息(此时可以保存);
保存后的文件为.pro后缀,可以使用编辑软件进行对其作修改(必须按照proguard规范进行),再按照上述步骤进行重新加载。
点击“Process”开始混淆吧!(遇到警告或错误停止混淆,请使用“-dontwarn”进行屏蔽处理)