Domanda

So che ci sono un sacco di questi argomenti in giro ma nessuno sembra aiutare nel mio caso, non lo descrivono esattamente. Il migliore simile è aapt non trovato sotto la strada giusta .

Il mio problema è che io possa essere con Eclipse per un'intera programmazione la sera, la compilazione e usando il mio dispositivo, e poi improvvisamente mi ottenere "l'errore eseguendo aapt" per il mio progetto in corso e naturalmente R.java non è (correttamente) generata più. Ho poi riavviare Eclipse e tutto va via. Sto vedendo questo una volta al giorno, in media, tuttavia.

Recentemente ho passato a amd64 e installato i più recenti strumenti Android 2.3 SDK e di corrispondenza. So che v'è ora un platform-tools cartella che ha una versione aapt che dovrebbe funzionare la versione SDK in modo indipendente. In un primo momento avevo aggiunto questo elenco per il mio PATH, come indicato sul sito web SDK. Ho anche cercato di non aggiungere al mio percorso e facendo un piattaforme link / android-9 / strumenti in modo che ogni versione SDK potrebbe utilizzare di essa la propria vecchia copia. Inutile dire che, platform-tools / aapt c'è e ha i permessi giusti, e sono stato in grado di eseguire sulla riga di comando in qualsiasi momento.

Quando scrivo un file XML difettoso o tipi, e in modo appropriato ottengo un errore, vedo una riga aggiuntiva che dice "aapt: /lib32/libz.so.1: nessuna informazione versione disponibile". Sto correndo un recente sistema Linux Gentoo. Ho tutto installato al supporto x86 su amd64, ma sono riemersi EMUL-linux-x86-baselibs e zlib solo per essere sicuri. Il problema persiste. Vedo alcuni pagine quell'orrore incantesimo su alcuni bug zlib , ma io non sono sicuro se che è legato. Mi rendo conto che non sono sulla piattaforma di riferimento di Ubuntu, ma sicuramente la differenza non può essere quella grande?

Potrebbe benissimo essere un bug in aapt o gli strumenti stesso. Perché improvvisamente smettere di lavorare? Ho anche l'esperienza che gli ID in R.java erano errate, e cioè che semplice codice findViewById () darebbe ClassCastExceptions a causa della ids misti del tempo, e poi funziona perfettamente senza alcuna modifica bu solo un "progetto pulito", a seguito di una mancanza di AAPT.

Infine, ho incontrato un paio di comandi sul aapt, che non sembrano aggiungere qualsiasi informazione in più:

#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

Qualcuno può dire nulla di sbagliato con la mia configurazione? Ha odore come un insetto, forse (altrimenti andiamo a segnalarlo (di nuovo))?

Aggiornamento 2010-01-06:

ho acquisito qualche conoscenza in più. Quando di recente ho cercato di esportare un apk firmato, mi sono imbattuto in un altro messaggio di errore (tutti i dettagli dal punto di vista errore Eclipse) per quanto riguarda aapt che non avevo mai visto prima. Nota anche qui, che posso solo riavviare Eclipse e può esportare apks ancora una volta senza problemi, almeno per un po '.

sto iniziando a pensare che è legato alla mancanza di memoria sul mio sistema. Il messaggio "onvoldoende geheugen non disponibile" significa "memoria disponibile è insufficiente".

Ho anche stato vedere errori di memoria insufficiente in DDMS quando sto scarico file hprof.

Ecco il log degli errori (abbreviato):

!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
È stato utile?

Soluzione 2

Il vero problema sembra essere che il processo aapt sta chiedendo per un importo irragionevole di memoria. Memoria che il mio sistema con uno SSD e HD (quindi) senza swap (ma 4GB di RAM) non ha, accanto alla già grande processo di Eclipse.

La soluzione è quella di impostare:

echo 1 > /proc/sys/vm/overcommit_memory

Leggi gli articoli qui sotto, ma la mia comprensione è che il kernel Linux ha un difetto, ed è imperfetta nel predire la quantità di memoria un nuovo processo avrà bisogno. Questo flag permette al sistema di iniziare qualsiasi processo, per quanto riguarda la quantità di memoria che sta chiedendo. Si noti che, in pratica, aapt non potrà mai utilizzare questa quantità di memoria. Sembra che la dimensione del processo di Eclipse (nel mio caso, ad esempio 2 GB) è la stima e questo si aggiunge a tutto ciò la RAM è in uso (2GB eclisse + 0.5GB altro), che supera la mia 4GB di RAM. Aapt sarebbe utilizzare solo una frazione del 2GB ma il calcolo non riesce.

Lo svantaggio di permettere questo overcommit a quanto pare è che il kernel non ha soluzione pulito quando si esegue basso sulla memoria, e sarà solo uccidere i processi.

Un'altra soluzione è quella di utilizzare uno swap, nel mio caso un file di swap come io non avevo previsto una partizione di swap, e quindi preferibilmente con un bassissimo swappiness. Il manuale linux dovrebbe dirvi come, ma in sintesi (questo è solo per un rapido test, è necessario configurare il file / etc / fstab invece):

dd if=/dev/zero of=/swap bs=512 count=4M # = 2GB swapfile
mkswap /swap
swapon /swap

echo 0 > /proc/sys/vm/swappiness

Impostazione della swappiness così basso fa sì che lo swap è, in realtà, non ha mai usato. Questo è anche il più grande svantaggio di questa soluzione. Avrai un file sul vostro hard disk da 2 GB che non verrà mai usata, tranne che per soddisfare i calcoli del kernel (e forse una rara di memoria estremamente bassa, non so come funziona 0 swappiness?). Si dice che sia una cattiva idea di utilizzare uno swap su uno SSD come i molti scrive riducono la durata della SSD.

I seguenti articoli mi hanno portato alla soluzione.

come risolvere "java.io.IOException: error = 12, non può allocare memoria" chiamando 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

Si noti che non è aapt che è colpa qui, e non sono gli strumenti di sviluppo di Android. Ho potuto vedere questo problema ovunque. Credo però che a causa della enorme (e crescente) dimensione del toolkit eclisse, accoppiato magari con alcuni dettagli di implementazione, come l'uso di fork () ?, questo problema ha una elevata probabilità di affioramento qui, anche per altri le persone con SSD.

Altri suggerimenti

il bug è infatti in emul-linux è 32bit libz.so.1.2.3 !!

Ho appena costruito una versione a 32 bit libz me stesso e funziona - aapt non genera l'errore precedente. se si utilizza gentoo - tutte le versioni libz di emul-linux-x86-baselibs avere questo problema (attualmente 20.100.915-r1 e 20.110.129)

qui sono i passi necessari fino a quando una versione aggiornata di EMUL-linux-baselibs è fuori:

  • get zlib (1.2.5 è ok)
  • disfare
  • modifica configure
--- 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"
  • make
  • mossa libz.so.1.2.5 a / lib32

Il problema è che, mentre la versione a 64 bit che si compilare autonomamente ha i seguenti campi nell'intestazione ELF:

  [ 5] .gnu.version      VERSYM           00000000000017be  000017be
  [ 6] .gnu.version_d    VERDEF           0000000000001890  00001890
  [ 7] .gnu.version_r    VERNEED          00000000000019e8  000019e8

la versione a 32 bit fornito da correnti EMUL-linux-x86-baselibs manca il campo VERDEF, contiene solo

  [ 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

è possibile controllare se la tua generazione personalizzata di 32bit lib ha il campo VERDEF - il mio lo fa e mi chiedo il motivo per cui non è presente nella distribuzione emul-linux ..

saluti, cmuelle8

ps: a volte i messaggi di errore stampati da programmi per computer è giusto ..

aumentare la memoria sulla studio64.vmoptions o studio.vmoptions di conseguenza ha funzionato per me, ho appena aumentato a doppia tutto, quasi 3 volte per esempio Xms 512, Xmx 4096, XX: MaxPermSize = 720m, XX: ReservedCodeCacheSize = 128m.

La speranza è utile per qualcuno in futuro.

A proposito, se si utilizza Windows può accadere che il vostro programma antivirus cancella le aapt.exe (questo è ciò che Avast Antivirus ha fatto nel mio caso)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top