注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

创新改变世界

you changed the world

 
 
 

日志

 
 

Android ProGuard的使用  

2013-10-05 17:02:32|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、简介

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配置

  1. proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt  

  1. proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt  

 

Step2.修改proguard配置文件

例如:

  1. #指定引用的jar  
  2. -libraryjars<java.home>/lib/rt.jar  
  3. -libraryjarslibs/android-logging-log4j-1.0.2.jar  
  4. -libraryjarslibs/android-support-v4.jar  
  5. -libraryjarslibs/baidumapapi.jar  
  6. -libraryjarslibs/log4j-1.2.9.jar  
  7. -libraryjarslibs/protobuf-java-2.4.1.jar  
  8. #保护三方的jar包不被混淆  
  9. -keep classandroid.support.v4.** { *; }  
  10. -keep classcom.baidu.mapapi.** { *; }  
  11. -keep classcom.google.protobuf.** { *; }  
  12. -keep public class* extends com.google.protobuf.** { *; }  
  13. -keep classorg.apache.log4j.** { *; }  
  14. -keep classde.mindpipe.android.logging.log4j.** { *; }  
  15. #关闭javax等错误警告  
  16. -dontwarn javax.**  
  17. -dontwarnjava.awt.**  
  18. -dontwarncom.sun.jdmk.comm.**  
  19. #删除日志  
  20. -assumenosideeffectsclass org.apache.log4j.Logger {*;}  
  21. -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文件中,添加以下语句,可解决。

  1. -keep classcom.baidu.mapapi.** { *; }  

3.       Google ProtoBuf无法找到协议生成类的method问题

java.lang.RuntimeException:Generated message class "XXXX" missing method "XXXX".

通过添加以下语句解决。

  1. -keep classcom.google.protobuf.** { *; }  
  2. -keep public class* extends com.google.protobuf.** { *; }  

4.       无法删除日志函数问题

要删除日志函数,可添加

-assumenosideeffectsclass android.util.Log{ *; }

但可能出现添加后还是会打印日志的问题。

原因:在添加proguard配置文件时,使用

  1. proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt  

proguard-android.txt中有-dontoptimize配置,而-assumenosideeffects属于优化操作,故未生效。

添加proguard配置文件时,应该使用

  1. proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt  
  评论这张
 
阅读(394)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017