ошибка при выполнении aapt, внезапно
Вопрос
Я знаю, что существует множество подобных тем, но ни одна из них, похоже, не помогает в моем случае и не описывает его точно.Самый лучший аналог aapt не найден по правильному пути.
Моя проблема в том, что я могу использовать Eclipse в течение всего вечера программирования, компилирования и использования моего устройства, а затем внезапно я получаю «ошибку выполнения aapt» для моего текущего проекта и, конечно же, R.java больше не генерируется (должным образом).Затем я перезапускаю Eclipse, и все исчезает.Однако я вижу это в среднем раз в день.
Недавно я перешел на amd64 и установил последнюю версию Android-2.3 SDK и соответствующие инструменты.Я знаю, что теперь есть папка с инструментами платформы, в которой есть подходящая версия, которая должна работать с версией SDK независимо.Сначала я добавил этот каталог в свой PATH, как указано на веб-сайте SDK.Я также попытался не добавлять его в свой путь и создать ссылку «платформы/android-9/инструменты», чтобы каждая версия SDK могла использовать свою старую копию.Излишне говорить, что Platform-tools/aapt существует и имеет необходимые разрешения, и я могу выполнить его из командной строки в любое время.
Когда я пишу ошибочный XML-файл или сортирую и получаю сообщение об ошибке, я вижу дополнительную строку с надписью «aapt:/lib32/libz.so.1:информация о версии отсутствует».Я использую новейшую Linux-систему Gentoo.У меня установлено все для поддержки 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.01.2010:
Я получил еще немного знаний.Когда я недавно пытался экспортировать подписанный APK, я столкнулся с другим сообщением об ошибке (полная информация из представления ошибок Eclipse) относительно aapt, которого я раньше не видел.Здесь также обратите внимание, что я могу просто перезапустить Eclipse и снова без проблем экспортировать APK, по крайней мере, на некоторое время.
Я начинаю думать, что это связано с нехваткой памяти в моей системе.Сообщение «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
Решение 2
Реальная проблема, по-видимому, заключается в том, что процесс 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 подкачки?).Говорят, что использовать подкачку на SSD — плохая идея, поскольку большое количество операций записи сокращает срок службы SSD.
Следующие статьи привели меня к решению.
Как решить «java.io.IOException:ошибка = 12, невозможно выделить память», вызывая Runtime#exec()?
Обратите внимание, что здесь виноват не aapt и не инструменты разработчика Android.Я мог увидеть эту проблему где угодно.Однако я думаю, что из-за гигантского (и увеличивающегося) размера набора инструментов eclipse, в сочетании, возможно, с некоторыми деталями реализации, такими как использование fork()?, эта проблема имеет очень высокую вероятность появления здесь, также и для других люди с SSD.
Другие советы
ошибка действительно находится в 32-битной версии libz.so.1.2.3 emul-linux !!
Я только что собрал 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
в 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
пс:иногда сообщения об ошибках, выводимые компьютерными программами, верны.
Увеличьте память на studio64.vmoptions или studio.vmoptions соответственно, это сработало для меня, я просто увеличил ее, чтобы удвоить все, почти в 3 раза, например Xms 512, Xmx 4096, -XX:MaxPermSize=720m, XX:ReservedCodeCacheSize=128m .
Надежда пригодится кому-то в будущем.
Кстати, если вы используете Windows, может случиться так, что ваш антивирусный сканер удалит aapt.exe (это то, что сделал Avast Antivirus в моем случае)