質問
こういったトピックがたくさんあることは知っていますが、私の場合には役に立たないようで、正確に説明しているものはありません。最もよく似ているのは、 aapt が正しいパスの下に見つかりません.
私の問題は、夕方ずっと Eclipse を使用してプログラミング、コンパイル、デバイスの使用を行っているのに、突然現在のプロジェクトで「aapt の実行エラー」が発生し、当然のことながら R.java が (適切に) 生成されなくなることです。その後、Eclipse を再起動すると、すべてが消えます。ただし、平均して 1 日に 1 回はこれを見ます。
最近 amd64 に切り替え、最新の Android-2.3 SDK と一致するツールをインストールしました。SDK バージョンとは独立して動作する aapt バージョンを含む platform-tools フォルダーが存在することはわかっています。最初に、SDK Web サイトの指示に従って、このディレクトリを PATH に追加しました。また、すべての SDK バージョンが独自の古いコピーを使用できるように、パスに追加せず、リンク platforms/android-9/tools を作成しようとしました。言うまでもなく、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
解決 2
実際の問題は、apt プロセスが不当な量のメモリを要求していることのようです。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 の一部のみを使用しますが、計算は失敗します。
このオーバーコミットを許可することの欠点は、メモリが不足しているときにカーネルにはクリーンな解決策がなく、プロセスを強制終了するだけであることです。
もう 1 つの解決策は、スワップを使用することです。私の場合はスワップ パーティションを予期していなかったのでスワップ ファイルを使用し、できれば非常に低いスワップ性を使用します。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」の解決方法:エラー=12、メモリを割り当てられません」Runtime#exec() を呼び出していますか?
ここで問題があるのは aapt ではなく、Android 開発ツールも問題ではないことに注意してください。この問題はどこでも見たことがあります。ただし、Eclipse ツールキットのサイズが巨大 (そして増大) していることと、おそらく fork()? の使用などの実装の詳細が原因で、この問題がここで表面化し、他のツールでも表面化する可能性が非常に高いと思います。 SSDを搭載している人。
他のヒント
バグは確かに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.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フィールドがあるかどうかを確認できます。
よろしく、cmuelle8
PS:コンピュータープログラムによって印刷されたエラーメッセージが正しい場合があります。
Studio64.vmoptionsまたはstudio.vmoptionsのメモリを増やして、それが私のために機能したので、たとえばXMS 512、XMX 4096、-XX:MaxPermsize = 720M、XX:ReservedCodeCachesize = 128Mなど、ほぼ3回、すべてを2倍に増やしました。
希望は将来の誰かにとって有用です。
ちなみに、Windowsを使用している場合、ウイルススキャナーがaapt.exeを削除することが発生する可能性があります(私の場合、アバストアンチウイルスがしたことです)