Ошибка, выполняющая aapt, внезапно
Я знаю, что есть много этих тем, но ничто не помогает в моем случае и не описывает его точно. Самый лучший из них - aapt не найден под правильным путем.
Моя проблема заключается в том, что я могу использовать Eclipse для всего вечернего программирования, компиляции и использования своего устройства, а затем вдруг получаю "ошибку, выполняющую aapt" для моего текущего проекта и, конечно, R.java не (правильно) сгенерирован больше. Затем я перезапускаю Eclipse, и все уходит. Я вижу это раз в день в среднем, однако.
Недавно я перешел на amd64 и установил последнюю версию Android-2.3 SDK и соответствующие инструменты. Я знаю, что теперь есть папка с инструментальными средствами, в которой есть версия aapt, которая должна работать независимо от версии SDK. Сначала я добавил этот каталог в свой PATH, как указано на веб-сайте SDK. Я также старался не добавлять его на свой путь и создавать платформы ссылок /android -9/tools, чтобы каждая версия SDK могла использовать ее собственную старую копию. Само собой разумеется, что у платформы-tools/aapt есть и есть правильные разрешения, и я смог выполнить ее в командной строке в любое время.
Когда я пишу неисправный xml файл или сортирует, и соответственно получаю сообщение об ошибке, я вижу дополнительную строку, в которой говорится: "aapt:/lib32/libz.so.1: нет информации о версии". Я запускаю недавнюю систему Linux Gentoo. У меня есть все, что было установлено для поддержки x86 на amd64, но для повторного появления emul-linux-x86-baselibs и zlib. Проблема сохраняется. Я вижу некоторые страницы, которые поражают ужасы некоторых ошибок zlib, но я не уверен, что это связано. Я понимаю, что я не на платформе Ubuntu, но, конечно, разница не может быть такой большой?
Это может быть ошибкой в apapt или самих инструментах. Почему это вдруг перестанет работать? Я также вижу, что идентификаторы в R.java были неправильными, а именно, что простой код findViewById() выдавал ClassCastExceptions из-за смешанных идентификаторов за один раз, а затем отлично работал без каких-либо изменений bu только "чистого проекта", после неудачный апат.
Наконец, я запустил несколько команд на 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" означает "недостаточная доступность памяти".
В DDMS я также обнаружил недостатки памяти, когда я демпинг файлов HPROF.
Вот журнал ошибок (сокращенный):
!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
Ответы
Ответ 1
Фактическая проблема заключается в том, что процесс aapt запрашивает необоснованный объем памяти. Память о том, что у моей системы с SSD HD и (таким образом) нет swap (но 4 ГБ ОЗУ) нет, рядом с уже большим процессом затмения.
Решение состоит в том, чтобы установить:
echo 1 > /proc/sys/vm/overcommit_memory
Прочтите приведенные ниже статьи, но я понимаю, что ядро Linux имеет недостаток и несовершенно в прогнозировании того, сколько памяти потребуется новому процессу. Этот флаг позволяет системе запускать любой процесс, в зависимости от того, сколько памяти он запрашивает. Обратите внимание, что на практике aapt никогда не будет использовать эту большую память. Кажется, что размер процесса затмения (в моем случае, например, 2 ГБ) - это оценка, и это добавлено к любой используемой ОЗУ (2 ГБ eclipse + 0,5 ГБ), что превышает мою 4 ГБ ОЗУ. Aapt будет использовать только часть 2GB, но расчет не выполняется.
Недостатком этого сверхкомпьюта, по-видимому, является то, что ядро не имеет чистого решения, когда вы работаете с низким объемом памяти и просто убиваете процессы.
Другое решение - использовать swap, в моем случае файл подкачки, поскольку я не предвидел раздел подкачки, а затем, желательно, с очень низкой 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 файл на вашем жестком диске, который вы никогда не будете использовать, кроме как для удовлетворения вычислений ядра (и, возможно, редкой крайне низкой памяти, не знаете, как работает 0 swappiness?). Говорят, что это плохая идея использовать своп на SSD, поскольку многие записи сокращают время жизни SSD.
Следующие статьи привели меня к решению.
Как решить "java.io.IOException: ошибка = 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
Обратите внимание, что здесь не ошибка, а также инструменты Android dev. Я мог бы увидеть эту проблему где угодно. Однако я полагаю, что из-за гигантского (и растущего) размера инструментария eclipse, связанного, возможно, с некоторыми деталями реализации, такими как использование fork()?, Эта проблема имеет очень высокую вероятность всплытия здесь, а также для других люди с твердотельными накопителями.
Ответ 2
ошибка действительно находится в emul-linux 32bit libz.so.1.2.3!!
Я просто создал 32-битную версию libz сам, и он работает - aapt не бросает вышеприведенную ошибку. если вы используете gentoo - все версии libz emul-linux-x86-baselibs имеют эту проблему (в настоящее время 20100915-r1 и 20110129)
вот шаги, которые вам нужны, пока не будет обновлена версия emul-linux-baselibs:
- get 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 в /lib 32
Проблема заключается в том, что, хотя 64-битная версия, которую вы компилируете, имеет следующие поля в заголовке ELF:
[ 5] .gnu.version VERSYM 00000000000017be 000017be
[ 6] .gnu.version_d VERDEF 0000000000001890 00001890
[ 7] .gnu.version_r VERNEED 00000000000019e8 000019e8
32-битная версия, предоставляемая текущими emul-linux-x86-baselibs, не имеет поля 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 - mine, и мне интересно, почему в дистрибутиве emul-linux отсутствует.
С уважением,
cmuelle8
ps: иногда сообщения об ошибках, напечатанные компьютерными программами, являются правильными..
Ответ 3
Увеличьте память на studio64.vmoptions или studio.vmoptions соответственно, это сработало для меня, я просто увеличил его, чтобы удвоить все, почти в 3 раза, например Xms 512, Xmx 4096, -XX: MaxPermSize = 720m, XX: ReservedCodeCacheSize = 128 м.
Надежда полезна для кого-то в будущем.
Ответ 4
Кстати, если вы используете Windows, может случиться так, что ваш антивирус сканирует файл aapt.exe(это то, что Avast Antivirus сделал в моем случае)