防反编译、混淆文件proguard.cfg与proguard-project.txt详解

在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt。

如果需要对项目进行全局混码,只需要进行一步操作:

将project.properties的中

“#  proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。

如 果有一些代码不能被混淆,比如需要加入了so文件,需要调用里面的方法,那么调用JNI访问so文件的方法就不能被混码。在导出的时候,可能不会报错。但 是在手机上运行的时候,需要调用so文件的时候,就会报某某方法无法找到。这个时候就需要用到proguard-project.txt。

在老版本中,创建项目的时候,会给出proguard.cfg,但是在的新版中创建项目则不会有任何提示。这个时候需要只要将proguard.cfg的内容加入到proguard-project.txt中,再根据自己的需要进行编辑即可。

 

 

 

 

 

==================proguard.cfg防反编译方法==================================

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:

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 [[email protected]] (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)

Enabling ProGuard

Configuring ProGuard

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中剥离的代码。

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

  1. <project_root>/bin/proguard 当你使用Ant时
  2. <project_root>/proguard 当你使用Eclipse时

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

混淆器配置(proguard config)

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

  1. 一个仅引用于AndroidManifest.xml文件的类。
  2. 一个通过JNI调用的方法。
  3. 动态引用的属性和方法。

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

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

-keep publicclass<MyClass>

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

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

当混淆代码并输出了一个堆栈调试信息时,这些方法名字是混淆过的,虽然可以进行调试,但是调试变得困难。幸运的是,每当混淆器运行时候,它都会输出到文件<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工具从标准输入读取。

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

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

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

如何保存mapping.txt文件由你决定。例如,你可以根据版本和构建号来重命名它们,或者连同你的源代码进行版本控制。

 

 

时间: 2024-10-16 16:54:52

防反编译、混淆文件proguard.cfg与proguard-project.txt详解的相关文章

Android代码混淆防反编译解决方案研究

做Android开发的都知道要做混淆去防apk被反编译.破解,通过proguard进行Java代码混淆.但是,Android代码混淆真的能起到实质性的作用吗?看下面分析 1.Android代码混淆 如上图,对Android 代码进行混淆后混淆器将代码中的所有变量.函数.类的名称加密为简短的英文字母代号,在APP被破解后增加破解者对代码的阅读难度. 但是混淆的功效只能运作在APP已经被破解后,而且只是增加破解者的难度时间,对其防止破解的作用意义不是很大. 那么,Android代码混淆不能从根本上防

android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ 1.项目防反编译技术步骤: a) 加密. b) 混淆. c) 加壳(加固); 2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密: 3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩.优化.混淆.预检的功能,AcFlash项目的Android端使用了ProGua

android 反编译 混淆过程中注意事项

此文源自组内成员分享的PPT,其他成员的文档由于没有得到授权,暂不公开. 本文命令如果没有特殊注明,均为windows 7环境. 本文只涉及大概的知识点,不涉及具体的细节,需要注意. 反编译 apktool 可反编译资源文件(xml,点九图)以及代码为smali代码 使用命令:apktool d xxx.apk output_filepath dex2jar 反编译dex文件(解压apk获得的classes.dex)为jar 使用命令:dex2jar xxx.dex jd-gui 查看jar文件

APK防反编译技术

APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包含有一个classes.dex,我们编译后生成的程序代码就全部在那里了,通过apktool等工具可以轻松地将它们反编译成smali代码.有了这些反编译出来的smali代码之后,我们就可以轻松地了解别人的APK使用的一些技术或者直接修改别人的APK.由于这些APK反编译工具的存在,我们迫切地希望能有方法去防止别人来反编译我们的APK,从而保护自己的商业机密和利益. 下载地址:地址 版权声明:本文为博主原创文章,未经

android反编译odex文件

关于android的反编译工具,相信大家并不陌生 如APK-TOOL,dex2jar APK-TOOL 用于反编译出布局文件 下载地址http://code.google.com/p/android-apktool/downloads/list dex2jar 用于将dex反编译成.jar包 下载地址:http://code.google.com/p/dex2jar/downloads/list 生成的jar包可用jd-gui来查看(前提是代码未被混淆) 但是如果我们从rom里面提取出的apk是

MAC笔记本下Android 反编译apk文件最新版本

这篇文字主要是针对MAC笔记本反编译APK的教程,都是最新的,首先需要的工具罗列出来: apktool dex2jar JD-JUI 主要就是这3个工具了. apktool作用:主要是用来反编译res下面的xml文件. dex2jar作用:主要是用来反编译APK查看源代码的. JD-JUI作用: 查看dex2jar反编译出来的jar文件. 如果APK混淆后,一般只能清除的查看出xml文件的内容也就是res下的所有文件,代码基本看不懂,也就是一些a b c 这样的名字,不可大致可以看看基本的,看看

MyEclipse反编译Class文件

对于需要查看Java Class文件源码的筒子们来说,必须在项目中导入Java源码才能查看Class文件的具体实现,这不仅十分的麻烦,因为有时我们并不可以获得Class文件对应的Java源码.今天就给大家介绍一款反编译Class文件的工具,有了它,可以查看任何Class文件的源码. 1.下载MyEclipse反编译Class文件的工具 工具的下载地址:http://download.csdn.net/detail/yulei_qq/5543635 2.工具的安装 下载后上面的工具之后,解压出来,

反编译class文件并重新编译的方法

在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler这个工具,直接打开对应的.class文件.然后点击菜单:File→Save Source,将文件保存成.java文件.如下: PS:Java Decompiler工具还可以用来反编译jar包,有时候需要了解下jar包里的代码实现,如果开发工具里看不到,可以直接用Java Decompiler打开ja

Android 反编译 apk 文件

我想看 apk 的源码怎么办?那么就要用到 apk 反编译工具. 先说一下反编译的思路: 1)apk 文件其实就是一个压缩包.将文件后缀 .apk 修改为 .zip 即可通过解压软件打开.打开压缩包可以看见几个文件: 要看源码,只需要关注 classes.dex 就行,这个文件就是 apk 的源码. 2)classes.dex 是被 android sdk 打包好的源码文件,无法直接打开.这时需要一个打开  classes.dex 的工具 3)打开之后的源码是一些 .class 文件,学过 Ja