adt androidd 有谁在ADT-20下用proguard成功混淆代码了? 能提供一下你成功的proguard-project.txt配置信息吗?

6249人阅读
在Android2.3版本以后的开发环境中,google提供了proguard代码混淆的功能(之前可以自己添加),用来保护我们辛辛苦苦写的一点代码。对于新建的工程,根目录上会自动添加proguard.cfg文件,用于代码混淆,无论你建的target是android的那个版本,都会自动的添加上。在想使用代码混淆的时候,在default.properties文件中添加proguard.config=proguard.cfg一句话,来表明你想使用代码混淆,还有一些简单的使用说明在\docs\guide\developing\tools\proguard.html文件中可以找到,还有一些使用proguard的注意事项,在这里也同样可以找到。对于旧的工程,可以把对应的proguard.cfg拷贝过去,可以实现相同的效果。&在今天尝试混淆的时候出现了“Conversion to Dalvik format failed with error 1”的错误,网上搜到的解决方案都不是针对代码混淆的,后来终于在stackoverflow找到了问题的答案,是因为sdk tools reversion12 的问题,降到reversion11后就没有问题了,更好的解决方法也有人给出了:找到[Android SDK Installation Directory]\tools\proguard\bin\proguard.bat文件,用编辑器打开(我用的是Editplus),将这句话:call %java_exe% -jar &%PROGUARD_HOME%&\lib\proguard.jar %*改为call %java_exe% -jar &%PROGUARD_HOME%&\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9就ok了。其中我还出现了一个错误,是因为我之前在工程中添加了android-support-v4.jar,学习一下看看是否能够更好的兼容不同的版本,但是添加这个jar包之后,混淆的时候就会出现错误。有人说去掉proguard.cfg中-optimizationpasses 5这句话就可以解决,但是我现在对proguard了解的太少了,不知道每句话的具体含义,不敢删~,还是等以后研究明白之后再决定是否可以删。&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:21602次
排名:千里之外
原创:24篇
(2)(1)(15)(11)Android用Proguard混淆代码遇到的问题zz
http://my.oschina.net/u/936286/blog/175062
第一种问题:
Proguard returned with error code 1. See console
Note: there were 678 duplicate class
definitions.&&
Warning: library class android.content.res.XmlResourceParser
extends or implements program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.content.Intent depends on program
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.content.IntentFilter depends on
program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.content.res.ColorStateList depends
on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.graphics.drawable.BitmapDrawable
depends on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.graphics.drawable.ColorDrawable
depends on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.graphics.drawable.Drawable depends
on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.graphics.drawable.Drawable depends
on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.graphics.drawable.Drawable depends
on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.util.Xml depends on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.util.Xml depends on program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.view.LayoutInflater depends on
program class
org.xmlpull.v1.XmlPullParser&&
Warning: library class android.view.LayoutInflater depends on
program class
org.xmlpull.v1.XmlPullParser&&
Warning: there were 13 instances of library classes depending on
classes.&&
& &You must avoid such
dependencies, since the program classes
& &be processed, while the
library classes will remain
unchanged.&&
java.io.IOException: Please correct the above warnings
proguard.Initializer.execute(Initializer.java:321)&&
proguard.ProGuard.initialize(ProGuard.java:211)&&
proguard.ProGuard.execute(ProGuard.java:86)&&
at proguard.ProGuard.main(ProGuard.java:492)
原因:因为工程中用了三方的解析,做混淆时没有-keep引用,就报这个错了;
解决方法:
在proguard.cfg中加入:
## kxml2-min-2.3.0.jar
-keep public class org.** {*;}这句话,就会又报一个错,如下:
第二种错误:
[ 15:41:20 - pocketbook] Proguard returned with error
code 1. See console
[ 15:41:20 - pocketbook] Note: there were 678 duplicate
class definitions.
[ 15:41:20 - pocketbook] Warning: library class
android.content.res.XmlResourceParser extends or implements program
class org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.content.Intent depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.content.IntentFilter depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.content.res.ColorStateList depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.graphics.drawable.BitmapDrawable depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.graphics.drawable.ColorDrawable depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.graphics.drawable.Drawable depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.graphics.drawable.Drawable depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.graphics.drawable.Drawable depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.util.Xml depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.util.Xml depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.view.LayoutInflater depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: library class
android.view.LayoutInflater depends on program class
org.xmlpull.v1.XmlPullParser
[ 15:41:20 - pocketbook] Warning: there were 13 instances
of library classes depending on program classes.
[ 15:41:20 - pocketbook] &
&You must avoid such dependencies, since the
program classes will
[ 15:41:20 - pocketbook] &
&be processed, while the library classes will
remain unchanged.
[ 15:41:20 - pocketbook] java.io.IOException: Please
correct the above warnings first.
[ 15:41:20 - pocketbook] at
proguard.Initializer.execute(Initializer.java:321)
[ 15:41:20 - pocketbook] at
proguard.ProGuard.initialize(ProGuard.java:211)
[ 15:41:20 - pocketbook] at
proguard.ProGuard.execute(ProGuard.java:86)
[ 15:41:20 - pocketbook] at
proguard.ProGuard.main(ProGuard.java:492)
原因:第三方的解析和Android自带的冲突了,
解决办法:
去第三方的包中将那两个类给删掉了,就哦了;
还遇到一个小问题,我混淆时少写了一个关键字,如:-keep public class org.** {*;} 写成了-keep
public org.** {*;}& 就报了如下错误:
Proguard returned with error code 1. See console
Proguard Error 1&
proguard.ParseException: Unexpected keyword 'org.**' in line 74 of
'E:\WorkSpace\口袋书\上线口袋书\pocketbook\proguard.cfg',&
& included from argument number
proguard.ConfigurationParser.unknownAccessFlag(ConfigurationParser.java:1048)&
proguard.ConfigurationParser.parseClassSpecificationArguments(ConfigurationParser.java:547)&
proguard.ConfigurationParser.parseKeepClassSpecificationArguments(ConfigurationParser.java:490)&
proguard.ConfigurationParser.parse(ConfigurationParser.java:138)&
at proguard.ProGuard.main(ProGuard.java:484)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解。下面将自己的理解和认识简要的做个笔记,有异议或者不解的,可以直接留言。
什么是ProGuard工具?
ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。具体来说,使用ProGuard工具,可以达到下面两个目的:
删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。
使用语义混淆的命名替换了代码中的类、字段和函数等,使得其他人无法反编译获取源代码,起到对代码的保护作用。
我看网上有不少人根据ProGuard工具的作用,直接称呼其为&混淆代码工具&,本文也暂时用这个词简称。
更多的理解,可以参考ProGuard工具的官方文档地址:
ProGuard工具的集成与使用环境
其实,ProGuard工具是已经集成到我们android系统中的,所以不需要用户手动的去集成。但是有一点需要注意,仅在程序处于Release模式时ProGuard才有效,反之在Debug模式是不能通过ProGuard来混淆代码的。
根据ProGuard的具体使用环境,我分在Eclipse工具和android源码两种编译环境浅谈ProGuard的使用方法。
Eclipse环境中ProGuard的使用
以我电脑的android4.0环境为例,当我们在Eclipse中新建一个项目,或者导入一个已存在项目(保证当前项目没有语法错误)后,在工程的根目录,会自动生成两个ProGuard的混淆文件:proguard-project.txt和project.properties(在老版本的ADT中,只会生成一个叫proguard.cfg的文件)。我们先看下文件project.properties :
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
# This file must be checked in Version Control Systems.
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-16
看后面一段注释:To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home) ,意指要让ProGuard 来压缩和混淆代码,把这句注释去掉即可!所以,我们只要把下面一句注释取消即可,如下所示:
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
我们仔细的看下这部分代码:这个地方是通过设置proguard.config属性来指定混淆代码的配置文件为本机SDK目录下面的proguard-android.txt文件,以及制定混淆的个性化配置文件为当前工程(eclipse下)根目录下面的proguard-project.txt文件 ,而后面这个文件,恰是我们刚才看到的原本在根目录下自动生成的另外一个文件!
其实打开了这个地方,我们就已经可以混淆代码了,不过这里要注意:不能试图通过运行eclipse中的Run as 和 Debug as 菜单来生成混淆代码,必须通过如下图所示的方法将apk导出才行,当然你可以选择&签名&或者&不签名&:
这样一步操作后,算是代码混淆完成了。那么怎么才能检验我们真的混淆了代码了呢?首先,我们能够看到在工程的根目录新生产了一个文件夹proguard,里面有四个文件,其内容如下:
dump.txt : 描述了apk中所有类 文件中内部的结构体。( Describes the internal structure of all the class files in the .apk file )
mapping.txt : 列出了原始的类、方法和名称与混淆代码见得映射。( Lists the mapping between the original and obfuscated class, method, and field names. )
seeds.txt : 列出了没有混淆的类和方法。( Lists the classes and members that are not obfuscated )
usage.txt : 列出congapk中删除的代码。( Lists the code that was stripped from the .apk )
同时使用反编译软件对新生成的apk反编译后会发现,里面的类名、方法和变量等,都变成了简单的a、b、c、d等毫无含义的字母,这样就达到了混淆的目的:
但在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就要用到我们刚才提到的混淆的个性化配置文件proguard-project.txt,在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,请看下面的最后一个标题会有详述。
Android源码环境中ProGuard使用
在Google发布的android源码中,面对那么多代码和文件目录,此时该如何混淆代码与配置混淆文件呢?
android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。
# Don't obfuscate. We only need dead code striping.
-dontobfuscate
可以说,这句是android工程中代码混淆的总开关,然而,注释了上面的代码后,整个工程就已经是代码混淆了吗?不是的,这里还要关注一个文件alps/build/core/package.mk,在这个文件中有这么一段:
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
# turn on Proguard by default for user & userdebug build
#LOCAL_PROGUARD_ENABLED :=full
切记:当我们需要对整个工程进行代码混淆的时候,就把此处的 #LOCAL_PROGUARD_ENABLED :=full注释去掉,成为有效的宏即可。如果不想对整个工程代码混淆,而只是相对某个模块混淆的话,就先不要动这里的代码。
接着建议将真个工程new一遍,之后就可以针对具体的apk文件进行混淆文件的设置和定制了。下面以alps/packages/apps/Music为例说说该如何对特定模块做到混淆代码:
在Music目录下,我们看到一个平时不太关注,但今天一定很在意的文件名:proguard.flags ,对了,这个文件就是Music的混淆配置文件,可以打开看看(有些地方没有这个文件,用户可以自己手动新建一下,最好名称也叫proguard.flags,android下默认都是这个名字)。当然,设置了配置文件还是不够的,还需要在同目录的Android.mk中如下设置如下两句:
LOCAL_PROGUARD_ENABLED
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
只有这样才能让混淆代码有效,并且将混淆配置文件关联起来。(有些模块没有这两句句,就自己手动加上)
反之,如果用户已经在alps/build/core/package.mk打开了全工程混淆编译的控制点后,又在针对某个模块时不想混淆编译怎么办?这就简单了,将模块下的Android.mk中设置为**LOCAL_PROGUARD_ENABLED := disabled**即可。
这样,我们通过mm编译后的代码生成的apk,或者new真个工程后生成的烧机代码,都是已经添加相应配置的混淆代码了。
反编译后,除过proguard.flags中定制的不需要混淆的代码外,其他都是被混淆了,如图所示是android中Music模块的混淆后反编译结果:
混淆文件的配置
在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就需要我们配置混淆的个性化文件proguard-project.txt(eclipse环境中)或者proguard.flags(android源码环境),在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,大家可以去搜索下,我这里提供一段网上有人共享的配置代码,这个配置代码保留了工程文件中的Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等,用来防止外部调用出错,大家可以借鉴下,以后来配置自己的文件:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-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
-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 *;
阅读(...) 评论()当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的。为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等。我们需要对代码进行混淆,android的sdk中为我们提供了ProGrard这个工具,可以对代码进行混淆(一般是用无意义的名字来重命名),以及去除没有使用到的代码,对程序进行优化和压缩,这样可以增加你想的难度。最近我做的项目,是我去配置的混淆配置,因此研究了一下,这里分享一下。如何启用ProGuardant项目和eclipse项目启用方法在项目的project.properties文件中添加一下代码proguard.config=proguard.cfg //proguard.cfg为proguard的配置文件proguard.config=/path/to/proguard.cfg //路径不在项目根目录时,填写实际路径填写这句配置后,在release打包时就会按照我们的配置进行混淆,注意,在我们平时的debug时是不会进行混淆的。Gradle项目(以及Android Studio)在build.gradle中进行配置android { buildTypes {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'some-other-rules.txt'
//proguardFile 'some-other-rules.txt'配置单个文件这样
} }}如上面代码所示,我们可以使用runProguard true开启,并且对其配置混淆配置,可以配置多个文件或单个文件。android的sdk中已经为我们提供了两个默认的配置文件,我们可以拿过来进行使用,proguard-android.txt和proguard-android-optimize.txt。ProGuard配置上面说到android为我们提供了两个默认的配置文件,在其中,我们可以看到他的一些语法。本节进行描述。保留选项(配置不进行处理的内容)-keep {Modifier} {class_specification} 保护指定的类文件和类的成员-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件压缩-dontshrink 不压缩输入的类文件-printusage {filename}-whyareyoukeeping {class_specification}优化-dontoptimize 不优化输入的类文件-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员混淆-dontobfuscate 不混淆输入的类文件-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称-overloadaggressively 混淆时应用侵入式重载-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.-renamesourcefileattribute {string} 设置源文件中给定的字符串常量后面的文件名,类名,或者包名等可以使用占位符代替?表示一个字符可以匹配多个字符,但是如果是一个类,不会匹配其前面的包名*可以匹配多个字符,会匹配前面的包名。在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的view也不能进行混淆,android提供的默认配置中都有。ProGuard的输出文件及用处混淆之后,会给我们输出一些文件,在gradle方式下是在&project_dir&/build/proguard/目录下,ant是在&project_dir&/bin/proguard目录,eclipse构建在&project_dir&/proguard目录像。分别有以下文件:+ dump.txt 描述apk文件中所有类文件间的内部结构。+ mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。+ seeds.txt 列出了未被混淆的类和成员+ usage.txt 列出了从apk中删除的代码当我们发布的release版本的程序出现bug时,可以通过以上文件(特别时mapping.txt)文件找到错误原始的位置,进行bug修改。同时,可能一开始的proguard配置有错误,也可以通过错误日志,根据这些文件,找到哪些文件不应该混淆,从而修改proguard的配置。注意:重新release编译后,这些文件会被覆盖,所以没吃发布程序,最好都保存一份配置文件。调试Proguard混淆后的程序上面说了输出的几个文件,我们在改bug时可以使用,通过mapping.txt,通过映射关系找到对应的类,方法,字段等。另外Proguard文件中包含retrace脚本,可以将一个被混淆过的堆栈跟踪信息还原成一个可读的信息,window下时retrace.bat,linux和mac是retrace.sh,在&sdk_root&/tools/proguard/文件夹下。语法为:retrace.bat|retrace.sh [-verbose] mapping.txt [&stacktrace_file&]例如:retrace.bat -verbose mapping.txt obfuscated_trace.txt如果你没有指定&stacktrace_file&,retrace工具会从标准输入读取。一些常用包的Proguard配置下面再写一些我在项目中使用到的一些第三方包需要单独配置的混淆配置sharesdk混淆注意-keep class android.net.http.SslError-keep class android.webkit.**{*;}-keep class cn.sharesdk.**{*;}-keep class com.sina.**{*;}-keep class m.framework.**{*;}Gson混淆配置-keepattributes *Annotation*-keep class sun.misc.Unsafe { *; }-keep class com.idea.fifaalarmclock.entity.***-keep class com.google.gson.stream.** { *; }Umeng sdk混淆配置-keepclassmembers class * { public &init&(org.json.JSONObject);}-keep class com.umeng.**-keep public class com.idea.fifaalarmclock.app.R$*{ public static final int *;}-keep public class com.umeng.fb.ui.ThreadView {}-dontwarn com.umeng.**-dontwarn mons.**-keep public class * extends com.umeng.**-keep class com.umeng.** {*; }关于配置方面,我写的不够详细,可以去看参考资料第二条,proguard官方文档。也欢迎大家交流使用遇到的问题和心得。资料参考:1.http://proguard.sourceforge.net/2./tools/help/proguard.html原文地址:http://blog.isming.me/blog//use-proguard/,欢迎转载,转载请注明出处。

我要回帖

更多关于 adt android 的文章

 

随机推荐