Beim Kompilieren mit gradle mit Flutter in Android Studio wird der folgende Fehler angezeigt:

Dex: Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/zzcew;
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/zzcew;

[... stacktrace omitted for brevity ...]

* What went wrong:
Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/zzcew;

Die Kurzversion

Dies tritt nur auf, wenn ich erwartungsgemäß genügend Abhängigkeiten hinzufüge. Ich habe Multidex aktiviert und die Multidex-Abhängigkeit in der Android-Projektdatei build.gradle gemäß den Anweisungen hinzugefügt (https://developer.android.com/studio/build/multidex.html), war sich aber nicht sicher, was Sie in Schritt 2 unter" Konfigurieren Sie Ihre App für Multidex "für eine Flutter-App tun sollen. oder sogar, ob das Weglassen dieses Schritts das Problem war.

Schritte zum erneuten Erstellen:

  1. Wählen Sie File/New/New Flutter Project aus der Symbolleiste
  2. Wählen Sie "Flatteranwendung"
  3. Schließen Sie Kotlin & Swift-Unterstützung ein
  4. Überprüfen Sie, ob die App kompiliert und ausgeführt wird
  5. Fügen Sie den Abhängigkeiten in pubspec.yaml Folgendes hinzu:

    dependencies:
      flutter_google_place_picker: "^0.0.1"
      location: "^1.2.0"
    
  6. Klicken Sie in Android Studio auf Packages Get oder führen Sie flutter packages get im Projektverzeichnis aus
  7. Ändern Sie android/app/build.gradle, um die folgenden Abschnitte an den entsprechenden Stellen hinzuzufügen:

    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    android {
        defaultConfig {
            multiDexEnabled true
        }
    }
    
  8. Wählen Sie Run/Run aus der Symbolleiste

Andere Dinge, die ich versucht habe

  1. Ersetzen Sie die "Kompilierungs" -Abhängigkeit in build.gradle durch Folgendes:

    compile 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support:multidex:1.0.1'
    implementation 'com.android.support:multidex:1.0.3'
    
  2. Befolgen Sie die Multidex-Schritte für jede meiner Abhängigkeiten. Ändern ihrer build.gradle - Dateien, Aktivieren von Multidex und Hinzufügen der Multidex-Abhängigkeit.

  3. Ändern von minSdkVersion auf 21 und 27 in jeder der build.gradle - Dateien für mein Projekt und seine Abhängigkeiten und Aktivieren von Multidex für diese.
  4. Aktivieren der Minimierung für mein Projekt.
  5. Ersetzen von location: "^1.2.0" durch geolocation: "^0.2.1"
  6. Multidex überhaupt nicht aktivieren (d. H. Schritt 7 der Neuerstellung überspringen). Dies führt zu folgendem Fehler:

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
    > java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
    

Flatterdoktorausgang

$ flutter doctor -v
[√] Flutter (Channel beta, v0.2.8, on Microsoft Windows [Version 10.0.16299.371], locale en-GB)
    • Flutter version 0.2.8 at D:\flutter
    • Framework revision b397406561 (2 weeks ago), 2018-04-02 13:53:20 -0700
    • Engine revision c903c217a1
    • Dart version 2.0.0-dev.43.0.flutter-52afcba357

[√] Android toolchain - develop for Android devices (Android SDK 27.0.3)
    • Android SDK at C:\Users\Dave\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-27, build-tools 27.0.3
    • Java binary at: D:\AndroidDev\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)
    • All Android licenses accepted.

[√] Android Studio (version 3.1)
    • Android Studio at D:\AndroidDev
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)

[√] Connected devices (1 available)
    • Android SDK built for x86 64 • emulator-5554 • android-x64 • Android 5.1.1 (API 22) (emulator)

• No issues found!
54
SpoonerNZ 17 Apr. 2018 im 23:05

4 Antworten

Beste Antwort

Ihre beiden Pakete scheinen sich in ihren transitiven Abhängigkeiten nicht einig zu sein. Einer möchte 11.6. +, Der andere möchte 11. + einiger Abhängigkeiten von Spieldiensten. Da sowohl 11.6.2 als auch 11.8.0 verfügbar sind, wird dies zu einem Konflikt führen.

Wenn Sie ./gradlew androidDependencies in Ihrem android/ -Ordner ausführen, erhalten Sie eine Liste der Ergebnisse der Abhängigkeitsauflösung, die unter anderem Folgendes enthält:

+--- :flutter_google_place_picker (variant: release)
+--- com.google.android.gms:play-services-location:11.8.0@aar
+--- com.google.android.gms:play-services-places:11.6.2@aar
+--- com.google.android.gms:play-services-maps:11.6.2@aar
+--- com.google.android.gms:play-services-base:11.8.0@aar
+--- com.google.android.gms:play-services-tasks:11.8.0@aar
+--- com.google.android.gms:play-services-basement:11.8.0@aar

Diese Pakete 11.6.2 und 11.8.0 funktionieren nicht zusammen. Um dies zu beheben, müssen Sie Ihre Abhängigkeiten patchen, um miteinander konsistent zu sein, oder der obersten Ebene Ihrer android/app/build.gradle - Datei eine Abhängigkeitsüberschreibung hinzufügen und auf das Beste hoffen:

configurations.all {
    resolutionStrategy {
        force 'com.google.android.gms:play-services-places:11.8.0'
        force 'com.google.android.gms:play-services-location:11.8.0'
    }
}
11
SpoonerNZ 18 Apr. 2018 im 13:56

Wenn Sie keine Erfahrung mit der Entwicklung von Android-Anwendungen haben, können diese Informationen hilfreich sein, da Sie sonst nichts Neues finden.


So aktivieren Sie Multidex für Flatterprojekte.

1) Multidex aktivieren.

Öffnen Sie project/app/build.gradle und fügen Sie die folgenden Zeilen hinzu.

defaultConfig {
    ...

    multiDexEnabled true
}

Und

dependencies {
    ...

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

2) Aktivieren Sie Jetifier.

Öffnen Sie project/android/app/gradle.properties und fügen Sie die folgenden Zeilen hinzu.

android.useAndroidX=true
android.enableJetifier=true



HINWEIS: Ab Flattern 1.7 sind die folgenden Schritte nicht mehr erforderlich.




Erstellen Sie eine benutzerdefinierte Anwendungsklasse.

Wenn Sie nicht wissen, wo Sie die Datei erstellen sollen, tun Sie dies in der Nähe von MainActivity, z. B. project/android/app/src/main/kotlin(or java if you didn't enable kotlin)/your/great/pakage/appname/.

Kotlin-Beispiel: App.kt

package your.great.pakage.appname

import io.flutter.app.FlutterApplication
import android.content.Context
import androidx.multidex.MultiDex

class App : FlutterApplication() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

}

Java-Beispiel: App.java

package your.great.pakage.appname;

import io.flutter.app.FlutterApplication;
import android.content.Context;
import androidx.multidex.MultiDex;

public class App extends FlutterApplication {

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

}

4) Ändern Sie die Standardanwendungsdatei in "Neu".

Öffne project/android/app/src/main/AndroidManifest.xml

Ändern Sie android:name="io.flutter.app.FlutterApplication" in android:name=".App"

48
Peter Grace 28 Feb. 2020 im 14:14

Update für Anfänger im Jahr 2020:

Wenn Sie die erforderliche Mindest-Android-API-Stufe auf 21 festlegen können (Ihre App wird zum jetzigen Zeitpunkt noch auf 94,1% der Geräte ausgeführt), müssen Sie lediglich Folgendes tun:

1) Öffnen Sie Ihre "build.gradle-Datei auf App-Ebene", die unter [Ihr Projekt] \ android \ app \ build.gradle vorhanden ist

2) Ändern Sie die 16 (oder welche Zahl auch immer für Sie) in eine 21:

defaultConfig {
    // ...
    minSdkVersion 16
    // ...
}

... zu:

defaultConfig {
    // ...
    minSdkVersion 21
    // ...
}

Sie müssen KEINE anderen Änderungen vornehmen , damit Multidex ordnungsgemäß funktioniert.

Anscheinend ist die Standard-minSDK-Einstellung für neue Flutter-Projekte 16, sodass viele neue Entwickler nach dem Hinzufügen ausreichender Abhängigkeiten in pubspec.yaml auf den Multidex-Fehler stoßen und online suchen und möglicherweise in verwirrenden Informationen stecken bleiben, die nur für Projekte mit gelten ein Mindestpegel von weniger als 21.

8
Boober Bunz 13 Mai 2020 im 18:04

Kommentar zur Aktualisierung im Jahr 2020 Verwenden Sie das generierte com.example. durch Flattern im Firestore-Paketnamen. Ich hatte einen App-Absturz mit einem benutzerdefinierten Paket.

-1
Имран Кимран 21 Mai 2020 im 00:01