什么的是代码混淆

为了保护代码被反编译,android引入了混淆代码的概念

1.设置混淆

在工程下找到project.properties文件

在文件中加入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt这个是系统的

也可以用自己的混淆文件(这样就可以配置一些自己的东西),去sdk.dir}/tools/proguard/ 下复制proguard-android.txt文件到本地工程中

然后设置成proguard.config=proguard-android.txt

project.properties文件:

[java] view plaincopy

  • #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
  • proguard.config=proguard-android.txt
  • # Project target.
  • target=android-17
  • -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中剥离的代码。

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

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

    混淆器配置(proguard config)

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

    缺省的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文件由你决定。例如,你可以根据版本和构建号来重命名它们,或者连同你的源代码进行版本控制。

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

    • 一个通过JNI调用的方法。
    • 动态引用的属性和方法。
    • <project_root>/bin/proguard 当你使用Ant时
    • <project_root>/proguard 当你使用Eclipse时
时间: 2024-11-10 11:18:28

什么的是代码混淆的相关文章

安卓 代码混淆与打包

gradle的配置 proguard-rules.pro混淆配置 ###-----------基本配置-不能被混淆的------------ -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment -keep public class * extends android.app.Application -keep public class * exten

android 代码混淆导致问题,快速定位

代码混淆导致问题,快速定位 在代码混淆打包时,屏蔽了用到的第三方库,以及常规的android混淆屏蔽,但生成的apk,运行还是会崩溃.事出必有因,后来分析找到原因是使用greendao自动生成的java-gen下package中的内容没有屏蔽代码混淆,导致存储数据库时,报*a(SourceFile:) NullPointerException * 混淆打包apk,运行崩溃 总结如下: 我们在打包时,debug版本没问题,但混淆后release版本有时会出现异常崩溃, 比如:a(SourceFil

Proguard android代码混淆 防止反编译

Proguard android代码混淆 防止反编译 http://www.360doc.com/content/13/1030/13/9171956_325290258.shtml

.NET代码混淆、保护和优化控件Spices .Net Obfuscator

Spices .Net Obfuscator控件用于防止您的.NET软件被黑客.竞争对手或者窥探者进行逆向工程.代码篡改或是未经授权就可使用,该工具可提供.NET代码混淆.保护和优化等,完全保护您的.NET代码和数据安全.Spices.Net Obfuscator 重新构建您的.NET程序集为不可能被拆卸.反编译的新的格式. 具体功能: 支持所有.NET语言c#, VB.Net, managed c++, J# 完全支持MS Visual Studio 2003 / 2005 / 2008 /

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

Android代码混淆(新版本ADT)

说明: 看网上说的很多Android代码混淆的方法都是旧版本ADT的方法,今天用到代码混淆,记下来分享一下,有需要的可以看看. 实践: 我就不写东西了,还是直接给大家看我项目中用到的文件就好了.注释我写在图片上了. 第二个文件的代码我还是写出来吧,可能有朋友用的和我的差不多.(注意不要把注释写进去) 这两个文件都是项目生成的时候由ADT自动生成的,不用自己加. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -keep public class * extend

代码混淆

拷贝上面图片中的文件到工程中, 默认四大组件和自定义控件不会被混淆,如果想不混淆(保持不变)某个包名下面的bean类,就可以按照下面的代码混淆 打包apk之前必须进行代码混淆 混淆代码的步骤 1.找到proguard-android.txt文件放到工程的根目录下 sdk\tools\proguard 2.将工程的project.properties的代码放开 proguard.config=proguard-android.txt:proguard-project.txt 3.避免混淆,prog

Android代码混淆技术

Android混淆是Android开发者经常使用的一种用于防止被反编译的常见手法.Android开发基于java语言的,很容易被别人反编译出来,一下就相当于裸奔了,特别是用于商业用途的时候,防止反编译是必要的措施.而Android混淆的确可以保证Android源代码的一定安全. Android混淆技术 Java类名.方法名混淆 Dalvik字节码包含了大量的调试信息,如类名.方法名.字段名.参数名.变量名等,使用反编译工具可以还原这些信息.由于类名.方法名等通常都会遵循一定的命名规范,破解者很容

【Android】Android Studio 进行代码混淆,打包release APK

整了一天,感觉坑挺多. 1. 选择如图中的选项Android Studio进行签名打包: 2. 填写APP对应的信息:(最好用个文本记下来放在项目中同步给Team) - Key store path: 如果是新APP则创建,如果已经有了选择就行: - Key store password: ******* - Key alias(别名): 自定义 - 如果是新创建的文件需要选择时间,整个25年足够用了,公司信息填上就OK - 下一步后选择release就开始打包 3. Android Studi

【转】Android代码混淆指南

请尊重他人的劳动成果,转载请注明出处:<Android代码混淆指南> 本文将和大家分享使用Eclipse+ADT与使用Android Studio进行代码混淆打包的方法. 使用Eclipse+ADT进行代码混淆打包的方法 新版本SDK下进行打包混淆 如果使用新版本的SDK创建的Android项目会在项目的根目录下生成一个proguard-project.txt文件,该文件是默认的混淆规则文件. 混淆打包的步骤: 1.在proguard-project.txt文件中添加混淆的项目规则,大家可参考