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.


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.


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 :)


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.


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.


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 .


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.


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ć.



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.


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'

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.


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.


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.


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"

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.


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


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)

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.