android混淆配置文件|如何混淆android代码以及注意事项

|

① android集成分享sdk后怎么代码混淆

为了保护代码被反编译,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.txtproject.properties文件:[java] view plain#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 【混淆时不会产生形形色色的类名 】- 【指定不去忽略非公共的库类。 】-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 consoleError: C:/Documents (系统找不到指定文件)后来发现是因为将整个工程放到了桌面上,而桌面的目录是C:/Documents and Settings/Administrator/桌面,在这里面有空格,而proguard进行发编译的时候是不允许有空格的如果换了正确路径还不好用的话,直接删除proguard就好了注意:SDK和程序路径最好不要有空格符情况2:Proguard returned with error code 1. See console异常:java.lang.解决办法:将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 ProGuardConfiguring ProGuardDecoding Obfuscated Stack TracesDebugging 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文件之前,自动地对应用程序字节码进行混淆处理。而在调试模式中构建则不会调用混淆器,因为那样调试会更加繁重。 运行混淆器之后输出的文件有:mp.txt 描述.apk包中所有class文件的内部结构。mapping.txt列出了源代码与混淆后的类,方法和属性名字之间的映射。这个文件对于在构建之后得到的bug报告是有用的,因为它把混淆的堆栈跟踪信息反翻译为源代码中的类,方法和成员名字。更多信息,查看解码混淆过的堆栈跟踪信息。seeds.txt 列出那些未混淆的类和成员。usage.txt 列出从.apk中剥离的代码。这些文件放在以下目录中:注意:每次在发布模式下构建时,这些文件都会被最新的文件覆盖。所以每次发布程序时候,为了反混淆来自构建时产生的bug报告,请保存这些文件的一个拷贝。对于为什么要保存这些文件的重要性的更多信息,请查看程序发布调试注意事项。混淆器配置(proguard config)某些情况下,proguard.cfg文件的缺省配置可以满足需求了。但是,对于混淆器来说,大多数情况做出正确的分析是困难的,并且它或许会删除在它看来是无用的,但对于程序来说却确实需要的代码。一些例子如下:一个仅引用于AndroidManifest.xml文件的类。一个通过JNI调用的方法。动态引用的属性和方法。<project_root>/bin/proguard 当你使用Ant时<project_root>/proguard 当你使用Eclipse时解码混淆过的堆栈跟踪信息(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文件的情况还有很多,所以对于每一个可能需要调试的版本,你都要确保有一份拷贝。

② 资源文件及AndroidManifest.xml等配置文件怎么混淆

混淆是针对代码而言的,让别人不容易读懂而已,你这不是混淆了,应该是加内密其实如果你有重容要信息,完全没必要放到AndroidManifest.xml中,放到其他地方啊。或者,你的很隐私的key,在你的程序中有一套这个key的加密算法,比如你的manifest上是key="asdfsdf0003+____#3oidf",别人哪知道他干嘛的,或者别人拿了也不能知道他其实对应的是"ABC"这种的,因为它本身就是加密的

③ android 工程中什么是混淆代码工具proguard的配置文件

proguard的配置文件如果是在4.3版本之后,新建工程之后,就会生成这个文件,里面可以进行一些混淆的操作。

④ 如何混淆android代码以及注意事项

2.3SDK的两个新特点:

1.刚安装上2.3时,查看sdk目录,发现在 ools下新增了一文件夹“proguard”,如下图,我就在想是不是Google终于官方对proguard考虑进去了。理论上,对java的混淆都是可以的,但关键在于如何编写proguard的混淆脚本。

注意要点:

1.混淆以后的包会比混淆前的包小一点,一定要注意这点.

如果混淆不成功,请在第2步,将proguard.config=proguard.cfg修改为proguard.config=E:Mobile_DevelopGoogle_AndroidpublicGoldenBeach_newproguard.cfg这种类似的用绝对路径,请注意绝对路径中的文件夹名不能含有空格,如果有空格请替换为"_".

2.android在用proguard混淆时,一般情况下使用系统自带的配置文件就可以保持大部分外部需要引用的类,比如Activity,view扩展等等,但是有些情况下一些引入的外部lib,如果被混淆也会出现各种各样的问题,如果不想混淆这些包,就要加上

-keep class packagename.** {*;}

这样就能完整保持原有class了

⑤ android mk文件怎么加混淆

针对android 选择user版本进行编译的时候,会出现proguard错误,我们需要知道的事情 1.proguard是做什么的,他的作用是将java代码进行混淆的工具 2.因为proguard是混淆工具,所以android的mk文件也对其支持为两种方式: 1.指定不需要混淆的native方法与变量的proguard.flags文件 如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags 2.制定编译的工程,不要使用代码混淆的工具进行代码混淆 如:LOCAL_PROGUARD_ENABLED := disabled 3.不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被proard优化掉了。所以,在JNI应用中该慎用progurad啊。 解决办法: 1、在Android.mk中加入一行: LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags 2、创建proguard.flag文件,里面写入不需要proguard优化的类和方法。例如: -keep class oms.miracle.mobiletv.broadcast.ServiceContext { *; } 我的这个类是和JNI相关的,不想让proguard去优化而引起错误,向上面写就能实现。 ———-下面是网上找到的一些proguard的资料,贴出来分享: ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法. ProGuard的使用是为了: 1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用. 2.创建的程序和程序库很难使用反向工程. 3.所以它能删除来自源文件中的没有调用的代码 4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件. 参数: -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 – 指定不去忽略非公共的库类。 – 指定不去忽略包可见的库类的成员。 保留选项 -keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件


赞 (0)