Resolving Multidex Issues and Dependency Conflicts in Flutter Projects

Nov 24, 2025 · Programming · 10 views · 7.8

Keywords: Flutter | Multidex | Dependency Conflict | Gradle | Android Build

Abstract: This article provides an in-depth analysis of common Multidex errors in Flutter development, particularly those caused by Google Play services dependency version conflicts. By examining the root causes, it offers solutions including dependency version unification and Gradle configuration optimization, along with practical case studies demonstrating how to diagnose and fix such build issues. The article also discusses the impact of Android API level settings on Multidex, providing comprehensive technical guidance for developers.

Problem Background and Error Analysis

During Flutter project development, developers often encounter Dex build errors when adding multiple dependencies. Typical error messages show: Multiple dex files define Lcom/google/android/gms/internal/zzcew;, indicating duplicate class definition issues. These errors typically occur during the execution of the transformDexArchiveWithDexMergerForDebug task, with the root cause being incompatible Google Play services versions introduced by different dependency packages.

Root Causes of Dependency Conflicts

Through analysis of specific dependency relationships, we find the core issue lies in inconsistent version requirements for Google Play services across different packages. For example, in the sample project, the flutter_google_place_picker package depends on Play Services Places version 11.6.2, while the location package depends on Play Services Location version 11.8.0. This version discrepancy causes the build system to attempt merging two incompatible libraries into the same Dex file, triggering conflicts.

Using Gradle dependency analysis command clearly demonstrates this conflict:

./gradlew androidDependencies

After executing this command, the output displays a dependency tree similar to:

+--- :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

Solution: Dependency Version Unification

The most effective solution involves adding dependency resolution strategy in the android/app/build.gradle file, forcing all related dependencies to use unified versions. Specific implementation:

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'
        force 'com.google.android.gms:play-services-maps:11.8.0'
    }
}

This configuration ensures all Google Play services-related dependencies use the same 11.8.0 version, eliminating version conflict possibilities. Choosing higher versions is generally safer as they include more security fixes and feature updates.

Supplementary Multidex Configuration

While dependency conflicts are the primary issue, proper Multidex configuration remains necessary. Ensure the following configuration in android/app/build.gradle:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

For new projects, setting minSdkVersion to 21 or higher is recommended, as this avoids many traditional Multidex issues since Android 5.0 and above natively support Multidex.

Importance of AndroidX Migration

Modern Flutter projects should enable AndroidX support, which helps resolve many compatibility issues. Add to android/gradle.properties file:

android.useAndroidX=true
android.enableJetifier=true

These settings ensure old support libraries automatically migrate to AndroidX equivalents, reducing dependency conflict occurrences.

Practical Application and Verification

After implementing the above solutions, project rebuild should complete successfully. Recommended to perform complete cleanup and rebuild:

flutter clean
./gradlew clean
flutter build apk --debug

If issues persist, use ./gradlew dependencies command for in-depth dependency tree analysis to identify other potential version conflicts.

Preventive Measures and Best Practices

To avoid similar build issues, developers should when adding new dependencies:

Following these best practices significantly reduces build-time dependency conflict probabilities and improves development efficiency.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.