ProGuard是个强大的工具。
ProGuard官方文档:http://proguard.sourceforge.net/
ProGuard基本介绍
- ProGuard通过删除无用代码,将代码中类名、方法名、属性名用晦涩难懂的名称重命名从而达到代码混淆、压缩和优化的功能。
- 压缩和优化使得编译后apk包更小。
- 混淆可以保证代码在被反编译后很难读懂,防止逆向工程。
ProGuard的生成文件介绍
- mapping.txt —> 表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。每次发布都要保留它方便该版本出现问题时调出日志进行排查,它可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。
- dump.txt —> 描述apk内所有class文件的内部结构
- seeds.txt —> 列出了没有被混淆的类和成员
- usage.txt —> 列出了源代码中被删除在apk中不存在的代码
ProGuard不混淆
- 反射用到的类
- Android中Manifest中配置的类(Activity、Service等的子类及Framework类默认不进行混淆)
- Jni中调用的类
- 用到的第三方的jar包
- 表示保留本地的bean文件下的实体类
- 特别处理js与本地原生组件之间的调用过程
- 自定义不混淆的类
ProGuard语法
|
|
保留选项
|
|
压缩
|
|
混淆
|
|
ProGuard语法常见使用
不混淆某类的构造方法,需指定构造函数的参数类型
-keepclassmembers class com.android.treesouth.Test {
public (int);
}
不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把*换成类名或interface
-keep class com.android.treesouth. { ; }
不混淆指某个方法,*可换成指定的方法或类名,遇到非基本数据类型要写完整包路径
-keepclassmembers class com.android.treesouth.Test {
public boolean get(java.lang.String, android.view.View);
}
不混淆某个类的子类,某个接口的实现
-keep public class extends com.ticktick.example.Test
-keep class implementscom.ticktick.example.TestInterface {
public static final com.ticktick.example.TestInterface$Creator *;
}
ProGuard实例
|
|
ProGuard解决Bug
常见问题及解决:http://proguard.sourceforge.net/index.html#manual/troubleshooting.html
在此输入正文