一、简介
ProGuard 是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、字段名和方法名。经过以上操作的jar文件会变得更小,并很难进行逆向工程。
官网:http://proguard.sourceforge.net/(需翻墙访问)
也可以直接打开本地doc,路径为 AndroidSDK\tools\proguard\docs\index.html
二、使用方法
Step1. 添加proguard配置文件
1)在工程目录下,生成proguard-project.txt
(android项目默认自动生成。如果没有,使用android update命令,或自己创建一个空的txt文件。)
2)project.properties文件添加proguard配置
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
或
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
Step2.修改proguard配置文件
例如:
#指定引用的jar
-libraryjars<java.home>/lib/rt.jar
-libraryjarslibs/android-logging-log4j-1.0.2.jar
-libraryjarslibs/android-support-v4.jar
-libraryjarslibs/baidumapapi.jar
-libraryjarslibs/log4j-1.2.9.jar
-libraryjarslibs/protobuf-java-2.4.1.jar
#保护三方的jar包不被混淆
-keep classandroid.support.v4.** { *; }
-keep classcom.baidu.mapapi.** { *; }
-keep classcom.google.protobuf.** { *; }
-keep public class* extends com.google.protobuf.** { *; }
-keep classorg.apache.log4j.** { *; }
-keep classde.mindpipe.android.logging.log4j.** { *; }
#关闭javax等错误警告
-dontwarn javax.**
-dontwarnjava.awt.**
-dontwarncom.sun.jdmk.comm.**
#删除日志
-assumenosideeffectsclass org.apache.log4j.Logger {*;}
-assumenosideeffectsclass de.mindpipe.android.logging.log4j.LogConfigurator {*;}
细见:http://developer.android.com/tools/help/proguard.html
(对应的部分翻译:http://android.tgbus.com/Android/tutorial/201107/358743.shtml)
Step3.打包
使用ant打release包时,会使用ProGuard。
使用eclipse的Android Tools导出Application Package时,Proguard就会自动启用
三、使用要点
1. [proguard] Warning: XXX:can't find super 错误
如果你确定没使用到该类,可以使用-dontwarn关闭该警告。
例如:可能是因为你使用的某些库要用到java.awt包里面的类,众所周知,Android压根就没有java.awt这个包,它是J2SE里面的包,我们Android程序当然不需要这个包也能很好的运行了,此时,你可以用-dontwarn java.awt.**来屏蔽掉所有关于java.awt的警告
-dontwarn的使用,细见http://proguard.sourceforge.net/#manual/usage.html
2. 使用BaiduMap时,启动崩溃
手机上程序打开一闪后,自动关闭。手机日志提示”No JNI_OnLoad foundin/data/data/com.triphz/lib/libBMapApiEngine_v1_3_1.so”
原因:baidu map 三方库不支持再一次代码混淆。
在项目的proguard-project.txt 或 proguard.config文件中,添加以下语句,可解决。
-keep classcom.baidu.mapapi.** { *; }
3. Google ProtoBuf无法找到协议生成类的method问题
java.lang.RuntimeException:Generated message class "XXXX" missing method "XXXX".
通过添加以下语句解决。
-keep classcom.google.protobuf.** { *; }
-keep public class* extends com.google.protobuf.** { *; }
4. 无法删除日志函数问题
要删除日志函数,可添加
-assumenosideeffectsclass android.util.Log{ *; }
但可能出现添加后还是会打印日志的问题。
原因:在添加proguard配置文件时,使用
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard-android.txt中有-dontoptimize配置,而-assumenosideeffects属于优化操作,故未生效。
添加proguard配置文件时,应该使用
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt