【友盟+】开发者社区

ProGuard混淆器生成文件的作用

香布拉啦 发表于 2014-11-17 14:10:45 | |阅读模式

香布拉啦
香布拉啦 发表于 2014-11-17 14:10:45 | 显示全部楼层 |阅读模式

ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。这样做的结果是更小的jar、apk……,并且更难被反编译。

Android的编译环境中已默认集成了Proguard,但只有在release模式下编译才会运行。此状态下,它会在用到ant release或是Eclipse的导出向导时,自动检查proguard.config属性是否已设置,如果设置了,ProGuard就会在打成包之前,自动处理程序的字节码。Debug模式下,之所以不触发,是因为混淆后的代码会使得调试变得更加累赘。


准备工作:

1、切换到release模式

Eclipse默认的Java Compile环境是Debug模式,切换到release模式只需右击工程,选择属性,在“Properties for ProjectName”窗口中将“Java Compile”——>”Classfile Generation”中的debug选项去除,点击【Apply】,点【OK】关闭窗口即可生效。

2、  准备keystore

Android规定所有程序必须签名,否则就不会安装。所以在混淆打包过程中会有签名这一选项,此过程需要用到keystore。如果keystore已存在,或是在过程中ADT已经自动用keytool生成了,就不需要重新再生成了;如果没有的话,可用jdk/bin目录下的keytool自己生成一个,示例如下:



Cmd代码  
  • D:\Program Files\Java\jdk1.6.0_17\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore  



其中参数-validity为证书有效天数,这里我们写的大些10000天。还有在输入密码时没有回显(尽管输就是啦) 并且 退格,tab等都属于密码内容,这个密码在给.apk文件签名的时候需要.



设置proguard.config属性:

         在创建Android工程时,proguard.cfg文件会在根目录自动被创建,该文件定义了ProGuard如何优化和混淆代码。其默认的配置只覆盖了一些通用的情况,但也满足了基本的需求;如需深入定制,还需参考相关的配置文档。

         默认情况下,proguard.config属性是未被设置的,如需启用,则在工程根目录下的default.properties文件中设置,其路径可以是相对路径或是绝对路径。

书写形式如可以是这样的:


Default.properties代码  
  • proguard.config=proguard.cfg  




也可以将proguard.cfg文件放到别处,然后指定路径:


Default.properties代码  
  • proguard.config=/path/to/proguard.cfg  





混淆打包:

在release模式下,有如下几种导出方式:

1、右击工程->android tools->export signed android package生成签名的包,

2、右击工程——>Export选择导出类型

3、ant release


混淆成功后,除生成了指定类型的混淆包外,还会在工程的根目录下或是根目录下得bin文件夹中生成proguard文件夹,里面包含dump.txt、mapping.txt、seeds.txt和usage.txt四个文件。

dump.txt

描述.apk文件中所有类文件间的内部结构


mapping.txt

列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。


seeds.txt

列出了未被混淆的类和成员


usage.txt

列出了从.apk中删除的代码



配置 ProGuard:

一些情况下,proguard.cfg文件中的默认配置就足够了。然而,有些情况ProGuard也很难正确分析,它可能会删除它认为不用的代码,但实际上正是你的程序所需要的。

例如:

只在AndroidManifest.xml文件中引用的类

由JNI调用的方法

动态引用的字段和方法


默认的proguard.cfg文件努力去覆盖通用的情况,但有可能你会遇到如ClassNotFoundException这样的异常,而这正好是由于ProGuard移除了整个类造成的。

你可以修正由于ProGuard移除代码造成的错误,只需要在proguard.cfg文件中添加一行“-keep”。例如:



Java代码  
  • -keep public class <MyClass>  



使用-keep选项时,有一些选项和建议,因此,强烈建议你阅读ProGuard手册来了解更多关于定制配置文件的信息。“Overview of Keep options”和“Examples section”将非常有用



参考:

http://android.tgbus.com/Android/tutorial/201107/358743.shtml

http://hi.baidu.com/benbearlove/blog/item/aaa36de671f3153db93820e2.html





上一篇:事件批量导入的事件id不支持中文吗?
下一篇:你真的了解活跃用户吗?

友盟统计常见问题索引贴【点我】
请大家善用搜索,一个帖子只解答一个问题,多个问题请再开新帖咨询,在论坛上解决一个问题请同时帮助别人解答两个力所能及的问题,谢谢大家!
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

发表主题

精彩推荐

【友盟+】U-ADplus重新定义全媒体广告监测
随着移动互联网和物联网的发展,消费者生活场景在线上、线下多屏设备之间不停切换,媒体的触点也随之变得更
应用信息中的小米、华为通道信息是什么?
这是要填小米和华为开发者平台上申请到的信息吗,作用是什么?
通过友盟后台根据别名推送无法收到
通过友盟后台推送显示成功,但是设备收不到。通过api推送也是如此。 msgId:uu88124150287009116010

关注我们

新浪微博
微信

欢迎关注友盟官方微博微信!

在线客服
返回顶部 返回列表