I'm getting the following error compiling with gradle using Flutter in Android Studio:
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;
This only occurs if I add enough dependencies, as might be expected. I've enabled multidex and added the multidex dependency in the Android project build.gradle
file as per instructions (https://developer.android.com/studio/build/multidex.html), but wasn't sure what to do about step 2 in "Configure your app for multidex" for a Flutter App, or even whether the omission of that step was the problem.
File/New/New Flutter Project
from the toolbarAdd the following to dependencies in pubspec.yaml
:
dependencies:
flutter_google_place_picker: "^0.0.1"
location: "^1.2.0"
Packages Get
in Android Studio or run flutter packages get
in the project directoryModify android/app/build.gradle
to add the following sections in the appropriate places:
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
android {
defaultConfig {
multiDexEnabled true
}
}
Run/Run
from the toolbarReplacing the "compile" dependency in build.gradle
with each of the following:
compile 'com.android.support:multidex:1.0.3'
implementation 'com.android.support:multidex:1.0.1'
implementation 'com.android.support:multidex:1.0.3'
Following the multidex steps for each of my dependencies; i.e. modifying their build.gradle
files, enabling multidex and adding the multidex dependency.
build.gradle
files for my project and its dependencies, and enabling multidex for them.location: "^1.2.0"
with geolocation: "^0.2.1"
Not enabling multidex at all (i.e. skipping step 7 of recreating). This results in the following error:
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
$ 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!
Multidex support library is enabled by default in API level higher than 21 (Android 5 and higher). Therefore, you do not need to add the Multidex support library.
Android applications by default have SingleDex support which limits your application to have only 65536 methods(references). So multidexEnabled = true simply means that now you can write more than 65536 methods(references) in your application.
How to enable multidex for flutter project.
Open [project_folder]/app/build.gradle
and add following lines.
defaultConfig {
...
multiDexEnabled true
}
and
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
}
Open [project_folder]/android/gradle.properties
and add following lines.
android.useAndroidX=true
android.enableJetifier=true
Update for beginner devs in 2022 and beyond:
If you’e OK with your project having a minimum Android API level of 21 (it will run on 98% of Android devices), all you have to do is this:
Using a text editor, open your "app level build.gradle file" which exists at [your project]\android\app\build.gradle.
There is a line that begins with "minSdkVersion."
Change it from:
defaultConfig {
// ...
minSdkVersion [whatever it says here, even if it is not a number]
// ...
}
to:
defaultConfig {
// ...
minSdkVersion 21
// ...
}
Obviously the 21 can be higher if you want, but not lower.
YOU ARE DONE.
You don't have to make ANY other modifications in order for multidex to work correctly.
Apparently, the default minSDK setting for new Flutter projects is STILL 16, so after adding enough dependencies in pubspec.yaml, many new developers will run into the multidex error and go searching online, potentially getting bogged down in old, confusing information which only applies to projects with a minimum level set to less than 21.
That was the simplest solution, but there are other ways:
Jahidul Islam's answer here, and Francis Nduba Numbi's answer here.
They have their own pros and cons so be sure to read the comments under their answers.
Your two packages seem to disagree on their transitive dependencies. One wants 11.6.+, the other wants 11.+ of some play-services dependencies. Since both 11.6.2 and 11.8.0 are out there, this is going to end up with a conflict.
If you run ./gradlew androidDependencies
in your android/
folder, you get a listing of the result of dependency resolution, containing, among others, the following:
+--- :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
These 11.6.2 and 11.8.0 packages are not going to work together. To resolve this, you need to patch your dependencies to be consistent with each other, or add a dependency override to the top level of your android/app/build.gradle
file and hope for the best:
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'
}
}
The multidex support is enabled automatically. If your app supports Android SDK versions below 21, and it exceeds the 64K method limit, simply pass the --multidex
flag to flutter build appbundle
or flutter build apk
and your app will support multidex.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With