我知道周围有很多这样的主题,但在我的情况下似乎没有任何帮助,也没有完全描述。最好的类似是 在正确的道路下找不到AAPT.

我的问题是,我可以使用Eclipse进行整个晚上的编程,编译和使用设备,然后突然间,我为当前的项目和当然R.Java(正确)生成了“错误执行AAPT”。然后,我重新开始日食,一切都消失了。但是,我平均每天看到一次。

我最近切换到AMD64,并安装了最新的Android-2.3 SDK和匹配工具。我知道现在有一个Platform-tools文件夹,该文件夹具有AAPT版本,该版本应该独立使用SDK版本。首先,我将此目录添加到了我的路径中,如SDK网站上的指示。我还尝试过不将其添加到我的路径上,并制作链接平台/Android-9/Tools,以便每个SDK版本都可以使用其自己的旧副本。不用说,Platform-Tools/AAPT在那里并且具有正确的权限,并且我能够随时在命令行上执行它。

当我编写错误的XML文件或分类时,并正确遇到错误时,我会看到一条额外的行,上面写着“ AAPT: /lib32/libz.so.1:无可用的版本信息”。我正在运行最近的Gentoo Linux系统。我已经安装了所有内容以支持AMD64上的X86,但是可以肯定的是,已经重新出现Emul-Linux-X86-Baselibs和Zlib。问题仍然存在。我确实看到了一些 页面 那个Zlib错误的恐怖症,但我不确定这是否相关。我意识到我不在参考ubuntu平台上,但是肯定的区别不可能那么好吗?

它很可能是AAPT或工具本身的错误。为什么突然停止工作?我还体验到,R.Java中的ID是不正确的,即简单的FindViewById()代码会因为一次混合ID而提供ClassCastExceptions,然后在没有任何更改的情况下完美地工作,而BU仅一个“干净的项目”,在此之后失败的AAPT。

最后,我在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错误视图中的完整详细信息)。在这里也请注意,我只能重新启动日食,并且至少一会儿可以再次导出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
有帮助吗?

解决方案 2

实际问题似乎是AAPT过程要求不合理的内存数量。记忆是,我的系统具有SSD HD,并且(因此)没有交换(但是RAM 4GB)没有,在已经很大的Eclipse过程旁边。

解决方案是设置:

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

将交换设置如此之低,以至于实际上从未使用过互换。这也是该解决方案的最大缺点。除了满足内核的计算之外,您将在硬盘上有一个2GB的文件(也许是罕见的极低记忆,不确定0次交换是如何工作的?)。据说在SSD上使用交换是一个坏主意,因为许多写作会缩短SSD的寿命。

以下文章导致我解决了解决方案。

如何求解“ java.io.ioexception:error = 12,无法分配内存”调用运行时#exec()?

http://webcache.googleusercontent.com/search?q=cache:2nsdg-wivsaj:wiki.apache.org/cassandra/cassandra/operations+joio.io.io.io.io.ioexception+insexception+insexception+insuffifics+sysuffifice+system+system+resources+resources+resources+no+swapp.cdp.cd&cd = nl = nl usecct = clnk&gl = be&lr = lang_en | lang_nl

请注意,这里不是Android Dev工具,也不是APAPT。我本可以在任何地方看到这个问题。但是,我确实认为,由于Eclipse工具包的巨大(和增加),也许还有一些实现细节,例如使用叉()使用叉子(),此问题在这里有很高的可能性,也适用于其他患有SSD的人。

其他提示

该错误确实是在Emul-Linux的32bit 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

您可以检查自己的32bit Lib的自定义构建是否具有Verdef字段 - 我的功能,我想知道为什么它在Emul -Linux发行版中缺少。

问候,cmuelle8

PS:有时由计算机程序打印的错误消息正确。

增加Studio64.vmoptions或Studio的内存。相应地,它对我有用,我只是将其增加了一倍,将几乎三倍,例如XMS 512,XMX 4096,-XX:MaxPermsize = 720m = 720m,xx:ReservedCodecachesize = 128m。

希望对将来对某人有用。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top