14

我知道周围有很多这些主题,但似乎对我的情况没有帮助,也没有准确描述。最好的类似是aapt not found under the right path

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

我最近切换到 amd64 并安装了最新的 Android-2.3 SDK 和匹配工具。我知道现在有一个平台工具文件夹,它有一个 aapt 版本,应该独立工作 SDK 版本。起初,我已按照 SDK 网站上的说明将此目录添加到我的 PATH 中。我也尝试过不将它添加到我的路径并制作链接平台/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,然后在没有任何更改的情况下完美地工作,只有一个“干净的项目”,在之后一个失败的 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 年 1 月 6 日更新:

我又增加了一些知识。当我最近尝试导出已签名的 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

4 回答 4

10

该错误确实在 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
+++ 配置 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; 然后
   抄送=“$cc”
- SFLAGS="${CFLAGS--O3} -fPIC"
- CFLAGS="${CFLAGS--O3}"
+ SFLAGS="${CFLAGS--O3} -fPIC -m32"
+ CFLAGS="${CFLAGS--O3} -m32"
   如果测试 $build64 -eq 1; 然后
     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 位库的自定义构建是否具有 VERDEF 字段 - 我的有,我想知道为什么在 emul-linux 发行版中缺少它。

问候, cmuelle8

ps: 有时候电脑程序打印的错误信息是对的..

于 2011-02-25T02:22:01.960 回答
8

实际问题似乎是 aapt 进程要求的内存量不合理。我的系统带有 SSD HD 并且(因此)没有交换(但 4GB 的 RAM)没有内存,在已经很大的 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

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

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

如何解决“java.io.IOException: error=12, Cannot allocate memory”调用 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 的人。

于 2011-01-09T18:48:19.547 回答
0

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

于 2014-11-24T16:59:58.357 回答
0

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

希望对未来的人有用。

于 2014-03-06T22:12:46.810 回答