在新版本的ADT建立项目时,混码的文件再也不是proguard.cfg,而是project.properties和proguard-project.txt。html
若是须要对项目进行全局混码,只须要进行一步操做:java
将project.properties的中android
“# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就能够了。windows
如 果有一些代码不能被混淆,好比须要加入了so文件,须要调用里面的方法,那么调用JNI访问so文件的方法就不能被混码。在导出的时候,可能不会报错。但 是在手机上运行的时候,须要调用so文件的时候,就会报某某方法没法找到。这个时候就须要用到proguard-project.txt。安全
在老版本中,建立项目的时候,会给出proguard.cfg,可是在的新版中建立项目则不会有任何提示。这个时候须要只要将proguard.cfg的内容加入到proguard-project.txt中,再根据本身的须要进行编辑便可。app
==================proguard.cfg防反编译方法==================================ide
To enable ProGuard so that it runs as part of an Ant or Eclipse build, set the proguard.config
property in the<project_root>/project.properties
file. The path can be an absolute path or a path relative to the project's root.工具
If you left the proguard.cfg
file in its default location (the project's root directory), you can specify its location like this:优化
proguard.config=proguard.cfg
You can also move the the file to anywhere you want, and specify the absolute path to it:ui
proguard.config=/path/to/proguard.cfg
When you build your application in release mode, either by running ant release
or by using the Export Wizard in Eclipse, the build system automatically checks to see if the proguard.config
property is set. If it is, ProGuard automatically processes the application's bytecode before packaging everything into an .apk
file. Building in debug mode does not invoke ProGuard, because it makes debugging more cumbersome.
===========【转】混淆文件proguard.cfg详解======================================
-injars androidtest.jar【jar包所在地址】
-outjars out【输出地址】
-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】
-keep public class * extends android.app.Activity 【不进行混淆保持原样】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>; 【全部方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}
-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,若是全部指定的类成员出席(在压缩步骤以后)】
native <methods>;
}
-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是全部指定的类和类成员是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,若是此类受到保护他们会保护的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】
public static final android.os.Parcelable$Creator *;
}
=====================================常见异常===================================
参考:http://blog.csdn.net/vrix/article/details/7100841
加入第三方jar包以后常出现的几个异常:
proguard returned with error code 1.See console
状况1:
Proguard returned with error code 1. See console
Error: C:/Documents (系统找不到指定文件)
后来发现是由于将整个工程放到了桌面上,而桌面的目录是C:/Documents and Settings/Administrator/桌面,在这里面有空格,而proguard进行发编译的时候是不容许有空格的
若是换了正确路径还很差用的话,直接删除proguard就行了
注意:SDK和程序路径最好不要有空格符
状况2:
Proguard returned with error code 1. See console
异常:
java.lang.ArrayIndexOutOfBoundsException
解决办法:将proguard.cfg中的"-dontpreverify"改为“-dontoptimize”
参考文章:http://groups.google.com/group/android-developers/browse_thread/thread/eca3b0f5ce6ad00f
我把项目中生成的proguard文件夹(此时文件夹是空的)删掉,而后再从新运行项目,就OK 了。
状况3:
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] Proguard returned with error code 1. See console
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] java.io.IOException: Can't read [proguard.ClassPathEntry@106082] (No such file or directory)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:230)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:200)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:178)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.execute(InputReader.java:100)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.readInput(ProGuard.java:195)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.execute(ProGuard.java:78)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.main(ProGuard.java:499)
抛出这样的异常的缘由是第三方jar的引用路径不对,没有找到这个须要忽略混淆的jar包。
========================官方文档翻译========================================
原文
http://developer.android.com/guide/developing/tools/proguard.html
混淆器(ProGuard)
在本文中(In this document)
Decoding Obfuscated Stack Traces
Debugging considerations for published applications
参见
混淆器经过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。所以,当你的应用程序对安全敏感(要求高),例如当你受权应用程序的时候,混淆器是一种重要的保护手段。
混淆器被集成在android 构建系统中,因此你没必要手动调用它。同时混淆器仅在发布模式下进行构建应用程序的时候才会运行起来,因此在调试模式下构建程序时,你没必要处理混淆代码。让混淆器运行起来是可选择的,可是推荐选上。
这个文档描述了怎样启用并配置混淆器,以及使用跟踪(retrace)工具对混淆的堆栈跟踪信息(stack traces)进行解码。
当你新建了一个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报告,请保存这些文件的一个拷贝。对于为何要保存这些文件的重要性的更多信息,请查看程序发布调试注意事项。
某些状况下,proguard.cfg文件的缺省配置能够知足需求了。可是,对于混淆器来讲,大多数状况作出正确的分析是困难的,而且它或许会删除在它看来是无用的,但对于程序来讲却确实须要的代码。一些例子以下:
一个仅引用于AndroidManifest.xml文件的类。
一个经过JNI调用的方法。
动态引用的属性和方法。
缺省的proguard.cfg文件试图覆盖普通的状况,可是你可能碰到相似ClassNotFoundException的异常,这个异常出如今当你的程序去访问一个被混淆器移除了的类的时候。
你能够在proguard.cfg文件中添加-keep这一行来修复这些错误。例如:
-keep publicclass<MyClass>
-Keep设置有不少可选项和注意地方,因此为了得到更多关于配置信息,强烈推荐你阅读混淆器用户手册。特别有用的有Keep选项综述和举例部分。在混淆器手册问题解决方案部分,介绍了代码在混淆过程当中你可能碰到的其余常见问题。
当混淆代码并输出了一个堆栈调试信息时,这些方法名字是混淆过的,虽然能够进行调试,可是调试变得困难。幸运的是,每当混淆器运行时候,它都会输出到文件<project_root>/bin/proguard/mapping.txt中,该文件包含了从原始类,方法和属性名字到混淆后名字的映射。
Windows系统中retrace.bat脚本命令或者Linux和Mac 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工具从标准输入读取。
保存好每个已发布给用户的程序的mapping.txt文件。经过保存发布构建版本的mapping.txt文件拷贝,确保当用户碰到bug,并把混淆后的堆栈调试跟踪信息提交给你时,你能够进行调试从而修复问题。程序的mapping.txt文件在每次发布构建时都会被覆盖,因此你必定要注意保存正确的版本。
例如,假设你已经发布了一个应用程序并在继续在新的版本中开发添加新的功能。接着你立刻启动混淆器并建立一个新的发布版本。该操做把mapping.txt文件覆盖了。一个用户提交了来自当前发布版本的bug报告,该报告包含了堆栈调试信息。你不再能对用户的堆栈信息进行调试了,由于这个对应用户本机上版本的mapping.txt文件不存在了。其余覆盖mapping.txt文件的状况还有不少,因此对于每个可能须要调试的版本,你都要确保有一份拷贝。