Android ProGuard的使用

一、简介

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值