Android dex daje BufferOverflowException podczas kompilowania

174

Podczas kompilowania konkretnego projektu na Androida i tylko na moim komputerze z systemem Windows, otrzymuję java.nio.BufferOverflowExceptionod dexa. Problem występuje zarówno podczas korzystania z Eclipse, jak i Ant.

Wynik podczas korzystania z Ant to:

...
  [dex] Pre-Dexing C:\MyProject\libs\android-support-v4.jar -> android-support-v4-5f5341d3c1b10a79d7d93f9c1e64421e.jar
  [dex] Converting compiled files and external libraries into C:\MyProject\bin\classes.dex...
   [dx]
   [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
   [dx] java.nio.BufferOverflowException
   [dx]     at java.nio.Buffer.nextPutIndex(Buffer.java:499)
   [dx]     at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296)
   [dx]     at com.android.dex.Dex$Section.writeShort(Dex.java:818)
   [dx]     at com.android.dex.Dex$Section.writeTypeList(Dex.java:870)
   [dx]     at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437)
   [dx]     at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423)
   [dx]     at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317)
   [dx]     at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423)
   [dx]     at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163)
   [dx]     at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)
   [dx]     at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
   [dx]     at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
   [dx]     at com.android.dx.command.dexer.Main.run(Main.java:230)
   [dx]     at com.android.dx.command.dexer.Main.main(Main.java:199)
   [dx]     at com.android.dx.command.Main.main(Main.java:103)

BUILD FAILED
C:\Users\Jaap\android-sdks\tools\ant\build.xml:892: The following error occurred while executing this line:
C:\Users\Jaap\android-sdks\tools\ant\build.xml:894: The following error occurred while executing this line:
C:\Users\Jaap\android-sdks\tools\ant\build.xml:906: The following error occurred while executing this line:
C:\Users\Jaap\android-sdks\tools\ant\build.xml:284: null returned: 2

Podczas korzystania z Eclipse komunikat jest krótszy, ale podobny:

[2013-11-01 14:29:44] APK file is not created for Project: 
[2013-11-01 14:29:46 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
[2013-11-01 14:29:46 - MyProject] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

Jak powiedziałem, nie mam tego problemu na moim MacBooku, mimo że oba są zaktualizowane do najnowszych wersji narzędzi do budowania Androida: 19.0.0.

beetstra
źródło
1
Czy korzystasz z bibliotek? Sprawdź ich konfigurację
Sherif elKhatib
@SherifelKhatib, tylko biblioteka wsparcia i Google Analytics V2
beetstra
10
Ponieważ wydawało się, że nikt jeszcze nie zgłosił problemu w tej sprawie,
złożyłem go
próbując usunąć cały pakiet SDK, zaćmienie i kod Androida.
vpathak
uzyskiwanie podobnego błędu w Centos x64:! SESSION 2013-11-07 17: 07: 35.305 eclipse.buildId = v22.3.0-887826 java.version = 1.7.0_40 java.vendor = Oracle Corporation BootLoader stałe: OS = linux, ARCH = x86_64, WS = gtk, NL = en_US Framework argumenty: -product com.android.ide.eclipse.adt.package.product Argumenty wiersza poleceń: -os linux -ws gtk -arch x86_64 -product com.android.ide.eclipse .adt.package.product java.nio.BufferOverflowException at java.nio.Buffer.nextPutIndex (Buffer.java:519)
isti_spl

Odpowiedzi:

230

Nie ma potrzeby obniżania wersji narzędzi do kompilacji z powrotem do 18.1.1 1 , ten problem został rozwiązany za pomocą narzędzi do kompilacji 19.0.1 .

Jeśli z jakiegoś powodu nie możesz użyć 19.0.1, to:

Upewnij się, że wartość android:targetSdkVersionw AndroidManifest.xml jest zgodna target=android-<value>z project.properties . Jeśli te dwie wartości nie są takie same, kompilowanie za pomocą narzędzi kompilacji w wersji 19.0.0 zakończy się w wyjątku BufferOverflowException. Źródło

Z komentarzy do tego posta wynika również, że należy kierować reklamy na co najmniej 19 (android-19). Proszę zostaw komentarz, jeśli to rozwiązanie działa również, jeśli Twoim celem jest <19.

Tak wygląda poprawka dla mojego projektu. Powiązany problem AOSP to # 61710.

1 Jeśli naprawdę potrzebujesz obniżenia wersji, nie musisz odinstalowywać narzędzi kompilacji 19.0.0, po prostu zainstaluj 18.1.1 i dodaj sdk.buildtools=18.1.1do local.propertiespliku.

Pływ
źródło
5
To nie zadziałało dla mnie. Zweryfikowano wszystkie project.properties i targetSdk. Używam najnowszej wersji IntelliJ IDEA 13 Cardea. Na szczęście odinstalowanie build-tools 19.0.0 naprawiło build.
James Wald
3
Aby to zadziałało, musiałem również ustawić docelowy SDK na najnowszą wersję (19).
RolandK
Upewnij się również, że docelowa wersja sdk została pobrana za pomocą twojego menedżera sdk (to jest przyczyna mojego problemu).
mrmoment
1
Miałem cel 10 w AndroidManifest.xml i project.properties. Próbowałem zrestartować Eclipse i wyczyścić, ale nie pomogło. Następnie ustawiłem cel na 19 w config.properties i zadziałało. Nie próbowałem obniżać wersji narzędzi do kompilacji. (Cel 15 nie zadziałał)
thomasa88
5
Ustawienie targetSdkVersion w manifeście i celu we właściwościach na 19 zadziałało dla mnie
Jaldip Katre
83

Spróbuj jakiej furgonetki powiedział :

Kliknij prawym przyciskiem myszy projectandroid toolsandroid support library.

Mam nadzieję że to pomoże :)

Lolo Me
źródło
19
Dziękuję za to rozwiązanie, tylko dwa kliknięcia i problem został rozwiązany !!!!! (chociaż w moim menu było „dodaj bibliotekę wsparcia”)
Christopher
57

Mam ten sam problem. Przywrócono kompilację narzędzi 18.1.1, zrestartowałem Eclipse i to naprawiło.

Stefano
źródło
3
Tak, to naprawiło. Musiałem jednak ręcznie usunąć stary katalog 19.0.0.
beetstra
To również rozwiązało problem, chociaż wróciłem do wersji 18.0.1
NickT
1
Skorzystałem z tej odpowiedzi i nie musiałem cofać się: stackoverflow.com/questions/19727915/ ...
Jon
Sprawdziłem wszystkie project.properties i targetSdk. Używam najnowszej wersji IntelliJ IDEA 13 Cardea i grałem również z wersją SDK projektu. Odinstalowanie build-tools 19.0.0 było jedynym sposobem naprawienia kompilacji dla mojego projektu.
James Wald
1
Dzięki. Przywrócenie narzędzi do budowania 18.1.1 i usunięcie 19 naprawiło ten problem. Myślałem, że zwariowałem
Darren
50

Udało mi się skompilować mój problematyczny projekt, dodając tę ​​dodatkową linię:

sdk.build.tools=18.1.1

... do mojego pliku project.properties , który znajduje się w katalogu głównym folderu projektu. Wydawało mi się, że wszystkie inne podejścia zawiodły.

mrrrk
źródło
myślę, że jest to również jeden z powodów tego problemu. Nigdy nie używałem wersji 19 w moim docelowym pakiecie SDK, a problem nadal się pojawiał. Prawdopodobnie narzędzia do budowania sdk były ustawione na 19, które trzeba było przywrócić
saurav
Użyty cel nie określa używanej wersji narzędzia buildtools.
Flow
Dodałem najnowszą bibliotekę wsparcia i dodałem tę linię do właściwości projektu, a mój problem został rozwiązany ... dzięki
speedynomads
Jestem zaskoczony, że to zadziałało; jest w źródle AOSP jako sdk.buildtools, nie sdk.build.tools, i to była nazwa, która zadziałała dla mnie.
Yoni Samlan
7

Kliknij prawym przyciskiem myszy projekt >> Właściwości >> Android >> Poziom API 18 zadziałał dla mnie. Ale zanim to zrobiłem, kliknąłem prawym przyciskiem myszy projekt >> Narzędzia Android >> Dodaj bibliotekę wsparcia i ponownie uruchomiłem Eclipse . Być może będziesz musiał pobawić się wybranym poziomem API .

uczeń
źródło
3
A co z poziomem API poniżej 18? Jak możemy uruchomić aplikację poniżej poziomu API 18?
Jayesh
Musiałem dodać projekt-> Narzędzia Android-> Dodaj bibliotekę wsparcia i zainstalować bibliotekę obsługi ADT 19.0.1. Następnie generuje dobrze apk.
user914425
7

Po zainstalowaniu nowego zestawu SDK w pliku projektu znajduje się nowy folder „Zależności systemu Android”. Jeśli klikniesz prawym przyciskiem myszy i usuniesz go ze ścieżki budowania, ponownie będziesz mógł zbudować swój projekt.

Mahendra Liya
źródło
Zauważyłem, że ten folder powodował powielanie problemu z plikiem JAR. Ale usunięcie go nie rozwiązało mojego problemu.
Salsero69
@ Salsero69 Czy używasz projektu biblioteki jako odniesienia w swoim rzeczywistym projekcie?
Mahendra Liya
5

Aktualizacja

right click your project > android tools > android support library

Oczyść swój projekt i spróbuj zbudować.

Ostry
źródło
4

Miałem ten sam problem po aktualizacji do wersji 19. Nie zapomnij tylko zaktualizować ADT, https://dl-ssl.google.com/android/eclipse/ . Po tym mogłem zbudować projekt z najnowszą wersją.

awangarda
źródło
3

Rozwiązałem ten problem bez pobierania biblioteki obsługi lub przywracania narzędzi do kompilacji do wersji 18.1.1. Po prostu zmieniłem poziom API na 16+ i problem zniknął . Mam nadzieję, że to pomoże.

Zsolt Boldizsár
źródło
Jak zmieniłeś poziom API na 16?
Peter Mortensen,
Po prostu kliknąłem prawym przyciskiem myszy mój projekt i wybrałem Androida z listy. Powinien pojawić się lista zainstalowanych wersji Android API, wybierz tę, która ma 16 jako poziom API (4.1.2).
Zsolt Boldizsár
3

Żadne z innych rozwiązań tutaj nie zadziałało po uaktualnieniu do Android Studio 0.4.0 i Gradle 1.9.

Rozwiązałem problem, pobierając Build Tools 19.0.1 i aktualizując następujący wiersz w moich plikach build.gradle:

buildToolsVersion '19.0.0'

do

buildToolsVersion '19.0.1'
Jacob Tabak
źródło
Tak, ten problem wydaje się rozwiązany w wersji 19.0.1. Działa również dobrze z „ant debug”.
Robert,
2

W przypadku problemów z IntelliJ IDEA 13 odinstaluj Build Tools 19.

Adí
źródło
2

Miał ten sam problem z wersją docelową 19na obu project.propertiesi AndroidManifest.xmlz Ant.

Naprawiono to przez:

  • Odinstalowano Android SDK Build-Tools 19.0.1
  • Zainstalowano Android SDK Build-Tools 19.0.2

Myślę, że @ Al-Kathiri-Khalid jest na miejscu. Problem jest spowodowany tylko brakiem obsługi poziomu interfejsu API w narzędziach do budowania.

ciągłość
źródło
1

Miałem ten sam problem, chociaż mój projekt nie korzystał z biblioteki wsparcia. Dodanie biblioteki libs / android-support-v4.jar do projektu pozwoliło obejść problem bez konieczności przywracania narzędzi do kompilacji z powrotem z wersji 19.

Jim Vitek
źródło
1

Rozwiązałem ten problem. Po prostu wprowadź tę zmianę w pliku właściwości projektu:

target=android-18
sdk.build.tools=18.1.1

A w pliku manifestu:

uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="18"
Ravi
źródło
0

Dodaj plik biblioteki do projektu .. Projekt-> kliknięcie prawym przyciskiem myszy-> Właściwości-> Android-> Biblioteka-> kliknij Dodaj i wybierz projekt biblioteki i podaj zastosuj i ok .. następnie wyczyść projekt i uruchom ponownie .. jeśli chcę zrestartować zaćmienie ...

Czasami trzeba też zaktualizować narzędzia do tworzenia zestawu SDK systemu Android.

harikrishnan
źródło
0

U mnie zadziałało: otworzyłem plik project.properties z katalogu głównego mojego projektu i zmieniłem go target=android-8natarget=android-17

Chinciusan Marian
źródło
0

java.nio.BufferOverflowException podczas błędu dex Oznacza to, że nie masz obsługującego API dla tego poziomu dlatego kompilacja kończy się niepowodzeniem, istnieje wiele sposobów, aby to naprawić.

Sprawdź, czy plik manifestu używa-sdk android: minSdkVersion = "4" i android: targetSdkVersion = "14"

Każde z poniższych rozwiązuje problem: -

  • Pobierz wymagany poziom interfejsu API (może to zająć trochę czasu) i ponownie uruchom aplikację
  • Szybka nieczysta poprawka zmień cel projektu w project.properties na nowy cel docelowy = android-4
  • Szybka, czysta poprawka, zmień SdkVersion w swoim manifeście i Wyczyść swój projekt, aby dodać zmiany do projektu. Właściwości (Moje ulubione)
Al-Kathiri Khalid
źródło
0

Usunąłem poprzedni Android SDK i Eclipse . Zainstalowałem pakiet ADT i działa ...

To rozwiązało problem z BufferOverflow w Dex, który zaczął się po tym, jak uzyskałem API 19. Wcześniej używałem Eclipse z Android SDK zainstalowanym jako pakiet dodatkowy.

vpathak
źródło
Skąd mogę zainstalować pakiet reklam?
Jayesh
0

Kliknij prawym przyciskiem myszy Projekt >> Właściwości >> Android i wybierz poziom API większy niż 15

LUB

Dodaj google-play-services_lib do swojego projektu, klikając prawym przyciskiem myszy projekt i wybierając Projekt >> Właściwości >> Android >> Dodaj

Junaid
źródło