执行aapt时出错,突然之间

14
我知道这方面的话题很多,但似乎没有一个能够帮助到我的情况或者准确地描述我的问题。最相似的一个是找不到正确路径下的aapt
我的问题是,我可能会在Eclipse上整个晚上进行编程、编译和使用我的设备,然后突然出现“执行aapt错误”的当前项目错误,当然R.java也不能(正确)生成了。然后我重新启动Eclipse,一切都消失了。然而,我平均每天都会看到这个问题。
我最近切换到了amd64,并安装了最新的Android-2.3 SDK和匹配的工具。我知道现在有一个platform-tools文件夹,其中包含一个aapt版本,应该可以独立于SDK版本工作。起初,我按照SDK网站的指示将此目录添加到了我的PATH中。我还尝试过不将其添加到我的路径中,并创建一个链接platforms/android-9/tools,以便每个SDK版本都可以使用自己的旧副本。不用说,platform-tools/aapt在那里并且有正确的权限,我随时都能在命令行上执行它。
当我写一个有错误的xml文件或其他类型的文件时,适当地得到一个错误提示。我会看到一行额外的内容,上面写着"aapt: /lib32/libz.so.1: no version information available"。我正在运行最近的gentoo linux系统。我已经安装了所有支持x86在amd64上的东西,但还是重新安装了emul-linux-x86-baselibs和zlib以确保。问题仍然存在。我看到一些页面上对一些zlib bug的恐惧描述,但我不确定是否相关。我意识到我不在参考Ubuntu平台上,但肯定差异不会那么大吧?
这很可能是aapt或工具本身的bug。为什么它突然停止工作呢?我也遇到了R.java中的id错误,即简单的findViewById()代码会因为混合的id而导致ClassCastExceptions,一旦失败的aapt后,只需要进行"clean project"就可以完美地工作。
最后,我运行了一些关于aapt的命令,似乎没有添加任何额外的信息:
#ldd aapt
./aapt: /lib32/libz.so.1: no version information available (required by ./aapt)
 linux-gate.so.1 =>  (0xffffe000)
 librt.so.1 => /lib32/librt.so.1 (0x4f864000)
 libpthread.so.0 => /lib32/libpthread.so.0 (0x4f849000)
 libz.so.1 => /lib32/libz.so.1 (0xf7707000)
 libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/32/libstdc++.so.6 (0x415e9000)
 libm.so.6 => /lib32/libm.so.6 (0x4f876000)
 libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0x4fac6000)
 libc.so.6 => /lib32/libc.so.6 (0x4f5ed000)
 /lib/ld-linux.so.2 (0x4f5ca000)

#file aapt
aapt: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

请问我的配置有什么问题吗?是不是出现了错误(如果没有,请重新报告)?

更新于2010-01-06:

我获得了更多的知识。最近我尝试导出签名的apk时,遇到了另一个我以前没有见过的关于aapt的错误信息(来自Eclipse错误视图的完整详细信息)。同样要注意的是,我可以重启Eclipse,然后再次导出apk而没有任何问题,至少可以持续一段时间。

我开始认为这与我系统上的内存不足有关。"onvoldoende geheugen beschikbaar"这个信息意味着"内存不足"。

当我在转储HPROF文件时,在DDMS中也看到了内存不足的错误。

以下是错误日志(简略版):

!ENTRY com.android.ide.eclipse.adt 4 0 2011-01-05 23:11:16.097
!MESSAGE Export Wizard Error
!STACK 1
org.eclipse.core.runtime.CoreException: Failed to export application
 at com.android.ide.eclipse.adt.internal.project.ExportHelper.exportReleaseApk(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.doExport(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.access$0(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard$1.run(Unknown Source)
 at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: com.android.ide.eclipse.adt.internal.build.AaptExecException: Error executing aapt. Please check aapt is present at /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platform-tools/aapt
 at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeAapt(Unknown Source)
 at com.android.ide.eclipse.adt.internal.build.BuildHelper.packageResources(Unknown Source)
 ... 5 more
Caused by: java.io.IOException: Cannot run program "/opt/android-sdk/android-sdk-linux_x86-1.6_r1/platform-tools/aapt": java.io.IOException: error=12, Onvoldoende geheugen beschikbaar
...
Caused by: java.io.IOException: java.io.IOException: error=12, Onvoldoende geheugen beschikbaar
...
!SUBENTRY 1 com.android.ide.eclipse.adt 4 0 2011-01-05 23:11:16.098
!MESSAGE Failed to export application
!STACK 0
com.android.ide.eclipse.adt.internal.build.AaptExecException: Error executing aapt. Please check aapt is present at /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platform-tools/aapt
 at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeAapt(Unknown Source)
 at com.android.ide.eclipse.adt.internal.build.BuildHelper.packageResources(Unknown Source)
 at com.android.ide.eclipse.adt.internal.project.ExportHelper.exportReleaseApk(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.doExport(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.access$0(Unknown Source)
 at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard$1.run(Unknown Source)
 at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: java.io.IOException: Cannot run program "/opt/android-sdk/android-sdk-linux_x86-1.6_r1/platform-tools/aapt": java.io.IOException: error=12, Onvoldoende geheugen beschikbaar
...
Caused by: java.io.IOException: java.io.IOException: error=12, Onvoldoende geheugen beschikbaar
4个回答

10

这个错误确实在emul-linux的32位libz.so.1.2.3中!

我自己构建了一个32位的libz版本,它可以工作 - aapt不会抛出上述错误。如果您正在使用gentoo系统-所有emul-linux-x86-baselibs的libz版本都有此问题(目前为止是20100915-r1和20110129)。

以下是更新版本的emul-linux-baselibs推出之前您需要执行的步骤:

  • 获取zlib(1.2.5是可以的)
  • 解压
  • 编辑configure
--- configure.old       2011-02-25 03:03:37.739491008 +0100
+++ configure   2011-02-25 03:03:51.760491008 +0100
@@ -105,8 +105,8 @@
if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then CC="$cc" - SFLAGS="${CFLAGS--O3} -fPIC" - CFLAGS="${CFLAGS--O3}" + SFLAGS="${CFLAGS--O3} -fPIC -m32" + CFLAGS="${CFLAGS--O3} -m32" if test $build64 -eq 1; then CFLAGS="${CFLAGS} -m64" SFLAGS="${SFLAGS} -m64"
  • make
  • 将libz.so.1.2.5移动到/lib32

问题是,您自己编译的64位版本在ELF头中具有以下字段:

  [ 5] .gnu.version      VERSYM           00000000000017be  000017be
  [ 6] .gnu.version_d    VERDEF           0000000000001890  00001890
  [ 7] .gnu.version_r    VERNEED          00000000000019e8  000019e8

当前的emul-linux-x86-baselibs提供的32位版本缺少VERDEF字段,它只包含:

  [ 4] .gnu.version      VERSYM          00000d9c 000d9c 0000b4 02   A  2   0  2
  [ 5] .gnu.version_r    VERNEED         00000e50 000e50 000050 00   A  3   1  4

您可以检查自己定制的32位库是否具有VERDEF字段 - 我的库中有此字段,我想知道为什么emul-linux发行版中缺少此字段...

祝好, cmuelle8

附注:有时计算机程序打印的错误消息是正确的...


Christian,干得好!但是这只解决了一个方面的问题,对吧?也就是“没有可用的版本信息”。在我的答案中,我展示了更大的问题与内存有关。请大家也给这个答案点赞! - pjv
好的,OP 也有内存问题 - OP 同样在使用 1.6 平台工具 - 我在使用 3.0 ... 到目前为止我还没有遇到过内存问题,只是遇到了 libz 的问题,导致 32 位 aapt 无法运行。解决更新 emul-linux-x86-baselibs 的另一个方法就是谷歌提供 64 位的 Android 开发工具。 - Christian
иҝҷеҜ№жҲ‘еңЁCentOS 6пјҲx86-64пјүдёӢи§ЈеҶідәҶй—®йўҳгҖӮжҲ‘дёҚеҫ—дёҚдёӢиҪҪzlibпјҲ1.2.7пјүжәҗд»Јз Ғ并дҪҝз”ЁCFLAGS=-m32 ./configureзј–иҜ‘е’Ңе®үиЈ…е®ғпјҢ然еҗҺдҪҝз”Ёsudo make installгҖӮеңЁsudo ldconfigд№ӢеҗҺпјҢaaptеҒңжӯўжҠұжҖЁгҖӮ - trojanfoe

8
实际问题似乎是aapt进程要求过多的内存。我的系统只有SSD硬盘和4GB内存(因此没有交换分区),再加上已经很大的eclipse进程,无法满足这种需求。
解决方法是设置:
echo 1 > /proc/sys/vm/overcommit_memory

请阅读以下文章,但我的理解是Linux内核存在缺陷,在预测新进程所需内存方面不完善。此标志允许系统启动任何进程,无论它正在请求多少内存。请注意,实际上aapt永远不会使用这么多内存。似乎eclipse进程的大小(例如我的情况下为2GB)是估计值,并将其添加到正在使用的任何RAM中(2GB eclipse + 0.5GB其他),超过了我的4GB RAM。Aapt只会使用其中一小部分2GB,但计算失败。
允许这种超额承诺的缺点显然是当内存不足时内核没有清洁的解决方案,只会杀死进程。
另一个解决方案是使用交换空间,在我的情况下是交换文件,因为我没有预见到交换分区,最好具有非常低的swappiness。您的Linux手册应该告诉您如何做,但总之(这仅用于快速测试,您应该设置您的/etc/fstab):
dd if=/dev/zero of=/swap bs=512 count=4M # = 2GB swapfile
mkswap /swap
swapon /swap

echo 0 > /proc/sys/vm/swappiness

将swappiness设置得如此之低,实际上使得交换空间永远不会被使用。这也是此解决方案的最大缺点。您将在硬盘上拥有一个2GB的文件,您永远不会使用它,除了满足内核的计算(也许极少数情况下出现极低的内存时会用到?)。在SSD上使用交换空间被认为是一个坏主意,因为频繁写入会缩短SSD的寿命。

以下文章引导我找到了解决方案。

如何解决“java.io.IOException:error=12,无法分配内存”调用Runtime#exec()的问题?

http://webcache.googleusercontent.com/search?q=cache:2NSdg-wIVsAJ:wiki.apache.org/cassandra/Operations+java.io.IOException+insufficient+system+resources+no+swap&cd=4&hl=nl&ct=clnk&gl=be&lr=lang_en|lang_nl

请注意,这里出现问题的不是aapt,也不是Android开发工具。我认为这个问题可能会在任何地方出现。然而,由于Eclipse工具包的巨大(并且不断增长)大小,再加上一些实现细节,比如使用fork(),这个问题很有可能在这里浮出水面,也可能影响其他使用SSD的人。

请注意,我的 1.5 年旧的固态硬盘突然在一周前死了。这可能与我使用 Eclipse 无关,但仍然让人担忧。 - pjv
谢谢提醒。由于某种原因,overcommit_memory的设置没有生效,现在我无法更改/proc/sys/vm中的任何标志,即使是root用户也不行。作为一种解决方法,我只好将虚拟机上的交换分区扩大到3GB,目前看来系统运行良好。 - Andrew

0

顺便说一句,如果你使用的是Windows系统,就有可能会发生你的病毒扫描器删除aapt.exe文件的情况(在我的电脑上,Avast Antivirus就出现了这种情况)


0
增加 studio64.vmoptions 或者 studio.vmoptions 的内存,我增加了双倍,几乎是三倍,例如 Xms 512,Xmx 4096,-XX:MaxPermSize=720m,XX:ReservedCodeCacheSize=128m,这对我有用。
希望对未来的某个人有用。

是的,你实际上正在解决一个微不足道的问题,而在SO上有许多重复的问题(请参见我上面问题第一段中的链接)。我的问题有相同的症状,但原因更加复杂,因此解决方案也更加复杂。这不是我们在这里感兴趣的答案。 - pjv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接