先简单介绍下 ProGuard
ProGuard 是一款用来混淆 java 源码的工具。由于 java 的一次编写,到处运行的特性,生成的字节码很容易被反编译,很容易将自己的代码暴露,混淆器就是用来解决这个问题的。
将 java 源码的类拆分为几个没有实际意义的名字的类,并将类的属性和方法也重命名为无实际意义的属性名和方法。这个就是混淆器的基本原理。
我们今天要说的 ProGuard 就是这样的一款混淆器。
网上关于 ProGuard 详细的介绍与很多的,我这里就不一一列出了,具体的话可以参考
http://my.oschina.net/u/1175007/blog/475797
http://blog.youkuaiyun.com/banketree/article/details/41928175
这些都总结的比较好了。
这里我说说我再我自己的项目中得使用情况吧。
- 首先是使用,由于我目前用的是 Android Studio 1.3 的版本,就拿1.3的版本来说吧。
我们在module的build.gradle文件可以看到以下语句
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
minifyEnabled true
这一句表示打开 Proguard 混淆,导出签名的apk的时候源码会被 Proguard 混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
这一句则定义了我们采用什么规则来混淆代码。查看 module 目录你会发现有个 proguard-rules.pro 文件,
这个就是 Android Studio 默认的混淆规则文件,你需要混淆的规则再里面配置,
至于 proguard-android.txt,相信用 eclipse 开发的会比较熟悉了,在 eclipse 项目目录下面会有这个文件,这个文件同 proguard-rules.pro 一样是混淆规则的配置文件
接着说说我再混淆过程中遇到的困难吧。
1 我再项目里面用到了第三方库,一开始混淆的时候报了很多 warnning 的错误,查阅发现是没有告诉 ProGuard 忽略 warnning , 在 proguard-rules.pro 里添加
-dontwarn jar_package_name.**
这个语句可以告诉ProGuard忽略第三方没引用的类
- 2 由于第三方用到了注解,本以为打开注解就好了,结果发现还是不行,后来通过查看混淆后的源码发现,某些属性被删除了,原来那些属性由于一些原因被定义了,但是没有直接使用,但是程序偏偏不能少。于是我通过保留类成员的方法规避了这个错误,具体的方法是
-keep class your_class_with_package_name {
public <fields>;
}
这样就保留了访问权限为为 public 的属性。
今天就先写到这里吧