Java zakończyła się z niezerową wartością wyjścia 2 - Android Gradle

135

Podczas wykonywania mojej aplikacji na Androida pojawia się ten błąd (wyczyściłem ją, a następnie skompilowałem, ale błąd nadal występuje)

  • Synchronizuj: OK
  • Make Project: OK
  • Czysto: OK
  • Uruchom: błąd

Błąd: nie powiodło się wykonanie zadania „: app: dexDebug” .com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process „command” C: \ Program Files \ Java \ jdk1.7.0 _25 \ bin \ java.exe '' zakończono z niezerową wartością wyjścia 2

Mój plik z ocenami:

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
    applicationId "com.rzr.rzevallosr.miappdepruebas"
    minSdkVersion 19
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

productFlavors {
}

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])

// This library handles authentication and authorization
compile 'com.spotify.sdk:spotify-auth:1.0.0-beta9@aar'
// This library handles music playback
compile 'com.spotify.sdk:spotify-player:1.0.0-beta9@aar'

compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.+'

compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile 'com.squareup.okhttp:okhttp:2.2.0'

compile files('libs/spotify-web-api-android-master-0.1.0.jar')
compile files('libs/okio-1.3.0.jar')
}

EDYCJA: Nie widziałem „kompiluj drzewo_pliku (dir: 'libs', include: ['* .jar'])” to kompilacja dwukrotnie moich bibliotek, więc po prostu komentuję:

//compile 'com.squareup.retrofit:retrofit:1.9.0'
//compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
//compile 'com.squareup.okhttp:okhttp:2.2.0'

//compile files('libs/spotify-web-api-android-master-0.1.0.jar')
//compile files('libs/okio-1.3.0.jar')

i działa dobrze.

Maverick.pe
źródło
2
@JaredBurrows Problem w moim przypadku polegał na tym, że moja aplikacja kompilowała dwa razy więcej bibliotek ... jedna na „compile fileTree” (kompiluje wszystkie twoje katalogi libs) i „compile ****”.
Maverick.pe
Czy możesz opublikować odpowiedź i oznaczyć ją jako poprawną?
Jared Burrows
@JaredBurrows gotowe. Dzięki
Maverick.pe
proszę sprawdzić mój post tutaj stackoverflow.com/a/33387368/740372
Sanjoy Saha
Mam ten sam błąd, ale mój plik Gradle nie zawiera tak wielu kompilacji. Proszę pomóż. Opublikowałem to pytanie: stackoverflow.com/questions/34558251/ ... Jestem zupełnie nowy w programowaniu na Androida.
Ayusch

Odpowiedzi:

205

Ten problem jest prawdopodobnie spowodowany przekroczeniem limitu dex 65K metod narzuconego przez Androida. Ten problem można rozwiązać, czyszcząc projekt i usuwając niektóre nieużywane biblioteki i metody z zależności w pliku build.gradle LUB dodając obsługę multidex.

Tak więc, jeśli musisz zachować biblioteki i metody, możesz włączyć obsługę wielu dexów, deklarując ją w konfiguracji gradle.

defaultConfig {        
    // Enabling multidex support.
    multiDexEnabled true
}

Możesz przeczytać więcej o obsłudze multidex i tworzeniu aplikacji przy użyciu ponad 65 000 metod tutaj .

minhazur
źródło
cieszę się, że ci pomogło. @David
minhazur
2
Dziękuję bardzo, że mi pomogło
Aayushi
4
A następnie przesłonięcie metody w klasie startowej: @Override protected void attachBaseContext (Context base) {super.attachBaseContext (base); MultiDex.install (this); }
Gent Berani,
Wow, działa świetnie. Nigdy nie myślałem, że to może być problem.
Neela
Jeśli chcesz zobaczyć, co dokładnie powoduje błąd, spróbuj zbudować swój projekt za pomocą terminalu gradle, w ten sposób ./gradlew assembleDebug --stacktrace --debug. Widziałem ten błąd w moim przypadkucom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
NecipAllef
93

W moim przypadku problem polegał na tym, że umieściłem niepotrzebny kod biblioteki Complie w pliku build.gradle

dependencies {
    compile 'com.google.android.gms:play-services:7.5.0'
}

który powodował ponad 65k metod, więc usunąłem go, zsynchronizowałem gradle, wyczyściłem projekt, a następnie uruchomiłem ponownie, a następnie ten błąd ustał. Potrzebowałem tylko map i gcm, więc umieściłem te linie i zsynchronizowałem projekt

compile 'com.google.android.gms:play-services-gcm:7.5.0'
compile 'com.google.android.gms:play-services-location:7.5.0'

Cześć ludzie, ponownie napotkałem ten problem i tym razem było to z powodu zmiany wersji narzędzi do kompilacji i naprawdę wymagało to włączenia multidex ... więc dodałem te plik build.gradle mojej aplikacji.

defaultConfig {
    applicationId "com.am.android"
    minSdkVersion 13
    targetSdkVersion 23
    // Enabling multidex support.
    multiDexEnabled true
}

dexOptions {
    incremental true
    javaMaxHeapSize "2048M"
    jumboMode = true
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:multidex:1.0.1'
}

Utwórz klasę, która rozszerza klasę Application i umieść tę metodę w klasie.

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

uwzględnij również w metodzie OnCreate

@Override
public void onCreate() {
    MultiDex.install(this);
    super.onCreate();
}
Amit Tumkur
źródło
2
To najlepsze rozwiązanie. Powinieneś uwzględnić tylko te biblioteki, których faktycznie używasz.
Roisgoen
2
pracuje dla mnie!! zmień „kompiluj” com.google.android.gms: play-services: 7.5.0 ”, aby skompilować„ com.google.android.gms: play-services-identity: 8.1.0 „compile” com.google.android. gms: play-services-plus: 8.1.0 "
Oscar Calderon
1
Fajny, zobacz także: developers.google.com/android/guides/setup - podaj listę różnych indywidualnych bibliotek.
Ed Manners,
@ edsappfactory.com odniosłem się do tego, użyłem i zmodyfikowałem.
Amit Tumkur
32

Na wszelki wypadek, jeśli ktoś nadal boryka się z tym i nie ma pojęcia, dlaczego tak się dzieje i jak to naprawić. W rzeczywistości ten błąd

Błąd: nie powiodło się wykonanie zadania „: app: dexDebug”. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command' C: \ Program Files \ Java \ jdkx.x.x_xx \ bin \ java.exe '' zakończone niezerowa wartość wyjścia 2

może mieć wiele powodów, ale z pewnością nie jest to coś związanego z wersją JDK, więc nie trać czasu w złym kierunku. Są to dwa główne powody, dla których tak się dzieje

  1. Ta sama biblioteka lub plik jar zawiera kilka miejsc, a niektóre z nich są ze sobą w konflikcie.
  2. Wkrótce osiągniesz lub już przekroczyłeś limit 65 000 metod

Pierwszy przypadek można naprawić w następujący sposób: Dowiedz się, które zależności zostały uwzględnione wiele razy. Aby to zrobić, uruchom następujące polecenie w terminalu Android Studio

gradlew -q dependencies yourProjectName_usually_app:dependencies --configuration compile

to zwróci wszystkie zależności, ale pliki jar, które dołączasz z folderu lib, spróbuj pozbyć się duplikatów oznaczonych gwiazdką (*), nie zawsze jest to możliwe, ale w niektórych przypadkach nadal możesz to zrobić, po tym spróbuj wykluczyć moduły, które są uwzględniane wiele razy, możesz to zrobić w ten sposób

compile ('com.facebook.android:facebook-android-sdk:4.0.1'){
    exclude module: 'support-v4'
}

W drugim przypadku, gdy sugerujesz przekroczenie limitu metody, spróbuj zminimalizować je przez usunięcie dołączonych bibliotek (uwaga brzmi jak pierwsze rozwiązanie), jeśli nie ma sposobu, aby to zrobić, dodaj multiDexEnabled true do domyślnej konfiguracji

defaultConfig {
   ...
   ...
   multiDexEnabled true
}

zwiększa to limit metod, ale nie jest to najlepsze rozwiązanie ze względu na możliwe problemy z wydajnością. WAŻNE dodawanie tylko multiDexEnabled truedo defaultConfignie wystarczy w rzeczywistości na wszystkich urządzeniach z systemem Android <5 Lollipop spowoduje nieoczekiwane zachowanie i NoClassDefFoundError. sposób rozwiązania tego problemu opisano tutaj

Vilen
źródło
18

Nie wiedziałem (do tego czasu), że „kompiluj fileTree (dir: 'libs', include: ['* .jar'])” kompiluję wszystko, co ma rozszerzenie jar w folderze libs, więc po prostu komentuję (lub usuwam) to linie:

//compile 'com.squareup.retrofit:retrofit:1.9.0'
//compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
//compile 'com.squareup.okhttp:okhttp:2.2.0'

//compile files('libs/spotify-web-api-android-master-0.1.0.jar')
//compile files('libs/okio-1.3.0.jar')

i działa dobrze. W każdym razie dzięki! Mój błąd.

Maverick.pe
źródło
5
lub odwrotnie: komentarz compile fileTree(dir: 'libs', include: ['*.jar'])w gradle. Pomogło mi.
Tomasz Mularczyk
czy jest jakieś inne rozwiązanie dotyczące tego problemu? Nie skompilowałem każdego pliku jar, ale zamiast tego po prostu użyłem tej linii, compile fileTree(dir: 'libs', include: ['*.jar'])ale nadal pokazuje ten sam błąd.
Kairi San
9

Miałem ten sam problem i naprawiłem usunięcie biblioteki, która była niepotrzebna

compile fileTree(dir: 'libs', include: ['*.jar'])

Usunąłem tę bibliotekę i mogłem bez problemu uruchomić projekt.

Alexiscanny
źródło
Próbowałem dodać klasę slideMenu i usunięcie jej z mojej głównej klasy zadziałało. Dzięki! :)
Lucas Senechal
6

Mój został rozwiązany przez włączenie multiDex do debugowania kompilacji.

defaultConfig {
multiDexEnabled true
}
Armin
źródło
6

Odrzucam osadzony JDK (w wersji 32-bitowej), ponieważ osadzony JDK jest 64 -bitowy

Kliknij prawym przyciskiem myszy swój projekt -> Otwórz ustawienia modułu -> Lokalizacja SDK -> Odznacz Użyj osadzonego JDk, a następnie ustaw ścieżkę JDK, np. W Ubuntu / usr / lib / jvm / java-8-openjdk-i386

ugali miękkie
źródło
1
Myślę, że to działa, ponieważ osadzony JDK jest 64-bitowy. Miałem ten sam problem na mojej 32-bitowej maszynie.
Lukas Novak
To rozwiązało problem na mojej 32-bitowej maszynie. echo $JAVA_HOMEdla ścieżki
próbki SANBI
Tak, wiedziałem, że ma to związek z tym, że moja maszyna jest 32-bitowa. Dziękuję, Zacharia - uratował mi dzień!
Ilonpilaaja
5

Możliwy problem: Przekroczyłeś limit metod dex 65k, może dodałeś jakąś bibliotekę lub kilka metod, zanim wystąpił problem?

Artem Zinnatullin
źródło
1
Nie kilka ... tylko kilka metod.
Maverick.pe
Hm, spróbuj zbudować poprzednią wersję projektu lub usuń nieużywane biblioteki, jeśli to możliwe, i
odbuduj
Mam też tylko kilka metod
bowman han
3

Jeśli zaktualizowałeś już swój SDK i korzystasz również z usług Google Play, to musisz zająć się tą zależnością, ponieważ istnieje pewien rodzaj konfliktów z:

Wykonaj poniższe czynności: kompiluj „com.google.android.gms: play-services: +„ Zamień na kompilację ”com.google.android.gms: play-services: 6.5.87”

Uwaga: tutaj „6.5.87” to wersja usługi Google Play. Mam nadzieję, że to pomoże ...

Maddy
źródło
2

Myślę, że to konflikty pliku .jar w twoim projekcie.

Usunąłem android-support-v4.jar z folderu libs i działa !!!

jeśli projekt zawiera błąd, sprawdź plik build.gradle

zależności {

}

Samir Mangroliya
źródło
2

W moim przypadku problem polegał na tym, że nowa biblioteka (zależność gradle), którą dodałem, opierała się na niektórych innych zależnościach, a dwie z tych podstawowych zależności były w konflikcie / kolidowały z niektórymi zależnościami innych bibliotek / zależności w moim skrypcie kompilacji. W szczególności dodałem Apache Commons Validator(do sprawdzania poprawności wiadomości e-mail), a dwie jego zależności (Apache Commons Loggingi Apache Commons Collections) były w konflikcie z tymi używanymi przez Robolectric (ponieważ różne wersje tych samych bibliotek były obecne w mojej ścieżce kompilacji). Więc wykluczyłem te sprzeczne wersje zależności ( modules) podczas dodawania nowej zależności (the Validator):

compile ('commons-validator:commons-validator:1.4.1') {
    exclude module: 'commons-logging'
    exclude module: 'commons-collections'
}

Możesz zobaczyć zależności modułów gradle (możesz mieć tylko jeden moduł w swoim projekcie) za pomocą następującego polecenia gradle (używam opakowania gradle, które jest tworzone dla Ciebie, jeśli utworzyłeś swój projekt w Android Studio / Intellij Pomysł). Uruchom to polecenie w katalogu głównym projektu:

./gradlew: NAZWA-MODUŁU: zależności

Po dodaniu tych excludedyrektyw i ponownej próbie uruchomienia pojawił się duplicate filebłąd, NOTICE.txtktóry jest używany przez niektóre biblioteki Apache Commons, takie jak Logging i Collections. Musiałem wykluczyć ten plik tekstowy podczas pakowania. W moim build.gradle dodałem:

packagingOptions {
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/NOTICE.txt'
}

Okazało się, że nowa biblioteka (the Validator) może działać z nieco starszymi wersjami swoich zależności / modułów (które są już importowane do mojej ścieżki kompilacji przez inną bibliotekę (Robolectric)). Tak było w przypadku tej konkretnej biblioteki, ale inne biblioteki mogą używać najnowszego interfejsu API podstawowych zależności (w takim przypadku należy spróbować sprawdzić, czy inne biblioteki, które opierają się na konfliktującym module / zależności, są w stanie pracować z nowsza wersja (poprzez wykluczenie starszej wersji modułu / zależności z pozycji tych bibliotek)).

Javad Sadeqzadeh
źródło
1

W moim przypadku pojawił się ten błąd, gdy występuje konflikt bibliotek 2 lub więcej (ta sama biblioteka, ale różne wersje). Sprawdź swoją aplikację build.gradle w bloku zależności.

Phuc Tran
źródło
1

Istnieją dwie alternatywy, które na pewno zadziałają:

  1. Wyczyść projekt, a następnie skompiluj.

Jeśli powyższa metoda nie zadziałała, wypróbuj następną.

  1. Dodaj następujące elementy do pliku build.gradle na poziomie aplikacji

    defaultConfig {   
    
    multiDexEnabled true
    
    }
Udit Kapahi
źródło
próbowałem obu, ale mam nowy błąd Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'. > java.util.zip.ZipException: duplicate entry: android/support/v4/view/MotionEventCompatEclair.class, co mam zrobić dalej?
Kairi San
wypróbuj ten stackoverflow.com/questions/28168063/…
Udit Kapahi
ten błąd występuje z powodu zduplikowanych / tych samych pakietów w Twoim projekcie
Udit Kapahi
1

Zaktualizowanie mojego Java SDK do najnowszej wersji 1.7.0_79i zaktualizowanie SDK Locationponiżej Project Structurerozwiązało problem.

TheIT
źródło
1

Mój problem polegał na tym, że oprócz posiadania

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process „command” /Library/Java/JavaVirtualMachines/jdk1.X.X_XX .jdk / Contents / Home / bin / java '' zakończone niezerową wartością wyjścia 2

Miałem też ten ślad:

Nieprzechwycony błąd tłumaczenia: java.lang.IllegalArgumentException: już dodano: Lcom / mypackage / ClassX;

Problem polegał na tym, że dodawałem tę samą klasę w dwóch różnych bibliotekach. Po usunięciu pliku class / jar z jednej z bibliotek projekt działał poprawnie

mromer
źródło
Dokładnie, mam ten sam problem, tę samą sygnaturę klasy, na szczęście to była moja klasa, więc ją refaktoryzowałem. Napisałem odpowiedź tutaj: stackoverflow.com/a/35045501/3397345
Davideas
1

Dla mnie dodawałem całe zależności od Playstore

kompiluj „com.google.android.gms: play-services: 8.4.0”

Ale potrzebowałem tylko mapy Google, więc sprecyzowałem, a błąd został rozwiązany.

kompiluj „com.google.android.gms: play-services-maps: 8.4.0”

Ajji
źródło
0

w moim przypadku problemem była wersja narzędzi do kompilacji, która była 23.0.0 rc3 i zmieniłem na 22.0.1 i mój problem został naprawiony.

max
źródło
0

Być może używasz kabla niskiej jakości / uszkodzonego kabla do podłączenia urządzenia do komputera, wymieniłem kabel i zadziałało.

Mushtaq Jameel
źródło
0

Ten błąd jest spowodowany używaniem większej liczby bibliotek. W moim przypadku 'kompilacja' com.google.android.gms: play-services-9.4.0 'spowodowało ten błąd.Aby uniknąć tego błędu, użyj niezbędnych bibliotek. Na przykład, jeśli chcesz aby korzystać z Map w swojej aplikacji. Następnie użyj kompilacji „com.google.android.gms: play-services-maps: 9.4.0”. podczas dodawania zależności usług Google Play określ tylko potrzebne biblioteki. domyślnie obejmuje wszystkie biblioteki.

Rajesh.k
źródło
0

W swoim gradle.buildpliku użyj tego

"compile fileTree(dir: 'libs', include: ['*.jar'])"

I działa dobrze.

Rishabh Mahatha
źródło
0

Jeśli chcesz zobaczyć, co dokładnie powoduje błąd, spróbuj zbudować swój projekt za pomocą terminalu gradle, w ten sposób ./gradlew assembleDebug --stacktrace --debug. Widziałem następujący błąd w moim przypadkucom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

Stało się to, gdy próbowałem zintegrować Mapy Google z moim projektem. Aby to naprawić, po prostu sprawdziłem dołączone biblioteki

compile 'com.google.android.gms:play-services:9.8.0'

Po prostu zmieniłem to na

compile 'com.google.android.gms:play-services-maps:9.8.0'

i problem zniknął

NecipAllef
źródło
0

Wystąpił ten sam błąd po przekonwertowaniu projektu na Kotlin. Mój problem polegał na tym, że moja lokalizacja jre została zmieniona na nieprawidłową ścieżkę podczas procesu (zastanawiam się, dlaczego tak się mogło stać ... sprawiło, że traciłem czas). Naprawiono to, wykonując następujące czynności:

File > Project Structure > SDK Location 

Odznaczono Use embedded JDKopcję, która wskazywała na starą instalację JDK i wybrałeś poprawną:

/home/my_user/jdk1.8.0_101

Po zmianie tego błąd zniknął

voghDev
źródło
0

UDAŁO SIĘ DLA MNIE :)

zaktualizowałem java do najnowszej wersji 8, poprzednio była to 7, a następnie przeszedłem do OPEN MODULE SETTING, klikając prawym przyciskiem myszy na projekt i zmieniłem ścieżkę jdk na / usr / lib / jvm / java-8-oracle, nowa java 8 została zainstalowana. I zrestartuj studio

sprawdź w / usr / lib / jvm nazwę folderu java 8

Używam ubuntuwprowadź opis obrazu tutaj

jayant singh
źródło