Android开发者指南(9) —— ProGuard

前言html

  本章内容为开发者指南(Dev Guide)/Developing/Tools/ProGuard,本章内容为"混淆器",版本为Android3.0 r1,翻译来自:"Jim",欢迎与他交流:"litaojun@gmail.com",再次感谢"Jim" !期待你一块儿参与翻译Android的相关资料,联系我over140@gmail.com。

 

声明android

  欢迎转载,但请保留文章原始出处:)
 安全

    农民伯伯:http://over140.blog.51cto.com/app

    Android中文翻译组: http://goo.gl/6vJQl

 

原文ide

         http://developer.android.com/guide/developing/tools/proguard.html 工具

 

混淆器(ProGuard)优化

  在本文中(In this document)ui

    Enabling ProGuardthis

    Configuring ProGuardspa

    Decoding Obfuscated Stack Traces

      Debugging considerations for published applications

  参见

    ProGuard Manual »

    ProGuard ReTrace Manual »

混淆器经过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。所以,当你的应用程序对安全敏感(要求高),例如当你受权应用程序的时候,混淆器是一种重要的保护手段。

混淆器被集成在android 构建系统中,因此你没必要手动调用它。同时混淆器仅在发布模式下进行构建应用程序的时候才会运行起来,因此在调试模式下构建程序时,你没必要处理混淆代码。让混淆器运行起来是可选择的,可是推荐选上。

这个文档描述了怎样启用并配置混淆器,以及使用跟踪(retrace)工具对混淆的堆栈跟踪信息(stack traces)进行解码。

 

 

启用混淆器Enabling ProGuard

         当你新建了一个Android工程以后,一个proguard.cfg文件会在工程的根目录下自动建立。这个文件定义了混淆器是怎样优化和混淆你的代码的,因此懂得怎样根据你的须要来定制是很是重要的。缺省的配置文件仅覆盖到了一般状况,因此根据你的需求,极可能须要编辑它。接下来的内容是关于经过定制混淆器配置文件来对混淆器配置

         为了让启用混淆器做为Ant或者Eclipse构建过程当中一部分,能够在<project_root>/default.properties文件中,设置proguard.config属性。路径能够是绝对路径或者工程根目录的相对路径。

         若是你让proguard.cfg文件在缺省位置(工程的根目录),你能够像这样指定位置:

proguard.config=proguard.cfg

         一样,你能够把该文件放到任意的位置,并指定它的绝对路径。

proguard.config=/path/to/proguard.cfg

         当你在发布模式下,或者经过运行ant release,或者经过使用Eclipse中的Export Wizard构建你的应用程序的时候,构建系统都会自动地去检查proguard.config属性是否被设置了。若是被设置了,混淆器在把全部东西打包成.apk文件以前,自动地对应用程序字节码进行混淆处理。而在调试模式中构建则不会调用混淆器,由于那样调试会更加繁重。

         运行混淆器以后输出的文件有:

         dump.txt

                   描述.apk包中全部class文件的内部结构。

         mapping.txt

                   列出了源代码与混淆后的类,方法和属性名字之间的映射。这个文件对于在构建以后获得的bug报告是有用的,由于它把混淆的堆栈跟踪信息反翻译为源代码中的类,方法和成员名字。更多信息,查看解码混淆过的堆栈跟踪信息

         seeds.txt

                   列出那些未混淆的类和成员。

         usage.txt

                   列出从.apk中剥离的代码。

         这些文件放在如下目录中:

<project_root>/bin/proguard 当你使用Ant

<project_root>/proguard 当你使用Eclipse

注意: 每次在发布模式下构建时,这些文件都会被最新的文件覆盖。因此每次发布程序时候,为了反混淆来自构建时产生的bug报告,请保存这些文件的一个拷贝。对于为何要保存这些文件的重要性的更多信息,请查看程序发布调试注意事项。

 

 

混淆器配置(Configuring ProGuard)

         某些状况下,proguard.cfg文件的缺省配置能够知足需求了。可是,对于混淆器来讲,大多数状况作出正确的分析是困难的,而且它或许会删除在它看来是无用的,但对于程序来讲却确实须要的代码。一些例子以下:

一个仅引用于AndroidManifest.xml文件的类。

一个经过JNI调用的方法。

动态引用的属性和方法。

缺省的proguard.cfg文件试图覆盖普通的状况,可是你可能碰到相似ClassNotFoundException的异常,这个异常出如今当你的程序去访问一个被混淆器移除了的类的时候。

你能够在proguard.cfg文件中添加-keep这一行来修复这些错误。例如:

-keep public class <MyClass>

-Keep设置有不少可选项和注意地方,因此为了得到更多关于配置信息,强烈推荐你阅读混淆器用户手册。特别有用的有Keep选项综述举例部分。在混淆器手册问题解决方案部分,介绍了代码在混淆过程当中你可能碰到的其余常见问题。

 

 

解码混淆过的堆栈跟踪信息(Decoding Obfuscated Stack Traces)

         当混淆代码并输出了一个堆栈调试信息时,这些方法名字是混淆过的,虽然能够进行调试,可是调试变得困难。幸运的是,每当混淆器运行时候,它都会输出到文件<project_root>/bin/proguard/mapping.txt中,该文件包含了从原始类,方法和属性名字到混淆后名字的映射。

         Windows系统中retrace.bat脚本命令或者LinuxMac OS X系统中retrace.sh脚本命令能把混淆后的堆栈调试信息转换为能够理解的文件。它被放在<sdk_root>/tools/proguard/目录下。运行retrace工具的命令语法是:

retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]

例如:

retrace.bat -verbose mapping.txt obfuscated_trace.txt

若是你没有为<stracktrace_file>指定值,那么retrace工具从标准输入读取。

 

已发布应用程序的调试注意事项(Debugging considerations for published applications)

         保存好每个已发布给用户的程序的mapping.txt文件。经过保存发布构建版本的mapping.txt文件拷贝,确保当用户碰到bug,并把混淆后的堆栈调试跟踪信息提交给你时,你能够进行调试从而修复问题。程序的mapping.txt文件在每次发布构建时都会被覆盖,因此你必定要注意保存正确的版本。

         例如,假设你已经发布了一个应用程序并在继续在新的版本中开发添加新的功能。接着你立刻启动混淆器并建立一个新的发布版本。该操做把mapping.txt文件覆盖了。一个用户提交了来自当前发布版本的bug报告,该报告包含了堆栈调试信息。你不再能对用户的堆栈信息进行调试了,由于这个对应用户本机上版本的mapping.txt文件不存在了。其余覆盖mapping.txt文件的状况还有不少,因此对于每个可能须要调试的版本,你都要确保有一份拷贝。

         如何保存 mapping.txt 文件由你决定。例如,你能够根据版本和构建号来重命名它们,或者连同你的源代码进行版本控制。
相关文章
相关标签/搜索