Błąd: Nie można dopasować żądanych klas do pojedynczego pliku dex. Spróbuj podać listę main-dex. # metody: 72477> 65536

309

Chcę dodać połączone usługi lokalizacyjne, ale wyświetla mi się błąd. Pomóż mi.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'
Muhammad Adil Sattar
źródło

Odpowiedzi:

385

Żadna z udzielonych odpowiedzi nie była wyczerpująca. Problem leży w Multidexie. Musisz dodać bibliotekę do klasy aplikacji:

implementation 'com.android.support:multidex:1.0.3'

Następnie dodaj defaultConfig klasy aplikacji:

multiDexEnabled true

Twoja aplikacja musi być typu Multidex. Musisz zapisać ją w manifeście:

android:name=".MyApplication"

„MyApplication” musi być klasą Multidex lub musi ją rozszerzyć.

AlexPad
źródło
5
Tak MyApplication extends android.support.multidex.MultiDexApplication?
zakaz geoinżynierii
2
Wypróbowałem to rozwiązanie, ale kończę na tym nowym problemie: stackoverflow.com/questions/49518115/…
ban-geoengineering
22
Oto oficjalna strona z dokumentami dla Androida zawierająca więcej wyjaśnień na temat tego, dlaczego tak się dzieje i jak zrobić lepszą wersję apk: developer.android.com/studio/build/multidex
Vrakfall
2
nie jest to dobra metoda rozwiązania problemu, lepiej usunąć nieużywany kod i biblioteki, refaktoryzować kod projektu
25
5
brak 80000 metod byłby dobrym rozwiązaniem, gdyby biblioteki googles nie miały 80000 metod (cały powód, dla którego dodali multidex, ponieważ ich własna biblioteka usług, z której wszyscy chcieli korzystać, miała dziesiątki tysięcy metod).
Lassi Kinnunen
194

Rozwiązałem problem z poniższym rozwiązaniem:

W pliku kompilacji Gradle dodaj zależność:

wdrożenie „com.android.support:multidex:1.0.3”

A następnie w sekcji „defaultConfig” dodaj:

multiDexEnabled true

Bofeng
źródło
8
Pracował dla mnie. Szczegółowe instrukcje dotyczące konfiguracji tutaj: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel
Włączenie obsługi multideksów nie jest konieczne w większości aplikacji. Powinieneś rozważyć usunięcie nieużywanych bibliotek, zobacz moją odpowiedź poniżej.
MG Developer
106

zmodyfikuj aplikację lub moduł build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

Według oficjalnej dokumentacji

Obsługa Multidex dla Androida 5.0 i nowszych

Android 5.0 (API poziom 21) i wyższy używa środowiska wykonawczego o nazwie ART, które natywnie obsługuje ładowanie wielu plików DEX z plików APK. ART wykonuje kompilację wstępną w czasie instalacji aplikacji, która skanuje w poszukiwaniu plików klas N.dex i kompiluje je w jeden plik .oat do wykonania przez urządzenie z Androidem. Dlatego jeśli twoja minSdkVersion wynosi 21 lub więcej, nie potrzebujesz biblioteki obsługi multidex.

Aby uzyskać więcej informacji o środowisku uruchomieniowym Androida 5.0, przeczytaj ART i Dalvik.

https://developer.android.com/studio/build/multidex

wdanxna
źródło
59

Co to są pliki dex: pliki aplikacji na Androida (APK) zawierają wykonywalne pliki kodu bajtowego w postaci plików wykonywalnych Dalvik (DEX), które zawierają skompilowany kod użyty do uruchomienia aplikacji.

Powód tego wyjątku: specyfikacja DEX ogranicza całkowitą liczbę metod, do których można odwoływać się w pojedynczym pliku DEX, do 65 536 (limit referencyjny 64 KB) - w tym metody frameworku Android, metody biblioteczne i metody we własnym kodzie.

Krok 01. Dodaj następującą zależność w następujący sposób

W przypadku użytkowników innych niż Androidx,

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

Dla użytkowników Androidax

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

Krok 02:

Po dodaniu tych projektów synchronizacji i przed uruchomieniem projektu, należy zbudować projekt przed uruchomieniem. w przeciwnym razie otrzymasz wyjątek.

gsm
źródło
53

Możesz śledzić ten .

Wersje platformy wcześniejszej niż Android 5.0 (API poziom 21) używają środowiska wykonawczego Dalvik do wykonywania kodu aplikacji. Domyślnie Dalvik ogranicza aplikacje do jednego pliku kodu bajtowego class.dex na plik APK. Aby obejść to ograniczenie, możesz dodać bibliotekę obsługi multidex do swojego projektu:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Jeśli minSdkVersion ma wartość 21 lub wyższą, wszystko, co musisz zrobić, to ustawić multiDexEnabled na true w pliku build.gradle na poziomie modułu, jak pokazano tutaj:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}
rize
źródło
33

kiedy używasz zależności, więc twoje metody się zwiększają! Google ma na to rozwiązanie. o nazwie Multidex!

UWAGA: upewnij się, że min. SDK wynosi ponad 14.

w swoim build.gradle:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}



  dependencies {
      implementation 'com.android.support:multidex:1.0.3'
    }

DLA UŻYTKOWANIA androidX:

 def multidex_version = "2.0.1"
 implementation 'androidx.multidex:multidex:$multidex_version'

Aby uzyskać więcej informacji, przejdź do oryginalnego linku:

https://developer.android.com/studio/build/multidex

sana ebadi
źródło
Świetne rozwiązanie! naprawiono mój problem
Vaibhav Herugu
29

Cześć problem jest tutaj, usuń go

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

dlaczego?

Uwaga: nie używaj połączonego celu usług. Wprowadza dziesiątki bibliotek, nadmuchując twoją aplikację. Zamiast tego określ tylko interfejsy API usług Google Play, których używa Twoja aplikacja.

I używaj tego, czego potrzebujesz. https://developers.google.com/android/guides/setup

Jak w przypadku usługi lokalizacyjnej

com.google.android.gms:play-services-location:11.8.0

Do przesyłania w chmurze

com.google.android.gms:play-services-gcm:11.8.0
Pankaj Kant Patel
źródło
tak, mam teraz problem z przyciskiem uruchamiania.
Muhammad Adil Sattar
27

Jeśli budujesz DEBUG APK , po prostu dodaj:

debug {
            multiDexEnabled true
        }

wewnątrz buildTypes

a jeśli budujesz APLIKACJĘ RELEASE , dodaj multiDexEnabled trueblok wydania jako-

release {
                ...
                multiDexEnabled true
                ...
        }
Raj Yadav
źródło
25

W przypadku projektów trzepotania możesz również rozwiązać ten problem

otwórz swój \ android \ app \ build.gradle

powinieneś mieć następujące:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Jeśli minSdkVersion ma wartość 21 lub wyższą, wszystko, co musisz zrobić, to ustawić multiDexEnabled na true w defaultConfig. Lubię to

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

jeśli twoja minSdkVersion jest ustawiona na 20 lub mniej, dodaj multiDexEnabled true do defaultConfig

I zdefiniuj wdrożenie

dependencies {
  implementation 'com.android.support:multidex:1.0.3'// or 2.0.1
}

Na koniec powinieneś mieć:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Aby uzyskać więcej informacji, przeczytaj to: https://developer.android.com/studio/build/multidex

Richardd
źródło
1
hhahaha! Cieszę się, że to ci pomogło!
Richardd
18

Po prostu wykonaj następujące czynności:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

I dodaj poniżej zależności w build.gradlepliku na poziomie aplikacji

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 
Saif Khan
źródło
13
multiDexEnabled true

Spróbuj dodać to w aplikacji defaultConfig {}. Pomoże mi to rozwiązać problem

użytkownik2173696
źródło
12

W pliku kompilacji Gradle dodaj zależność:

implementation 'com.android.support:multidex:1.0.2'

lub

implementation 'com.android.support:multidex:1.0.3'

lub

implementation 'com.android.support:multidex:2.0.0'

A następnie w sekcji „defaultConfig” dodaj:

multiDexEnabled true

W obszarze targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Teraz jeśli napotkasz ten błąd

Błąd: nie można rozwiązać: multidex-instrumentation Open File

Musisz zmienić ocenę na 3.0.1

        classpath 'com.android.tools.build:gradle:3.0.1'

I umieść następujący kod w pliku gradle-wrapper.properties

DistributionUrl = https: //services.gradle.org/distribution/gradle-4.1-all.zip

Wreszcie

dodaj klasę Aplikacja w projekcie I zapoznaj się z nią na AndroidManifest, który rozszerza się z MultiDexApplication

public class App extends MultiDexApplication {

@Override
public void onCreate( ) {
    super.onCreate( );
}

}

Uruchom projekt najpierw, aby utworzyć błąd, a następnie wyczyść projekt

Wreszcie, uruchom ponownie projekt i ciesz się nim

younes
źródło
Nadal mam komunikat „Nie udało się rozwiązać: multidex-instrumentacja”
Makalele,
11

Jeśli używasz minifyEnabled z Proguard, prawdopodobnie nie będziesz musiał włączać multi-dex. Zgadzam się z MG Developer, że w miarę możliwości powinieneś unikać multi-dex. Moim rozwiązaniem było włączenie multi-dex tylko dla kompilacji debugowania. minifyEnabled rozwiązuje problem kompilacji wersji

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}
Ernie Thomason
źródło
jakie są wady korzystania z multidex, jeśli musimy?
isJulian00
1
Bardzo dobre pytanie, na które tak naprawdę nie mam odpowiedzi. Przeczytaj, jeśli nie masz: na developer.android.com/studio/build/multidex#mdex-gradle Wygląda na to, że dla API> = 21 nie ma większego problemu. W przypadku <21 wydaje się, że Android musi wykonać fantazyjne prace nóg, które mogą potencjalnie powodować problemy. Ponieważ wiele osób musi to włączyć, domyślam się, że Android działa dobrze, więc nie martwiłbym się tym zbytnio. W miarę możliwości lubię być konserwatywny.
Ernie Thomason
10

Nie mam pojęcia dlaczego, może dlatego, że rozwijam się w Kotlinie, ale aby naprawić ten błąd, muszę w końcu stworzyć klasę, która rozwija się w MultiDexApplicationnastępujący sposób:

class MyApplication : MultiDexApplication() {
}

i w moim Manifest.xmlmuszę ustawić

<application
        ...
        android:name=".MyApplication">

aby nikogo nie mylić, robię również:

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

w przypadku systemu Androidx działa to również dla mnie:

implementation 'androidx.multidex:multidex:2.0.0'

...

<application android:name="android.support.multidex.MultiDexApplication">

nie działa dla mnie

Boe-Dev
źródło
pamiętaj, aby wyczyścić projekt i odbudować go po ustawieniu wartości multiDexEnabled na true. Naprawiłem to dla mnie.
pseudozach
zmiana atrybutu nazwy aplikacji w manifeście też nie działała dla mnie, ale włączenie multiDex w pliku kompilacji stopni i dodanie implementacji zadziałało. Wygląda na to, że zmiana nazwy manifestu jest teraz opcjonalna?
Cody
9

Masz zbyt wiele metod. Plik dex Androida ma limit 65536 metod, które możesz mieć.

Na początek, jeśli nie potrzebujesz wszystkich API usług Google Play i samej lokalizacji, zamień

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

z

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

Możesz odnieść się do tej strony, aby poznać sposoby jej uniknięcia lub, jeśli to konieczne, aby zezwolić na więcej: https://developer.android.com/studio/build/multidex.html

Raz
źródło
tak, ale to nie jest prawdziwy problem. Myślę, że dodaję te same zależności. Jeden dla bazy ogniowej, a drugi dla lokalizacji Sprawdź poniżej dwie linie.
Muhammad Adil Sattar
6

Wszystko, co musiałem zrobić, to ustawić Minimalną wersję zestawu SDK na 21 w Plik> Struktura projektu> Aplikacja> Smaki

Will Buffington
źródło
6

dodaj swój plik android / app / build.gradle

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }
AN niemiecki
źródło
5

Ten błąd napotkałem dwukrotnie i rozwiązaniem tego jest; Sprawdź plik oceny aplikacji, aby zobaczyć docelowy zestaw SDK, jeśli jest to 20 lub więcej, po prostu dodaj jedną linię do swojegodefaultconfig { multiDexEnabled true }

W przeciwnym razie, jeśli docelowy zestaw SDK jest mniejszy niż 20, dodaj wiersz do defaultConfig, a także dodaj zależność

implementation 'com.android.support:multidex:1.0.3'.

Sprawdź ten link, aby uzyskać więcej.

https://developer.android.com/studio/build/multidex#mdex-gradle

Mpwanyi Samuel
źródło
5

Korzystanie z obsługi multidex powinno być ostatecznością. Domyślnie kompilacja stopni gromadzi mnóstwo zależności przechodnich dla twojego APK. Zgodnie z zaleceniami w Dokumentach dla programistów Google pierwsza próba usunięcia niepotrzebnych zależności z projektu.

Za pomocą wiersza polecenia przejdź do głównego katalogu projektów Android. Można uzyskać drzewo zależności kompilacji w następujący sposób.

gradlew app:dependencies --configuration debugCompileClasspath

Możesz uzyskać pełną listę drzewa zależności

gradlew app:dependencies

wprowadź opis zdjęcia tutaj

Następnie usuń niepotrzebne lub przechodnie zależności z build.gradle aplikacji. Na przykład, jeśli Twoja aplikacja korzysta z zależności o nazwie „com.google.api-client”, możesz wykluczyć biblioteki / moduły, których nie potrzebujesz.

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

Następnie w Android Studio wybierz Build> Analyze APK ... Wybierz plik APK wydania / debugowania, aby zobaczyć zawartość. To da ci metody i referencje liczą się w następujący sposób.

Przeanalizuj APK

MG Developer
źródło
1
jakie są wady korzystania z multidex, jeśli musimy
isJulian00
2

W kompilacji: aplikacja

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'
Sebastián Giraldo
źródło
1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
Mohamed Slimane
źródło
to mi też wystarczało.
nyxee
1

Błąd jest spowodowany liczbą zależności klasowych w pliku Gradle aplikacji. Jeśli klasy przekraczają 72 400, możesz użyć multidex jako rozwiązania do lepszej obsługi indeksowania plików. Dowiedz się więcej tutaj: https://developer.android.com/studio/build/multidex

Mpwanyi Samuel
źródło