ошибка при выполнении aapt, внезапно

Я знаю, что есть много этих тем, но ни одна из них не помогает в моем случае и не описывает его точно. Лучший аналогичный — aapt не найден по правильному пути.

Моя проблема в том, что я могу использовать Eclipse для всего вечернего программирования, компиляции и использования своего устройства, а затем внезапно я получаю «ошибку выполнения aapt» для моего текущего проекта, и, конечно же, R.java больше (правильно) не генерируется. Затем я перезапускаю Eclipse, и все уходит. Однако я вижу это в среднем раз в день.

Недавно я перешел на amd64 и установил последнюю версию Android-2.3 SDK и соответствующие инструменты. Я знаю, что теперь есть папка с инструментами платформы, в которой есть версия aapt, которая должна работать с версией SDK независимо. Сначала я добавил этот каталог в свой PATH, как указано на веб-сайте SDK. Я также пытался не добавлять его в свой путь и создавать ссылки на платформы/android-9/tools, чтобы каждая версия SDK могла использовать свою старую копию. Излишне говорить, что там есть platform-tools/aapt и у него есть нужные разрешения, и я могу запустить его из командной строки в любое время.

Когда я пишу ошибочный xml-файл или сортирую и получаю соответствующую ошибку, я вижу дополнительную строку, в которой говорится: «aapt: /lib32/libz.so.1: нет доступной информации о версии». Я использую последнюю систему Gentoo Linux. У меня установлено все для поддержки x86 на amd64, но на всякий случай повторно появились emul-linux-x86-baselibs и zlib. Проблема сохраняется. Я вижу некоторые страницы, которые вызывают ужас из-за некоторых ошибок zlib , но я не уверен, что это связано. Я понимаю, что я не на эталонной платформе Ubuntu, но, конечно, разница не может быть такой большой?

Это вполне может быть ошибка в aapt или в самих инструментах. Почему он вдруг перестанет работать? Я также считаю, что идентификаторы в R.java были неверными, а именно, что простой код findViewById() выдавал бы ClassCastExceptions из-за смешанных идентификаторов один раз, а затем отлично работал без каких-либо изменений, но только «чистый проект», после неудачная попытка.

Наконец, я запустил несколько команд на 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

Может ли кто-нибудь сказать что-нибудь не так с моей конфигурацией? Возможно, это пахнет ошибкой (иначе давайте сообщим об этом (снова))?

Обновление от 06 января 2010 г.:

Я получил больше знаний. Когда я недавно пытался экспортировать подписанный 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

person pjv    schedule 31.12.2010    source источник


Ответы (4)


ошибка действительно в 32-битной libz.so.1.2.3 emul-linux !!

я только что сам собрал 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

в 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 — у меня оно есть, и мне интересно, почему оно отсутствует в дистрибутиве emul-linux.

С уважением, cmuelle8

PS: иногда сообщения об ошибках, напечатанные компьютерными программами, верны.

person Christian    schedule 25.02.2011
comment
Кристиан, отличное копание! Однако это решает проблему только на стороне, верно? А именно нет информации о версии. В своем собственном ответе я показал, как большая проблема связана с памятью. Всем, пожалуйста, +1 к этому ответу! - person pjv; 26.02.2011
comment
ну, у OP тоже была проблема с памятью, правда - OP также использует инструменты платформы 1.6 - я на 3.0 .. Пока у меня не было проблем с памятью, только проблема с libz, препятствующая запуску 32-битного aapt. другим решением для обновленного emul-linux-x86-baselibs будет Google, предоставляющий 64-битные инструменты для разработки Android. - person Christian; 26.02.2011
comment
Это решило проблему для меня в CentOS 6 (x86-64). Мне пришлось загрузить исходный код zlib (1.2.7), скомпилировать и установить его, используя CFLAGS=-m32 ./configure, а затем sudo make install. После sudo ldconfig aapt перестает стонать. - person trojanfoe; 10.01.2013

Реальная проблема, похоже, заключается в том, что процесс aapt запрашивает неразумный объем памяти. Память, которой нет в моей системе с SSD HD и (таким образом) без подкачки (но 4 ГБ ОЗУ), рядом с уже большим процессом затмения.

Решение состоит в том, чтобы установить:

echo 1 > /proc/sys/vm/overcommit_memory

Прочтите приведенные ниже статьи, но я так понимаю, что ядро ​​Linux имеет изъян и несовершенно предсказывает, сколько памяти потребуется новому процессу. Этот флаг позволяет системе запускать любой процесс, независимо от того, сколько памяти он запрашивает. Обратите внимание, что на практике aapt никогда не будет использовать столько памяти. Кажется, что размер процесса затмения (в моем случае, например, 2 ГБ) является оценочным, и он добавляется к любой используемой оперативной памяти (2 ГБ затмения + 0,5 ГБ другой), что превышает мои 4 ГБ ОЗУ. Aapt будет использовать только часть 2 ГБ, но расчет завершится ошибкой.

Недостатком разрешения этой чрезмерной фиксации, по-видимому, является то, что у ядра нет чистого решения, когда у вас мало памяти, и оно просто убивает процессы.

Другим решением является использование подкачки, в моем случае файла подкачки, так как раздел подкачки я не предусмотрел, и то желательно с очень низкой подкачкой. В вашем руководстве по 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

Установка такого низкого значения подкачки делает так, что подкачка на самом деле никогда не используется. Это также самый большой недостаток этого решения. У вас будет файл размером 2 ГБ на жестком диске, который вы никогда не будете использовать, кроме как для выполнения расчетов ядра (и, возможно, редкого крайне низкого объема памяти, не знаете, как работает 0 swappiness?). Говорят, что использование подкачки на SSD — плохая идея, так как большое количество операций записи сократит срок службы SSD.

Следующие статьи привели меня к решению.

Как решить java.io .IOException: error=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

Обратите внимание, что здесь виноват не aapt и не инструменты разработки Android. Я мог видеть эту проблему где угодно. Однако я думаю, что из-за гигантского (и растущего) размера набора инструментов eclipse, в сочетании, возможно, с некоторыми деталями реализации, такими как использование fork()?, эта проблема имеет очень высокую вероятность всплытия здесь, а также для других люди с SSD.

person pjv    schedule 09.01.2011
comment
Заботиться. Мой 1,5-летний SSD внезапно умер неделю назад. Вероятно, это не связано, и я не использовал Eclipse, когда он умер, но все же... - person pjv; 05.08.2012
comment
Спасибо за предостережение. По какой-то причине overcommit_memory не прижилась, и теперь я не могу изменить ни один из флагов в /proc/sys/vm, даже как root. В качестве обходного пути я просто увеличил размер раздела подкачки на своей виртуальной машине до 3 ГБ, что, похоже, пока делает систему счастливой. - person Andrew; 09.08.2012

Увеличьте память на studio64.vmoptions или studio.vmoptions соответственно, у меня сработало, я просто удвоил все, почти в 3 раза например Xms 512, Xmx 4096, -XX:MaxPermSize=720m, XX:ReservedCodeCacheSize=128m .

Надежда пригодится кому-то в будущем.

person gerfmarquez    schedule 06.03.2014
comment
Да нет, на самом деле вы решаете тривиальную проблему, из-за которой на SO много повторяющихся вопросов (см. ссылку в первом абзаце моего вопроса выше). У моей проблемы были те же симптомы, но гораздо более сложная причина и, следовательно, решение. Это не тот ответ, который нас здесь интересует. - person pjv; 08.08.2014

Кстати, если вы используете Windows, может случиться так, что ваш антивирусный сканер удалит файл aapt.exe (это то, что Avast Antivirus сделал в моем случае)

person Simon    schedule 24.11.2014