ProGuard 工具通过移除不用的代码,用语义上混淆的名字来重命名类、字段和方法等手段来压缩、优化和混淆你的代码。结果是更小的.apk文件,并且更难于被反编译。由于ProGuard能够让你的程序难于被反编译,因此,当你的程序使用了一些机密的信息的时,使用它就显得更加重要。

ProGuard 已经集成到Android的编译环境中,因此,用不着手动来触发它。ProGuard只在release模式下编译应用程序才会运行,所以,在debug模式下编译,你就不必处理混淆的代码。是否运行ProGuard是完全可选的,但强烈推荐使用。

启用ProGuard
当你创建Android工程时,proguard.cfg文件会在工程的根目录自动创建。这个文件定义了ProGuard如何优化和混淆代码,因此,理解如何定制它是非常重要的。默认的配置文件只是覆盖了一些通用的情况,所以,基本上你需要编辑它来满足你的需求。参考后面的“配置ProGuard”章节来了解如何定制ProGuard的相关信息。

启用ProGuard让它跟随Ant或Eclipse编译时一起运行,你需要在<project_root>/default.properties文件中设置proguard.config属性。路径可以是绝对路径或是工程根目录的相对路径。 如果你把proguard.cfg文件放在默认的位置(工程的根目录),你可以像这样来指定它的位置: proguard.config=proguard.cfg
你还可以把该文件移到任何你想放的位置,然后指定绝对路径:proguard.config=/path/to/proguard.cfg
当你在release模式下编译你的程序,不管是用ant release还是用Eclipse的导出向导,编译系统都会自动检查proguard.config属性是否设置。如果设置了,ProGuard就会在打包成.apk文件之前,自动处理应用程序的字节码。Debug模式编译,不会触发ProGuard,因为它会使得调试更加复杂累赘。

ProGuard运行结束后,输出以下文件: dump.txt
描述.apk文件中所有类文件间的内部结构

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

seeds.txt
列出了未被混淆的类和成员
usage.txt
列出了从.apk中删除的代码

这些文件放在以下文件夹中:
Ant:<project_root>/bin/proguard
Eclipse: <project_root>/proguard

注意:每当你在release模式下编译时,这些文件都会被覆盖重写,当然,是被ProGuard工具生成的最新的文件所覆盖。每次你发布你的程序时,都应该保存一份,为了将来能够解码bug报告。

配置 ProGuard
一些情况下,proguard.cfg文件中的默认配置就足够了。然而,有些情况ProGuard也很难正确分析,它可能会删除它认为不用的代码,但实际上正是你的程序所需要的。例如:
只在AndroidManifest.xml文件中引用的类
由JNI调用的方法
动态引用的字段和方法

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

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

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


本人见解:对于android上的混淆器而言,-keep选项基本区别在于细分的程度,你可以在很大的程度上用keep这个选项,可能这样做你的混淆内容将会不是最多的。除此之外特别注意的是,对于你使用的类,如果这个类被反射过,或者这个类中的方法被反射过,那么一定要用keep选项,否则会运行时会报错


更多相关文章

  1. Android(安卓)Root分析及防范
  2. Android(安卓)studio中TextView改变字体的两种方式(如仿宋、隶书)
  3. Android(Java)加载SO文件
  4. Android之Android(安卓)studio如何解决Multiple dex files defin
  5. Android(安卓)Popup特效
  6. react native 错误:Make sure you have an Android(安卓)emulator
  7. 转:Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
  8. 在32位的Ubuntu 11.04中为Android(安卓)NDK r6编译FFmpeg0.8.1版
  9. 读写Android中assets目录下的文件的方法详解

随机推荐

  1. Android官方技术文档翻译——Ant 任务
  2. Android(安卓)自启动 后台运行 发送短信
  3. 13-7-6 android底层与zigbee通信
  4. Android(安卓)NFC技术(三)——初次开发Andr
  5. Android视图绘制流程完全解析(一)
  6. Android入门及环境搭建
  7. Android研究院之游戏开发帧动画(三)
  8. Android作业:一个3D相册源码
  9. 吃完果冻豆再来点啥?下一版Android命名酸
  10. Android内存管理机制