突然执行aapt的错误

时间:2010-12-31 03:55:15

标签: android aapt libz

我知道有很多这些主题,但在我的案例中似乎没有任何帮助,也没有完全描述。最相似的是aapt not found under the right path

我的问题是我可以使用Eclipse进行整个晚上的编程,编译和使用我的设备,然后我突然得到“当前项目的错误执行aapt”并且当然没有(正确)生成R.java了。然后我重新启动Eclipse,一切都消失了。我平均每天都会看到这一次。

我最近切换到amd64并安装了最新的Android-2.3 SDK和匹配工具。我知道现在有一个platform-tools文件夹,它有一个应该独立运行SDK版本的aapt版本。起初我按照SDK网站上的说明将此目录添加到我的PATH中。我也试过不把它添加到我的路径并制作链接平台/ android-9 /工具,以便每个SDK版本都可以使用它自己的旧版本。毋庸置疑,platform-tools / aapt已经存在且具有正确的权限,我可以随时在命令行上执行它。

当我写错误的xml文件或排序,并适当地得到错误时,我看到一条额外的行,上面写着“aapt:/lib32/libz.so.1:没有可用的版本信息”。我正在运行最近的Gentoo linux系统。我已经安装了所有东西来支持amd64上的x86,但是为了确保重新出现了emul-linux-x86-baselibs和zlib。问题依然存在。我确实看到一些pages对某些zlib错误构成恐怖,但我不确定这是否相关。我意识到我不是在参考Ubuntu平台上,但肯定差别不是那么大?

很可能是aapt或工具本身的错误。它为什么突然停止工作?我也经历过R.java中的id是不正确的,即简单的findViewById()代码会给出ClassCastExceptions因为混合id一次,然后完美地工作而没有任何变化只是一个“干净的项目”,在之后失败了。

最后,我在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时,我遇到了另一条错误消息(来自Eclipse错误视图的完整详细信息),关于我以前从未见过的aapt。另请注意,我可以重新启动Eclipse并且可以毫无问题地再次导出apks,至少在一段时间内。

我开始认为这与我的系统内存不足有关。消息“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 个答案:

答案 0 :(得分:10)

这个bug确实存在于emul-linux的32位libz.so.1.2.3 !!

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

以下是在emul-linux-baselibs的更新版本发布之前所需的步骤:

  • 获取zlib(1.2.5没问题)
  • 解包
  • 编辑配置
--- 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"
  • 使
  • 将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位lib是否有VERDEF字段 - 我的确如此,我想知道为什么它在emul-linux发行版中缺失..

的问候, cmuelle8

ps:有时计算机程序打印的错误信息是正确的..

答案 1 :(得分:8)

实际问题似乎是aapt进程要求不合理的内存量。内存,我的系统与SSD HD和(因此)没有交换(但4GB的RAM)没有,旁边已经很大的日食过程。

解决方案是设置:

echo 1 > /proc/sys/vm/overcommit_memory

阅读下面的文章,但我的理解是Linux内核存在缺陷,并且在预测新进程需要多少内存方面不完善。该标志允许系统启动任何进程,关于它所询问的内存量。请注意,在实践中,aapt永远不会使用这么多内存。看起来eclipse进程的大小(在我的情况下例如2GB)是估计值,并且它被添加到正在使用的任何RAM中(2GB eclipse + 0.5GB其他),这超过了我的4GB RAM。 Aapt只会使用2GB的一小部分,但计算失败。

显然允许这种过度使用的缺点是,当内存不足时,内核没有干净的解决方案,并且会直接杀死进程。

另一种解决方案是使用交换,在我的情况下是交换文件,因为我没有预见到交换分区,然后最好具有非常低的交换。你的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文件,除了满足内核的计算(可能是罕见的极低内存,不确定0 swappiness如何工作?)。据说在SSD上使用交换是一个坏主意,因为许多写操作会缩短SSD的使用寿命。

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

How to solve "java.io.IOException: error=12, Cannot allocate memory" calling 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

请注意,这不是故障,也不是Android开发工具。我可以在任何地方看到这个问题。我确实认为,由于eclipse工具包的巨大(和增加)大小,可能与一些实现细节耦合,例如使用fork()?,这个问题在这里出现的可能性非常高,对其他拥有SSD的人。

答案 2 :(得分:0)

增加studio64.vmoptions或studio.vmoptions上的内存相应它对我有用,我只是将它增加到一半,几乎是3倍,例如Xms 512,Xmx 4096,-XX:MaxPermSize = 720m,XX:ReservedCodeCacheSize = 128米。

希望对未来的某人有用。

答案 3 :(得分:0)

顺便说一句,如果您使用的是Windows,您的病毒扫描程序可能会删除aapt.exe(这就是Avast Antivirus在我的情况下所做的事情)