假设已有ADT创建的android项目HelloAndroid并且已经有可用的proguard混淆器(我用的proguard4.4)。
第一步要做的是为项目添加ant build支持。由于ADT插件并不直接支持proguard等混淆器,所以不能像j2me那样在有功能比较完善的插件(如EclipseME等)的基础上直接一键混淆一键打包,不过好在android sdk本身提供了比较完善的ant编译支持,可以通过类似命令行编译的方式,对android项目的整个编译、生成过程进行自定义,从而能够实现对编译中途生成的java bytecode进行插入proguard混淆操作然后再转android dex码生成apk。
进入命令行模式,并切换到项目目录,执行如下命令为ADT创建的项目添加ant build支持:
d:\android-sdk-windows\tools\android.bat update project -p . -t 3
结果如下:
Updated default.properties
Updated local.properties
Added file D:\Projects\HelloAndroid\build.xml
刷新eclipse项目文件夹,侦测出sdk工具添加的build.xml和local.properties文件。然后,修改项目属性,在Builders栏中新建一个Ant Builder(Ant在较新版本的Eclipse中已经内置,旧版本的话可能需要自己安装相关插件),对其中Buildfile选择生成的build.xml,Base Directory选择项目目录即可。如果希望在编译项目时自动执行ant build就在刚创建builder的地方给ant builder打上勾,不勾的话就得手动执行build.xml进行编译。
现在尝试编译项目的话,会在控制台内显示类似如下的信息:
Buildfile: D:\Projects\HelloAndroid\build.xml
[setup] Project Target: Android 2.1
[setup] API level: 7
help:
[echo] Android Ant Build. Available targets:
[echo] help: Displays this help.
[echo] clean: Removes output files created by other targets.
[echo] compile: Compiles project’s .java files into .class files.
[echo] debug: Builds the application and signs it with a debug key.
[echo] release: Builds the application. The generated apk file must be
[echo] signed before it is published.
[echo] install: Installs/reinstalls the debug package onto a running
[echo] emulator or device.
[echo] If the application was previously installed, the
[echo] signatures must match.
[echo] uninstall: Uninstalls the application from a running emulator or
[echo] device.
BUILD SUCCESSFUL
Total time: 375 milliseconds
这样就基本说明使用ant build的android项目已经ok了,build脚本默认target是help,所以会显示如上信息,修改target为debug或release就可以像无ant时一样编译、生成以及调试了。
接下来看这一部分:
上面提示的就是我们需要做的,自定义build过程,根据提示copy android_rules.xml里
节点的内容到下,然后修改setup属性,加入import=”false”。
完事后再次执行build.xml的话就已经用自己的build.xml覆盖了默认的整个build过程了。
如果在以上编译过程中控制台提示了编码问题,如中文注释等,可以对target compile中的
<javac encoding=”ascii” target=”1.5″ debug=”true” extdirs=””
destdir=”${out.classes.absolute.dir}”
bootclasspathref=”android.target.classpath”
verbose=”${verbose}” classpath=”${extensible.classpath}”>
<src path=”${source.absolute.dir}” />
<src path=”${gen.absolute.dir}” />
<classpath>
<fileset dir=”${external.libs.absolute.dir}” includes=”*.jar” />
</classpath>
</javac>
中的encoding值进行修改,如改为GBK。
接下来,添加调用proguard混淆器的build targe:”optimize”
<!– Using proguard for the actual obfuscation.
Referenced from: http://code.google.com/p/zxing/source/browse/trunk/android-m3/build.xml?r=321 –>
<target name=”optimize” depends=”compile”>
<jar basedir=”${out.classes.absolute.dir}” destfile=”temp.jar”/>
<java jar=”D:/Program Files/proguard4.4/lib/proguard.jar” fork=”true” failonerror=”true”>
<jvmarg value=”-Dmaximum.inlined.code.length=32″/>
<arg value=”-injars temp.jar”/>
<arg value=”-outjars optimized.jar”/>
<arg value=”-libraryjars ${android.jar}”/>
<!– <arg value=”-libraryjars ${library-jar}/some_lib_used.jar”/> –>
<arg value=”-dontpreverify”/>
<arg value=”-dontoptimize”/>
<arg value=”-dontusemixedcaseclassnames”/>
<arg value=”-repackageclasses ””/>
<arg value=”-allowaccessmodification”/>
<arg value=”-keep public class com.HelloAndroid.Main”/>
<!– <arg value=”-keep public class com.just2me.obfapp.receiver.*”/> –>
<arg value=”-optimizationpasses 1″/>
<arg value=”-verbose”/>
<arg value=”-dontskipnonpubliclibraryclasses”/>
<arg value=”-dontskipnonpubliclibraryclassmembers”/>
</java>
<delete file=”temp.jar”/>
<delete dir=”${out.classes.absolute.dir}”/>
<mkdir dir=”${out.classes.absolute.dir}”/>
<unzip src=”optimized.jar” dest=”${out.classes.absolute.dir}”/>
<delete file=”optimized.jar”/>
</target>
其中需要修改java jar=”D:/Program Files/proguard4.4/lib/proguard.jar”中的proguard路径为对应路径,
<arg value=”-keep public class com.HelloAndroid.Main”/> 这部分中的class需要按照manifest中指定的类进行修改,同时,引用的外部lib也需要在这里指定,具体过程可以参考最后的几篇文章。
最后,修改-dex target的depends项,depends=”compile”加入optimize,为:depends=”compile,optimize”
再次执行编译,可看到optimize target的输出如下:
optimize:
[jar] Building jar: D:\Projects\HelloAndroid\temp.jar
ProGuard, version 4.4
Reading input…
Reading program jar [D:\Projects\HelloAndroid\temp.jar]
Reading library jar [D:\android-sdk-windows\platforms\android-2.1\android.jar]
Initializing…
Ignoring unused library classes…
Original number of library classes: 2514
Final number of library classes: 196
Shrinking…
Removing unused program classes and class elements…
Original number of program classes: 13
Final number of program classes: 5
Obfuscating…
Writing output…
Preparing output jar [D:\Projects\HelloAndroid\optimized.jar]
Copying resources from program jar [D:\Projects\HelloAndroid\temp.jar]
[delete] Deleting: D:\Projects\HelloAndroid\temp.jar
[delete] Deleting directory D:\Projects\HelloAndroid\bin\classes
[mkdir] Created dir: D:\Projects\HelloAndroid\bin\classes
[unzip] Expanding: D:\Projects\HelloAndroid\optimized.jar into D:\Projects\HelloAndroid\bin\classes
[delete] Deleting: D:\Projects\HelloAndroid\optimized.jar
表示proguard混淆已成功运作。
PS:如果在以上过程中提示javac不能找到这样类似的问题的话,可能的原因是创建的ant builder中的JRE项没有指定对,可以尝试修改为使用Separate JRE换换ant的JRE试试。
主要参考文章:
为android项目增加支持ant构建 http://marshal.easymorse.com/archives/1665
請為你的 Android 程式加上 obfuscation 吧! http://ysl-paradise.blogspot.com/2008/10/android-obfuscation.html
android混淆(Obfuscate) http://fonter.javaeye.com/blog/489728
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。
Hi,
关于“ 这部分中的class需要按照manifest中指定的类进行修改,同时,引用的外部lib也需要在这里指定,具体过程可以参考最后的几篇文章。”
这部分,我看了最后的几篇文章也不太明白,想请教一下,manifest中指定的类是肯定全部添加了,但是有些工具类并为在manifest中的是否需要添加?引用外部的lib又是应该如何添加? ?
希望可以得到你的答复,先谢谢了。
Proguard混淆默认会改变类名以起到混淆作用,比如你原来的com.HelloAndroid.Main可能会被混淆成com.HelloAndroid.a,这样的话manifest里提供给OS的入口类等就找不到了,所以需要把manifest里指定的提供给系统的入口类等的类保留下来不进行混淆。你自己实现逻辑功能的类理论上是不用加载这里的,就是正常混淆就可以了。
引用外部库的和这个问题性质类似,也是为了避免混淆改变类名导致不能混淆的部分找不到对应的类。添加也是用同样的参数keep下指定的类。
总之如果你没有keep这些类的话程序混淆后运行会出找不到原名字的类这种问题。
那意思是说,只需要keep我暴露给外部使用的类,内部使用不需要keep?比如引用lib我也只是程序内部自己使用,那就不用keep?
对。manifest里指定的是这样,lib的问题当时是用admob试的,好像是也需要keep,记不太清了,你可以自己试试看。
好的,就是关于admob引用,不太清楚要怎么样,我再试试看,谢谢。
Hi,
我又出现了新问题,当我开始build的时候,显示下面的错误,应该如何解决?
resource-src:
[echo] Generating R.java / Manifest.java from the resources…
[exec] E:\Android App\sms\MyPrivateMessages\AndroidManifest.xml:26: ERROR Error: No resource found that matches the given name (at ‘icon’ with value ‘@drawable/icon’).
[exec] E:\Android App\sms\MyPrivateMessages\AndroidManifest.xml:26: ERROR Error: No resource found that matches the given name (at ‘label’ with value ‘@string/app_name’).
[exec] E:\Android App\sms\MyPrivateMessages\AndroidManifest.xml:28: ERROR Error: No resource found that matches the given name (at ‘label’ with value ‘@string/app_name’).
BUILD FAILED
缺少1个图标和1个叫app_name的字符串资源,看看你的项目夹子里是不是少东西了。
不用ant是可以正常编译的,说明本来资源指向是没问题的,我也查看过是有他说缺少的
你的意思是你的项目在我上面写的那步添加ant编译方式后就不能正常build了?按理说d:\android-sdk-windows\tools\android.bat update project -p . -t 3这步执行完了不对ant脚本做任何改动时应该是可以用ant正常编译项目的。
啊,对,这一步是可以的,应该是自定义ant后就不行了,不知道你是否有遇到过这样的情况?
根据提示copy android_rules.xml里
节点的内容到下,然后修改setup属性,加入import=”false”。
到这步的时候编译有问题么?就是在加入proguard之前的所有步骤?
proguard作用的是原始方式编译生成的jar包里的class,对资源这部分应该是没修改的。
我也遇到了同样的问题.
[exec] ..\res\layout\vw_custom_title.xml:8: error: Error: No resource found that matches the given name (at ‘background’ with value ‘@drawable/btn_title_back_big’).
[exec] ..\res\layout\vw_custom_title.xml:22: error: Error: No resource found that matches the given name (at ‘background’ with value ‘@drawable/background_title_button_home’).
[exec] ..\res\drawable\add_illegal_button.xml:3: error: Error: No resource found that matches the given name (at ‘drawable’ with value ‘@drawable/add_illegal_tapped’).
[exec] ..\res\drawable\add_illegal_button.xml:6: error: Error: No resource found that matches the given name (at ‘drawable’ with value ‘@drawable/add_illegal_tapped’).
……
默认打包都没问题.而且都可以运行.而且把这个ant的build.xml文件放到其他工程下面也可以通过编译.
就是放到我需要build的项目下面就报这个错误.哪里问题呢???
我工程哪里的问题???
如果是要混淆的话,看看我写的这个新方法:http://blog.k-res.net/软件使用/eclipse配合adt为android项目添加proguard混淆的简单新方法.html
这篇文章写的方法已经过时了,新版android sdk整合了proguard支持,不用再费劲修改ant编译脚本了。
HI,我又参考了另外一篇文章http://www.ophonesdn.com/forum/thread-2455-4-1.html,现在问题是引用的jar他找不到,我尝试了使用“”“和”“都不行,添加了这个属性ant不能自己找出libs目录下的jar文件吗?非常感谢你的答复
是proguard混淆的时候找不到引用的jar么?试试在ant build xml中的proguard执行段里加上引用库参数,类似这个<arg value=”-libraryjars ${android.jar}”/>
是在javac这一段找不到,然后就继续不下去了
${external.libs.absolute.dir}你看看你那ant xml里echo出来的这个变量值是什么,是不是你引用的jar所在的目录。
非常感谢,这个问题终于解决了,对ANT看来真是不熟悉啊,到了proguard混淆了,这时候他显示”ote: there were 37 duplicate class definitions.“,我的程序里带有一部分我自己改写过的android源码,估计是跟这个有关,不知道他会不会识别先用我自己改写的,另外dex-obf:
[apply] ��ʱ��Ӧ�� =E:/Android�� 到了这步出现个乱码的输出又错误中断了,这一步应该是dex混淆了吧?难道文件夹名不能带空格?我的文件夹名是”Android app“中间有个空格的
Proguard执行部分最后没有的到类似 [unzip] Expanding: D:\Projects\HelloAndroid\optimized.jar into D:\Projects\HelloAndroid\bin\classes
[delete] Deleting: D:\Projects\HelloAndroid\optimized.jar 这样的提示?就是把Proguard混淆后生成的jar包再解开,然后才能进行android的dex编码转换,看看是不是这部中间文件出问题了。
有,就是到了上面那几步之后就到我说出错的部分
[unzip] Expanding: E:\Android App\sms\MyMessages\optimized.jar into E:\Android App\sms\MyPrivateMessages\bin\classes
[delete] Deleting: E:\Android App\sms\MyMessages\optimized.jar
dex-obf:
[apply] ��ʱ��Ӧ�� =E:/Android��
额,那你检查一下ant build文件里的dex-obf这个target里是不是写错什么东西了,比如你复制粘贴错了什么。应该不是个空格的问题,要不用IDE直接build应该也会出错。
看不出来有什么错误,里面没写什么特别的东西
不支持贴代码?
target name=”dex-obf” depends=”optimize”
apply executable=”${dx}” failonerror=”true” parallel=”true”
arg value=”–dex” /
arg value=”–output=${intermediate-dex-location}” /
arg path=”${outdir-classes}” /
fileset dir=”${externallibs}” includes=”*.jar” /
/apply
/target
显示错误是在这行 apply executable=”${dx}” failonerror=”true” parallel=”true”
经过检查,发现真的是路径带空格问题,现在已经能成功编译了,非常感谢你的耐心解答:)
不客气,帮助别人解决问题也是在给自己积累经验。
汗。。。又遇到问题了,现在是能编译成功了,但是安装不成功,复制到机子安装显示程序未安装,在混淆targe那里我只keep了几个暴露出来的service和receiver,还有主activity,难道manifest里的全部要keep?另外我重写了几个android系统源码的类,在ant 过程中有提示有重复定义的类还有使用过时了的API,不知道这个是否有影响?
我尝试”arg value=”-keep class CN.MyMessages.*”/“ 将我自己写的所有类keep也还是不行,另外ant生成的APK要比原来生成的APK要小100多K,我感觉问题是出在混淆后找不到类,但是我已经把我自己写的全部keep了,剩下没keep的就是那些我改写系统源码的类了,难道那些要keep?
试了一下午,还是不行,不知道,这中间有什么需要注意的地方?
希望能再帮忙指点一下,非常感谢
你先试试在模拟器上能安装么,如果装不了看看LogCat里是否有什么相关信息,如果你真机有数据线能开调试模式的话用真机看看也行。
Log 相关的只有这几行,提示没有写入SD卡权限那个,似乎没关系吧
10-08 11:15:31.331: INFO/ActivityManager(1307): Starting activity: Intent { dat=file:///sdcard/myproject_unalign.apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
10-08 11:15:32.487: DEBUG/dalvikvm(1367): GC freed 113 objects / 6768 bytes in 76ms
10-08 11:15:32.542: INFO/ActivityManager(1307): Displayed activity com.android.packageinstaller/.InstallAppProgress: 1187 ms (total 1187 ms)
10-08 11:15:33.643: DEBUG/PackageParser(1307): Scanning package: /data/app/vmdl25432.tmp
10-08 11:15:33.659: INFO/PackageParser(1307): CN.MyMessages: compat added android.permission.WRITE_EXTERNAL_STORAGE
10-08 11:15:33.682: ERROR/PackageParser(1307): Package CN.MyMessages has no certificates at entry res/anim/grow_from_bottom.xml; ignoring!
10-08 11:15:33.839: DEBUG/dalvikvm(1307): GC freed 7573 objects / 433800 bytes in 126ms
试试把这里提示的error修正一下看看,这种问题我也没遇到过。
只能一点一点试看看问题在哪,比如对比一下未混淆的apk包等等。
我感觉是不是打包少了一部分,即使优化,也不会比正常编译的少100多K吧,我再试试吧,谢谢。
问题就是出在
ERROR/PackageParser(1307): Package CN.MyMessages has no certificates at entry res/anim/grow_from_bottom.xml; ignoring!
这句,说APK的资源没有证书?我尝试signapk target也是显示这样,不知要怎么样才有证书,Google了一下,这个地方有相同的情况,但是SDK0.9的,里面的方法似乎不适用
http://www.mail-archive.com/android-developers@googlegroups.com/msg05302.html(要翻墙)
Hi,我发现问题是出在哪了,正常编译出来的APK里有META-INF这个文件夹,证书存在这个文件夹里,但是用ant打包出来的却没有,请问你知道该怎么解决吗?实在不好意思一直打扰你
要说是签名相关的问题话,你看下这个:
Android Ant Build. Available targets:
help: Displays this help.
clean: Removes output files created by other targets.
compile: Compiles project’s .java files into .class files.
debug: Builds the application and signs it with a debug key.
release: Builds the application. The generated apk file must be
signed before it is published.
install: Installs/reinstalls the debug package onto a running
emulator or device.
If the application was previously installed, the
signatures must match.
uninstall: Uninstalls the application from a running emulator or device.
项目生成的默认ant build脚本里的几个target,这个我在我这篇里也提了,你看看你是用的哪个target,也许和这个有关系,试试用release,有发布打包的过程。
device.
再有你试试把正常编译出来的包里的META-INF里的东西手动添加到混淆后的包里看看这样可以过安装么?
手动加进去并不行,他提示“java.lang.SecurityException: META-INF/MANIFEST.MF has invalid digest for resources.arsc。。。” 签名我应该已经成功签名,但是不知道为什么没生成META-INF里的证书文件,下面是我签名部分的脚本,应该是没有问题的
target name=”signapk” depends=”release-obf”
copy file=”${out-apk}” tofile=”${outtemp-apk}” /
exec executable=”${tool-jarsigner}”
arg line=”-verbose” /
arg line=”-keystore E:/AndroidApp/my.keystore” /
arg line=”-storepass ×××××” /
arg line=”-alias my.keystore” /
arg line=”-keypass ××××××××” /
arg line=”${outtemp-apk} android” /
/exec
exec executable=”${tool-jarsigner}”
arg line=”-verify -certs ${outtemp-apk}” /
/exec
copy file=”${outtemp-apk}” tofile=”${signed-apk}” /
delete file=”${outtemp-apk}” /
/target
另外这行我不太明白作用是什么,难道是因为这里出错的?
arg line=”${outtemp-apk} android” /
如果ant脚本执行签名的时候没提示错误的话那应该是没什么问题。你看看用ide直接生成的和混淆生成的未签名包有没有这个差异,看看是不是签名的问题。
已经看过了,正常编译未签名和正常编译签名都带有META-INF文件夹,里面有CERT.RSA和CERT.SF,而用ant编译生成的,无论签名否都没有META-INF这个文件夹,另外在ant编译出来的classes文件夹里有META-INF这个文件夹,但是没有上面那两个关于证书的文件,不知你是否能提供一个你可以正常编译安装的build.xml,给我研究看,这个要求可能比较无理,不方便的就算了
我找了一下,写这篇时候用的代码找不到了,我用android一个叫SpriteMethodTest的示例程序加了个混淆,你可以参考一下。加完混淆后的apk可以正常签名,安装,运行,但是这个程序里面的startActivity混淆后好像有点问题,还没来得及查是哪个类的问题。
http://www.k-res.net/dl/SpriteMethodTest.rar
非常感谢,我使用你提供的这个project以及我原来project照你这个写的build.xml均在这个地方停了下来,不知道这是怎么回事?看步骤已经是到了最后一步
[apkbuilder] Creating myproject-debug-unaligned.apk and signing it with a debug key…
[apkbuilder] Using keystore: C:\Documents and Settings\Administrator\.android\debug.keystore
[apkbuilder] E:\mpm\bin\classes.dex => classes.dex
额,你看看默认的生成目录bin下有没有生成好的apk?
有一个unaligned的,但是安装不了的,调用的是apkbuilder,没有改动过,好奇怪啊
这样的话是不是你的项目本身和proguard的某些设置有不相容的地方,比如你说的重写的系统类什么的,导致proguard不能正常生成混淆后的class了?
Hi,我把ANT脚本重新整理了一遍,现在到下面步骤就失败了
optimize:
[jar] Building jar: E:\mpm\temp.jar
[java] Error: Expecting class path separator ‘;’ before ‘{‘ in argument number 3
网上查了下说是不能有空格,但是我的路径里没有空格啊,除了JAVA_HOME的,不知道你知道这是怎么回事吗?
能分享一下你的解决方法吗?我也遇到了同样的问题,谢谢
解决了,居然是android-jar变量的问题。。要直接用绝对路径。。
但是已经过了proguard那一部分,到打包classes生成dex再打包成APK了,classes文件夹下已经生成了classes
你提供的SpriteMethodTest运行ANT打包也是这样,难道是我的配置问题?
我刚才又检查了一下,发现可能是这个地方导致的你说的那个问题:
target name=”-dex” depends=”compile,optimize”,把它改成target name=”-dex” depends=”optimize”,去掉compile依赖,然后执行一遍ant的clean清掉之前build生成的临时文件,再用release build看看,生成的apk应该就没问题了!
PS:这个clean好像是挺重要的,我试了几次连续build,但不执行clean的话就会出一些奇怪的问题,clean过以后再build就没事了,可能混淆过程有些临时文件或是别的什么干扰了正常的编译生成过程。
非常感谢,折腾了几天终于可以了,为了表示对你的感谢,我对进行小小的捐赠
那个捐赠按钮怎么不行,显示“数据与输入的字符集或默认编码不符。如需更多信息,请联系商家。
”
呵呵,不用客气了,那个是很久以前拿paypal帐号玩的,应该是过期了,问题解决了就好。
你真是热心,希望能和你交个朋友,我的Email你可以看到吧,我主要做iphone和android的应用,android market上搜索ChirpChirping,可以看到我的业余个人作品
嗯,没问题。
你好,我已经完全按照你的写法去做了,可是没有得到预想的结果。
Ant配置项目那块已经得到预想结果,可是配置混淆那块,都改过了,都没有输出optimize:的日志。
急,请尽快回复。
你先试试用我前面上传过的http://www.k-res.net/dl/SpriteMethodTest.rar,看能正常通过么?
确认一下除了脚本外的其他设置是否正常。
你好,能加下QQ吗?
183455980
已经混淆成功了,谢谢楼主。
恭喜
你好,能提供一下引入ADMob之后的build文件吗?是不是只要keep第三方包就可以了~?
不只是第三方包,还有暴露给系统的接口类等,比如activity类等,这些在我前面提供的那个SpriteMethodTest.rar里的项目build文件里有样例。
楼主 我在混淆的时候老是提示:build.xml:296: Java returned: 1
就是:
这行.
到底是哪里出问题了…麻烦解答…路径我是放在那个路径没错
build.xml的296行写的是什么啊?
推荐你先用我前面提到的一个混淆例子程序试试,然后对比一下你自己的脚本看看哪里写的不太好。
“java jar=”D:/Program Files/proguard4.4/lib/proguard.jar” fork=”true” failonerror=”true””写的是这个…能显示不!?
你试试在命令行下手动用java -jar运行你的脚本里的这行命令看有什么反应
运行显示
“ProGuard, version 4.4
Usage: java proguard.ProGuard [options…]”
那这样的话proguard本身应该没问题,看看是不是后面的混淆参数有哪个写错了导致脚本执行中断的。
我试试你写的那个build.xml…谢谢了
不好意思…我又来提问了…程序里面有admob的jar包…直接混淆后安装应用报错提示找不到AdView…需要在xml的文件里加什么来keep呢!?是keep整个jar包还是!?!?
我实在很菜…麻烦能详细点吗
在名字叫optimize的target里,有个-keep public class XXX的参数行,你copy一份出来然后写上那个AdView类的带包路径的类名,混淆后运行时提示找不到的所有类都要keep下来,不需要keep整个包。
我加了” ” 这样没错吧.
但还是提示:”11-23 07:14:07.333: ERROR/AndroidRuntime(345): Caused by: java.lang.ClassNotFoundException: com.admob.android.ads.AdView in loader dalvik.system.PathClassLoader@437aacd8″
arg value=”-keep public class com.admob.android.ads.AdView”
上面有个-libraryjars,添一个这个参数把admob的jar包引用上再试试看。
老大…实在不好意思一直麻烦你.
我加了”property name=”admob-jar” value=”D:\\admob-sdk-android\\admob-sdk-android.jar””
“arg value=”-libraryjars ‘${admob-jar}'”
“arg value=”-keep public class com.admob.android.ads.AdView”
控制台输出也有:
[java] Reading library jar [D:\Program Files\android-sdk-windows\platforms\android-3\android.jar]
[java] Reading library jar [D:\admob-sdk-android\admob-sdk-android.jar]
这样我参数配置应该没错吧.
也能编译成功.但是好像根本没有认到admob的jar包…我对比没广告的和带广告的混淆编译后基本没太大差别…
运行还是提示找不到AdView.不知道你是否有成功加入admob并混淆成功过.谢谢啦…我实在没头绪.
呵呵,不用客气。
这个android混淆当时是有个小程序在写的时候顺便研究了一下,完事以后以后我把程序发到google android market上了,结果market上有用户反馈的异常崩溃记录由于混淆导致追踪信息没有可读性,后来就给去了。
你这个程序如果不挂admob的话混淆完了的apk可以正常安装运行么?
我觉得要是该keep的类都keep了的话应该是没有问题的,检查一下看看是不是除了adview还有别的类需要keep。
不挂admob的程序混淆后的apk是可以正常安装运行的.
我发现加了admob后混淆后,反编译生成的文件里面没发现任何admob相关的东西.
所以我怀疑混淆编译的时候根本没有找到admob.jar包.
不知道混淆第三方包还要配置什么.还是说admob.jar要放在哪个文件夹里才行?!我是用add external jar添加admob.jar的.
然后”property name=”admob-jar” value=”D:\\admob-sdk-android\\admob-sdk-android.jar””
“arg value=”-libraryjars ‘${admob-jar}’
是像这样用的绝对路径.
因为之前market上发布的程序发现被别人反编译改成他的应用又重新发布…所以现在比较急知道怎么预防这么轻松被反编译…
嗯,生成apk里要是没有admob的包的话,那可能就不是由于混淆部分设置不对导致的,看看其它部分的常规android编译target是不是有哪个要指定外部包的。
终于解决了…是compile的target里面指定的第三方包路径不对…就因为这样一个问题麻烦了楼主这么多天…真不好意思…谢谢谢谢
呵呵,那就恭喜你了
请问一个问题, 我用 SDK Tools R8 来执行 ant 的动作
可是都停在 -dex 的部份…貌似無法產生 classes.dex
不知道板主是否有遇到这样的问题
你是用我这篇文章里写的自动生成ant编译脚本编译就不能过么?还是默认生成的脚本可以过,但做了某些修改之后就不能过了?
先谢谢板竹的回复..
我用的是預設生成的 build.xml, 然后还自己把 platforms\android-3\ant\ant_rules_r2.xml 内容加到 build.xml 中
接著就直接运行 ant 来编译了.不過就都卡在 -dex 這部份
不知道版竹是否有在 SDK Tools 8 的環境中用 ant 編譯的經驗
sdk tools 8是最近更新的那个版本么?要是的话我有空去试一下。这之前你可以先这样试试:项目是用adt创建的话,先确认在ide里可以正常编译运行,然后试试生成ant脚本后不作任何修改的话,能不能编译。
我是用 Eclipse 来开发的, 同时装了google 的 ADT, 目前最新版本是 8.0.1
而 SDK 已经是到 2.3 版了
然后我用 Eclipse 创建一个新的 android 项目, 然后什么都没写的情况下..
就用 androud update project 的方式创建 buile.xml
然后再把 android-sdk\platforms\android-3\ant\ant_rules_r2.xml 内容加到 build.xml 中
最后就是直接运行 ant 编译…
整个动作只有这样…
如果版竹有空时,希望能指导一下
我把sdk tools更新到了8,然后试了一下,没有问题,这是我的脚本执行输出:
Buildfile: D:\Projects\Java\TestProj\build.xml
[setup] Android SDK Tools Revision 8
[setup] Project Target: Android 1.6
[setup] API level: 4
[setup]
[setup] ——————
[setup] Resolving library dependencies:
[setup] No library dependencies.
[setup] ——————
[setup]
[setup] Importing rules file: tools\ant\main_rules.xml
-debug-obfuscation-check:
-set-debug-mode:
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed…
-pre-build:
-resource-src:
[echo] Generating R.java / Manifest.java from the resources…
-aidl:
[echo] Compiling aidl files into Java classes…
-pre-compile:
compile:
[javac] Warning: com\gamexiang\TestProj\R.java modified in the future.
[javac] Compiling 1 source file to D:\Projects\Java\TestProj\bin\classes
-post-compile:
-obfuscate:
-dex:
Warning: Reference out.dex.jar.input.ref has not been set at runtime, but was found during
build file parsing, attempting to resolve. Future versions of Ant may support
referencing ids defined in non-executed targets.
[echo] Converting compiled files and external libraries into D:\Projects\Java\TestProj\bin\classes.dex…
-package-resources:
[echo] Packaging resources
[aapt] Creating full resource package…
[null] Warning: AndroidManifest.xml already defines debuggable (in http://schemas.android.com/apk/res/android); using existing value in manifest.
-package-debug-sign:
[apkbuilder] Creating GameAct-debug-unaligned.apk and signing it with a debug key…
debug:
[echo] Running zip align on final apk…
[echo] Debug Package: D:\Projects\Java\TestProj\bin\GameAct-debug.apk
BUILD SUCCESSFUL
Total time: 2 seconds
PS:我并没有对自动生成的ant编译脚本作任何修改。
怎么会有这样的差异呢?
我开发的环境是: Eclipse 3.5.1, Java SDK 1.6, Ant 1.8.1, Android SDK 2.3
能否麻烦版竹提供一下你使用的 build.xml 供小弟参考
我的build.xml就是用这篇文章里提到的”\android-sdk-windows\tools\android.bat update project -p . -t 3″自动生成的,没有作任何修改,你可以试试这个http://www.k-res.net/dl/SpriteMethodTest.rar,这是之前有朋友问我给作的一个例子,应该是没有问题的。
再有你试试用低版本的SDK试试,比如1.6 或 2.0的,不过感觉可能不是这个问题。
版主呀,想请教你个问题,混淆后如何打包呢?能告诉下吗?要详细些的,多谢谢!
使用ant的build.xml中直接包含打包过程,你只要提供打包需要用的签名文件就可以了,具体你可以参考一下我回复里给的SpriteMethodTest.rar。
谢谢你的回复啊,已经打包好了,想再请问下,我现在反编译我打包好的程序,class文件名是不是都是a,b,c,d…..这样的字母代替了我原来的class文件名??我看别人混淆过的好像都是这样子。不过我的还是我原先文件名。是不是我没混淆成功呢?但是输出是成功了
这个类名的问题是这样的,有一部分类如继承自activity的等,是需要程序提供给系统作为入口类性质的东西用的,像在manifest里指定的,这种接口等性质的类是不能过混淆的,否则被编译混淆改名之后与manifest里指定的信息不一致了。
不过这应该只是一小部分class,你要是所有类名都没变那你就看一下设置吧,或者检查一下反编译后的代码,比如成员变量名,函数名等经没经过混淆?
奇怪了,也没有被混淆,不知道是怎么回事,变量,函数名也是原来了。明明已经说混淆成功了,不知道哪里设置的有问题?
我是android2.2的,把你传的SpriteMethodTest.rar里的build.xml加在工程里,也是混淆成功,但反编译还是原来的。很奇怪classes文件夹下已经生成了混淆后的,可打包后还是原来的,还有有个-unsigned.apk不明白.真头疼
classes下生成的是经过成功混淆的话,那后面应该就是生成dex,然后打包了这2个过程了,你看看这两步有不设置错误的地方,比如生成dex的路径是不是proguard拆包混淆后的生成类路径等。
谢谢,我去看看,这个文件是签名用的吧
build.properties
key.store=D:\\Projects\\JAVA\\and_key
key.alias=k-res
这里后面的是签名文件的路径和别名吗?
签名出异常:
[signjar] jarsigner 错误: java.lang.RuntimeException: 密钥库装入: Invalid keystore format
[signjar] 输入密钥库的口令短语:
晕了呀,这点东西还没弄明白
这是你要你输入生成签名密钥时的密码
哦,看了下面的回复,弄明白了。
请问版竹, 你有引用額外的 ant_rules_r2.xml 吗?
你指的“引用”是对build.xml的修改么?
前面回复的那次sdk tools 8的测试时没有对自动生成的build.xml做任何修改,上面提到的SpriteMethodTest.rar里面是有做过修改的,加入了proguard混淆过程。
我之前的回复提到过让你试试用自动生成的build.xml不做任何修改看是否能顺利执行?
hi 博主 我用你的工程 测试了一下 编译成功 ,但装不了手机 呵呵 你遇到过这样的问题吗
我的输出如下:
Buildfile: F:\work\SpriteMethodTest\build.xml
[setup] Android SDK Tools Revision 6
[setup] Project Target: Android 1.6
[setup] API level: 4
-dirs:
[echo] Creating output directories if needed…
[mkdir] Created dir: F:\work\SpriteMethodTest\bin\classes
-resource-src:
[echo] Generating R.java / Manifest.java from the resources…
-aidl:
[echo] Compiling aidl files into Java classes…
compile:
[javac] Compiling 14 source files to F:\work\SpriteMethodTest\bin\classes
optimize:
[jar] Building jar: F:\work\SpriteMethodTest\temp.jar
[java] ProGuard, version 4.5.1
[java] Reading input…
[java] Reading program jar [F:\work\SpriteMethodTest\temp.jar]
[java] Reading library jar [F:\android-sdk-windows\platforms\android-4\android.jar]
[java] Initializing…
[java] Ignoring unused library classes…
[java] Original number of library classes: 2400
[java] Final number of library classes: 266
[java] Shrinking…
[java] Removing unused program classes and class elements…
[java] Original number of program classes: 28
[java] Final number of program classes: 22
[java] Obfuscating…
[java] Writing output…
[java] Preparing output jar [F:\work\SpriteMethodTest\optimized.jar]
[java] Copying resources from program jar [F:\work\SpriteMethodTest\temp.jar]
[delete] Deleting: F:\work\SpriteMethodTest\temp.jar
[delete] Deleting directory F:\work\SpriteMethodTest\bin\classes
[mkdir] Created dir: F:\work\SpriteMethodTest\bin\classes
[unzip] Expanding: F:\work\SpriteMethodTest\optimized.jar into F:\work\SpriteMethodTest\bin\classes
[delete] Deleting: F:\work\SpriteMethodTest\optimized.jar
-dex:
[echo] Converting compiled files and external libraries into F:\work\SpriteMethodTest\bin\classes.dex…
[echo]
-package-resources:
[echo] Packaging resources
[aaptexec] Creating full resource package…
-package-no-sign:
[apkbuilder] Creating SpriteMethodTest-unsigned.apk for release…
-release-check:
-release-nosign:
release:
—————
是不是这个文件配置的问题呢?
build.properties
key.store=D:\\Projects\\JAVA\\and_key
key.alias=k-res
这2个属性是什么意思呢?
生成的这个混淆包 SpriteMethodTest-unsigned.apk 装手机时认证失败
你要装真机得经过签名,那2个属性是我的签名证书文件,rar包里没有,你得修改这对属性为你自己的签名证书。
博主你QQ多少啊,能加好友不?我的39459291
抱歉,平时不方便用im…
啊,没关系,这样也好
我想问下,我自己定义的View在调用时出错,写在-keep里也是
12-21 06:43:33.919: ERROR/AndroidRuntime(3666): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stadyEnglish.activity/com.stadyEnglish.activity.dic.ShowContentActivity}: android.view.InflateException: Binary XML file line #49: Error inflating class com.stadyEnglish.view.YinBiaoView
12-21 06:43:33.919: ERROR/AndroidRuntime(3666): Caused by: android.view.InflateException: Binary XML file line #49: Error inflating class com.stadyEnglish.view.YinBiaoView
12-21 06:43:33.919: ERROR/AndroidRuntime(3666): Caused by: java.lang.NoSuchMethodException: YinBiaoView(Context,AttributeSet)
哦解决了,呼~
呵呵,多试几次,应该不是很难成功。
关键是现在ADT还不完善而且感觉google还没太重视到这块,估计过过插件完善了,就能像j2me那样一键混淆打包了。
其实大家都很感谢你,网上大概这样的帖子就你一个了。
可不可以这个类中的某个变量、方法不参与混淆,但其他的照常混淆呢??
http://hi.baidu.com/mklzdd/blog/item/22ac323df8d13ac99f3d62b6.html
这里有个proguard的参数列表,你可以看看有没有能控制你想实现的效果的,有的话直接在ant编译脚本中对应proguard混淆的target中加入对应的参数就行了,和keep那个类似
很奇怪为什么混淆后了,不能往sdcard写文件?
晕了,自己回答吧,写权限不小心被删掉了。
K-Res :你好!有一个问题想请教一下,我通过ant来打包android程序 打出来的包和eclipse打出来的大小差不多,但是安装之后 ant打出来的比eclipse打了两倍,我仔细检查了一下,发现在
Converting compiled files and external libraries into ${outdir}/${dex-file}…
中 引入的jar包也打包到了classes.dex 而eclipse打出来的classes.dex就没有引入的这个dx.jar 请问我如何修改才能不把dx.jar也打到我的classes.dex里呢?请赐教!Thanks
求助啊!
Converting compiled files and external libraries into ${outdir}/${dex-file}…
为什么我这么写运行之后,dx.jar就直接打到了我的classes.dex里了,我把 这一行删除 编译就通不过 提示 no resources specified。求解!
怎么发出去的都省略了,再发一遍
这个你先试试我前面回复里提供的那个测试混淆项目,看看结果正常么?
确定一下是配置文件的问题还是sdk tools的问题。
根据你的这个混淆的话没有问题,但是我的配置文件不是自动生成的,然后我这里是这么写的
Converting compiled files and external libraries into ${outdir}/${dex-file}…
我的问题是为什么引用了dx.jar就会把它打到包里了?现在我暂时计划混淆打包,只是想通过普通的方式编译出来classes.dex。
ant文件只用自动生成的话是没法混淆的,混淆的过程是在默认编译过程基础上添加修改的,你对照一下我的配置文件看看你是不是有写的不妥的地方。
感谢博主的帮助!
-package-no-sign:
[apkbuilder] Creating test for release…
构建失败
D:\eclipse-jee-helios-SR1-win32\workspace\test\build.xml:352: The following error occurred while executing this line:
D:\eclipse-jee-helios-SR1-win32\workspace\test\build.xml:217: java.lang.NullPointerException
-=============================
卡在这了
217就是<apkbuilder 那里
352是
bin里已经有了混淆过的dex和没混淆的APK
求助
apk证书路径名称相关属性设置检查一下,352行是不是签名的相关过程?
今天更新到SDK2.3又弄了半天 没搞定
试了下新SDK自带的混淆成功了 本来以为不能用到老版本(1.6)呢
(新开项目有 不知道咋加到老项目里 自己重建项目吧)
android1.5
………
………
\${out.classes.absolute.dir} not found. android1.5报这个错误,不知道是怎么回事???
jar basedir=”${out.classes.absolute.dir}” destfile=”temp.jar”/
java jar=”D:/proguard4.2/lib/proguard.jar” fork=”true” failonerror=”true”
jvmarg value=”-Dmaximum.inlined.code.length=32″/>
这个不知道是不是早期的SDK和现在新的有什么设置上的区别,你先试试直接在1.5的项目下用最开始的生成ant xml的方法不做任何修改看能不能通过编译。
楼主,,我老是出现这个问题
我用ant debug编译程序的时候报错:build.xml:49: taskdef class com.android.ant.SetupTask cannot be found 这个错误,网上说是项目目录中local.properties文件中的sdk-location SDK的位置不对,可我看了一下,位置没问题,现在找不到原因了
你是用自动生成ant编译脚本的方法后执行编译就出这个错么?自动生成的ant脚本不需要配置sdk路径,已经自动生成好了,你确认一下是不是你的sdk的问题。
嗯。是自动生成的,我看了下路径没问题。
我用的1.6的SDK,ANT版本是1.8.2,JDK 1.6 和这些版本有关系没。。搞得我很郁闷,,
默认生成的xml都不能正常编译的话有可能是android sdk的问题,这样你用echo在ant的xml里打印一下各个环境变量看看值对么?比如${sdk.dir}这些…
我快晕死了。楼主大哥。。
我刚试了一下用UPDATE,对以前的项目生成一个build.xml,可是生成以后刷新项目之后(在Eclipse里刷新看的),好多错误。
项目里的R那个自动生成的文件,都显示灰的。。打不开,,资源都引用那些全有问题了。
快疯啦。。这个ANT快搞死我了。。
楼主大哥。。
我刚试了一下用UPDATE,对以前的项目生成一个build.xml,可是生成以后刷新项目之后(在Eclipse里刷新看的),好多错误。
项目里的R那个自动生成的文件,都显示灰的。。打不开,,资源都引用那些全有问题了。
快疯啦。。这个ANT快搞死我了。。
楼主大哥。。
你这个不会是开发环境的问题吧?你确认android sdk和eclipse IDE都运行正常么?update生成xml后应该是不影响当前项目的IDE方式编译的,你不是还没加builder了么?
我是用你给你那个例子做的。。
但是它报这个错误
aaptexec doesn’t support the basename attribute
楼主,我的邮箱344452454@qq.com,, 你要也用QQ,就加下我Q,
要是不用,有时间给我发个邮件,,请教一个这个ANT,
我帮你搜索了一下,这个错可能是你用的sdk版本和你的target版本不一致导致的,看这朋友:http://www.expert.tc/topic.php?id=129921
x 说:
2010年12月27日 于 9:54 下午
-package-no-sign:
[apkbuilder] Creating test for release…
构建失败
D:\eclipse-jee-helios-SR1-win32\workspace\test\build.xml:352: The following error occurred while executing this line:
D:\eclipse-jee-helios-SR1-win32\workspace\test\build.xml:217: java.lang.NullPointerException
-=============================
卡在这了
217就是<apkbuilder 那里
352是
bin里已经有了混淆过的dex和没混淆的APK
求助
回复
K-Res 说:
2010年12月27日 于 9:59 下午
apk证书路径名称相关属性设置检查一下,352行是不是签名的相关过程?
回复
x 说:
2010年12月28日 于 10:34 上午
今天更新到SDK2.3又弄了半天 没搞定
试了下新SDK自带的混淆成功了 本来以为不能用到老版本(1.6)呢
(新开项目有 不知道咋加到老项目里 自己重建项目吧)
回复
======================================================================
请问楼主,apk证书路径名称属性在哪设置的?我也遇到这问题了,编译出了N多问题,愁死个人了。有没有相关资料学习下
你好,看看我最近写的新版SDK和ADT整合了Proguard后的混淆方法吧(http://blog.k-res.net/?p=819),比改xml方便的多。
很抱歉打扰。我使用的是android2.1的sdk,不能使用新版本的工具。
有个问题还想问一下您。
我编译和混淆都通过了,但到最后打包时出了问题,提示如下:
-package-no-sign:
[apkbuilder] WARNING: Using deprecated ‘basename’ attribute in ApkBuilderTask.Us
e ‘apkfilepath’ (path) instead.
[apkbuilder] WARNING: Using deprecated inner element in ApkBuilderTask.Us
e instead.
BUILD FAILED
D:\workspace\mcube1.2obf\build.xml:380: The following error occurred while execu
ting this line:
D:\workspace\mcube1.2obf\build.xml:215: java.lang.NullPointerException
查了一些英文资料,有人回复如下:
You are missing the new resourcefile attribute on apkbuilder. Also,
the value you are using for apkfilepath looks weird as well. Did you
just copy it from what you were using for the old basename attribute?
It probably won’t break due to that, but if you want the same behavior
as before you should append “-debug.apk” or “-unsigned.apk” to the
value you are passing to the replacement attribute depending on if you
are signing or not.
我没看懂该怎么改,用了楼主的SpriteMethodTest包里的build.xml也出现同样的问题,麻烦楼主帮忙看看,多谢啦
你可能没理解我说的新版SDK的意思,不是让你换target platform(比如2.1换2.2或2.3),而是更新SDK里的编译工具部分platform-tools,这部分的更新不影响你的2.1系统版本的对应,自己用ant修改xml相对整合的方法来说难度较大,需要配合修改不少参数,容易出问题,所以能用新的整合Proguard的方法还是用新的比较好。
至于你的输出,出错的地方不是打包的2个warning,而是后面提到的build.xml:380和build.xml:215,这两处,检查一下吧。
build.xml:380和build.xml:215 就是对应的apkbuilder的地方。恩,我试试用新的编译工具,谢谢你的回复
我当前的apkbuilder属性如下:
粘不上?
apkbuilder
outfolder=”${out.absolute.dir}”
basename=”${ant.project.name}”
signed=”@{sign.package}”
verbose=”${verbose}”
file path=”${intermediate.dex.file}”/
sourcefolder path=”${source.absolute.dir}”/
nativefolder path=”${native.libs.absolute.dir}”/
jarfolder path=”${external.libs.absolute.dir}”/
extra-jars/
/apkbuilder 因为粘贴不上,去掉了箭头符号
问一下,我的编译后出现Buildfile: E:\works\svn\myother1\build.xml
[setup] Android SDK Tools Revision 6
[setup] Project Target: Android 1.6
[setup] API level: 4
[setup] WARNING: Attribute minSdkVersion in AndroidManifest.xml (3) is lower than the project target API level (4)
-dirs:
[echo] Creating output directories if needed…
[mkdir] Created dir: E:\works\svn\myother1\bin\classes
-resource-src:
[echo] Generating R.java / Manifest.java from the resources…
-aidl:
[echo] Compiling aidl files into Java classes…
compile:
[javac] Compiling 2 source files to E:\works\svn\myother1\bin\classes
optimize:
[jar] Building jar: E:\works\svn\myother1\temp.jar
[java] ProGuard, version 4.4
[java] Reading input…
[java] Reading program jar [E:\works\svn\myother1\temp.jar]
[java] Reading library jar [D:\biancheng\android-sdk_r04-windows_\android-sdk-windows\platforms\android-1.6\android.jar]
[java] Initializing…
[java] Ignoring unused library classes…
[java] Original number of library classes: 2400
[java] Final number of library classes: 149
[java] Shrinking…
[java] Removing unused program classes and class elements…
[java] Original number of program classes: 6
[java] Final number of program classes: 1
[java] Obfuscating…
[java] Writing output…
[java] Preparing output jar [E:\works\svn\myother1\optimized.jar]
[java] Copying resources from program jar [E:\works\svn\myother1\temp.jar]
[delete] Deleting: E:\works\svn\myother1\temp.jar
[delete] Deleting directory E:\works\svn\myother1\bin\classes
[mkdir] Created dir: E:\works\svn\myother1\bin\classes
[unzip] Expanding: E:\works\svn\myother1\optimized.jar into E:\works\svn\myother1\bin\classes
[delete] Deleting: E:\works\svn\myother1\optimized.jar
-dex:
[echo] Converting compiled files and external libraries into E:\works\svn\myother1\bin\classes.dex…
[echo]
-package-resources:
[echo] Packaging resources
[aaptexec] Creating full resource package…
-package-no-sign:
[apkbuilder] Creating myother1-unsigned.apk for release…
-release-check:
-release-nosign:
release:
,请问该怎么办啊,我是把你的那个build。xml,把项目名称和proguard的路径替换一下的,谢谢啊
你好,新版本的ADT和SDK Tools已经整合了proguard混淆支持,直接修改工程配置文件就可以了,推荐你用新方法试试:http://blog.k-res.net/?p=819,比改xml方便的多。
我的qq是1149598411,谢谢啊
问一下,如果引用外部jar包,该怎么办啊,能不能写一个有外部jar包的android项目给共享下,谢谢啊,
请教一下关于sdk升级版本之后,代码混淆出现下面的错误:aaptexec doesn’t support the basename attribute
您在上面提到过是因为这个原因造成的:sdk版本和你的target版本不一致导致,找了很多的地方没有找到解决的方法,您在下面给出的链接打不开。请问有什么解决的方法么
你好,
这篇介绍的混淆方法已经是比较旧的做法了,新版本的ADT和SDK Tools已经整合了proguard混淆支持,直接修改工程配置文件就可以了,推荐你用新方法试试:http://blog.k-res.net/?p=819。
你好,我碰到一个比较奇怪的问题,我的项目在eclipse中都正常,没有错误,但是用ant编译的时候,就出现这种问题, [exec] resdrawableselector_select_button.xml:7: error: Error: No resource found that matchesthe given name (at ‘drawable’ with value ‘@drawable/common_blue_checkbox_off’). [exec] resdrawableshape_arrow.xml:4: error: Error: No resource found that matches the given name (at ‘drawable’ with value ‘@drawable/arrow_pressed’). [exec] resdrawableshape_arrow.xml:7: error: Error: No resource found that matches the given name (at ‘drawable’ with value ‘@drawable/arrow_normal’).编译到这一步出现的问题Packaging resources and assets…
你检查一下提示的几个drawable下的图片资源看是不是前面处理出错了导致没生成对应的资源.