Wcześniej widziałem różne wersje erozji dex, ale ta jest nowa. czyszczenie / restart itp. nie pomoże. Projekty bibliotek wydają się nienaruszone, a zależność wydaje się być poprawnie powiązana.
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
lub
Cannot merge new index 65950 into a non-jumbo instruction
lub
java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
tl; dr : Oficjalne rozwiązanie Google jest już dostępne!
http://developer.android.com/tools/building/multidex.html
Tylko jedna mała wskazówka, prawdopodobnie będziesz musiał to zrobić, aby uniknąć braku pamięci podczas wykonywania deksowania.
dexOptions {
javaMaxHeapSize "4g"
}
Istnieje również tryb jumbo, który może to naprawić w mniej niezawodny sposób:
dexOptions {
jumboMode true
}
Aktualizacja: jeśli Twoja aplikacja jest gruba i masz zbyt wiele metod w głównej aplikacji, może być konieczne jej ponowne uporządkowanie zgodnie z
http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
nie wywołujesz tej funkcji, jeśli nie jest ona dostępna?Odpowiedzi:
Aktualizacja 3 (11.03.2014)
Google w końcu wydała oficjalny opis .
Aktualizacja 2 (
31.10.2014 ) Wtyczka Gradle v0.14.0 dla Androida dodaje obsługę multi-dex. Aby włączyć, wystarczy zadeklarować to w build.gradle :
Jeśli Twoja aplikacja obsługuje system Android w wersji wcześniejszej niż 5.0 (to znaczy, jeśli masz
minSdkVersion
20 lat lub mniej), musisz także dynamicznie załatać aplikację ClassLoader , aby móc ładować klasy z pobocznych instrukcji. Na szczęście istnieje biblioteka, która robi to za Ciebie. Dodaj go do zależności aplikacji:Musisz jak najszybciej wywołać kod poprawki ClassLoader. dokumentacja
MultiDexApplication
klasy sugeruje trzy sposoby na zrobienie tego (wybierz jeden z nich , który jest dla ciebie najwygodniejszy):1 - Zadeklaruj
MultiDexApplication
klasę jako aplikację w pliku AndroidManifest.xml :2 - Poproś swoją
Application
klasę o rozszerzenie klasy MultiDexApplication :3 - Wywołanie
MultiDex#install
z TwojejApplication#attachBaseContext
metody:Aktualizacja 1 (10/17/2014):
Zgodnie z oczekiwaniami, obsługa multideksów jest dostarczana w wersji 21 Biblioteki pomocy technicznej Androida. Plik android-support-multidex.jar można znaleźć w folderze / sdk / extras / android / support / multidex / library / libs.
Obsługa Multi-dex rozwiązuje ten problem. dx 1.8 już pozwala na generowanie kilku plików dex.
Android L będzie obsługiwał natywnie multi-dex, a kolejna wersja biblioteki wsparcia obejmie starsze wersje z powrotem do API 4.
Stwierdzono w tym odcinku podcastu dla programistów Androida, przygotowanym przez Anwara Ghulouma. Mam napisali zapis (i ogólny multi-dex wyjaśnienia) odpowiedniej części.
źródło
java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
. Okazało się, że mój błąd polegał na tym, że nie stosowałem dodatkowych kroków do obsługi Androida przed wersją 5.0. Powiedziawszy to, opcja nr 3 rozwiązała ten problem i nie miałem jużClassNotFoundException
problemów. Dzięki, @Alex Lipov!Jak już wspomniano, masz zbyt wiele metod (ponad 65 000) w swoim projekcie i bibliotekach.
Zapobiegaj problemowi: zmniejsz liczbę metod dzięki Play Services 6.5+ i support-v4 24.2+
Ponieważ często usługi Google Play są jednym z głównych podejrzanych w „marnowaniu” metod za pomocą metod 20k + . Usługi Google Play w wersji 6.5 lub nowszej, możesz włączyć usługi Google Play do swojej aplikacji przy użyciu kilku mniejszych bibliotek klienckich. Na przykład, jeśli potrzebujesz tylko GCM i map, możesz użyć tylko tych zależności:
Pełna lista podbibliotek i ich obowiązków znajduje się w oficjalnym dokumencie Google .
Aktualizacja : Od czasu Support Library v4 v24.2.0 został podzielony na następujące moduły:
Pamiętaj jednak, że jeśli użyjesz
support-fragment
, będzie to zależało od wszystkich innych modułów (tj. Jeśli użyjeszandroid.support.v4.app.Fragment
nie ma korzyści)Zobacz tutaj oficjalne informacje o wydaniu lib support-v4
Włącz MultiDexing
Ponieważ Lollipop (inaczej narzędzia do kompilacji 21+) jest bardzo łatwy w obsłudze. Podejście polega na obejściu 65 000 metod na problem z plikiem dex, aby utworzyć wiele plików dex dla aplikacji. Dodaj następujące elementy do pliku kompilacji stopni ( jest to wzięte z oficjalnego dokumentu Google w aplikacjach z ponad 65k metodami ):
Drugim krokiem jest przygotowanie klasy aplikacji lub jeśli nie rozszerzysz aplikacji, skorzystaj z
MultiDexApplication
manifestu Android:Dodaj to do pliku Application.java
lub użyj dostarczonej aplikacji z biblioteki mutlidex
Zapobiegaj OutOfMemory dzięki MultiDex
Dalszą wskazówką jest to, że jeśli napotkasz
OutOfMemory
wyjątki podczas fazy kompilacji, możesz powiększyć stosco ustawiłoby stos na 4 gigabajty.
Zobacz to pytanie, aby uzyskać więcej informacji na temat problemu z pamięcią sterty dex.
Przeanalizuj źródło problemu
Aby przeanalizować źródło metod, wtyczka gradle https://github.com/KeepSafe/dexcount-gradle-plugin może pomóc w połączeniu z drzewem zależności udostępnionym przez gradle np.
Zobacz tę odpowiedź i pytanie, aby uzyskać więcej informacji na temat liczby metod w Androidzie
źródło
Twój projekt jest za duży. Masz za dużo metod. Może być tylko 65536 metod na aplikację. zobacz tutaj https://code.google.com/p/android/issues/detail?id=7147#c6
źródło
Poniższy kod pomaga, jeśli używasz Gradle. Pozwala łatwo usunąć niepotrzebne usługi Google (zakładając, że ich używasz), aby wrócić poniżej progu 65 tys. Podziękowania dla tego postu: https://gist.github.com/dmarcato/d7c91b94214acd936e42
Edytuj 22.10.2014 : Odbyło się wiele interesujących dyskusji na temat wspomnianej powyżej treści. TLDR? Patrz na to: https://gist.github.com/Takhion/10a37046b9e6d259bb31
Wklej ten kod na dole pliku build.gradle i dostosuj listę usług Google, których nie potrzebujesz:
źródło
clean
każdym razem, gdy analizowałem wykluczenia (korzystamy z analiz).Udostępniłem przykładowy projekt, który rozwiązał ten problem za pomocą skryptu kompilacji custom_rules.xml i kilku wierszy kodu.
Użyłem go w swoim własnym projekcie i działa bezbłędnie na urządzeniach 1M + (od Androida-8 do najnowszego Androida-19). Mam nadzieję, że to pomoże.
https://github.com/mmin18/Dex65536
źródło
Napotkałem ten sam problem i rozwiązałem go, edytując mój plik build.gradle w sekcji zależności, usuwając:
I zastępując go:
źródło
Spróbuj dodać poniższy kod w build.gradle, to zadziałało dla mnie -
źródło
Idealnym rozwiązaniem byłoby współdziałanie z Proguard. jak wspomniano w komentarzu aleb. Zmniejszy rozmiar pliku dex o połowę.
źródło
Możesz przeanalizować problem (odwołania do plików dex) za pomocą Android Studio:
Kompilacja -> Analiza APK ..
W panelu wyników kliknij plik classes.dex
I zobaczysz:
źródło
rozwiązanie gradle + proguard:
źródło
Usuń plik jar z folderu Libs i skopiuj do innego folderu, a następnie przejdź do _ Właściwości projektu> Wybierz ścieżkę kompilacji Java, wybierz biblioteki, wybierz dodaj zewnętrzny jar, wybierz usunięty jar do swojego projektu, kliknij przycisk Zapisz, zostanie on dodany pod odnośnikiem Biblioteka zamiast folderu Libs. Teraz wyczyść i uruchom swój projekt. Nie musisz dodawać żadnego kodu dla MultDex. To po prostu działało dla mnie.
źródło
Dzisiaj miałem do czynienia z tą samą kwestią, która działała poniżej
Dla ANDROID STUDIO ... Włącz natychmiastowe uruchamianie
W Plik-> Preferencje-> Kompilacja, wykonanie, wdrożenie-> Natychmiastowe uruchomienie-> Zaznacz Włącz natychmiastowe uruchomienie dla Hot Swap ...
Mam nadzieję, że to pomoże
źródło