Flutter的Multidex问题

Spo*_*rNZ 14 android android-gradle-plugin flutter

我在使用Android Studio中的Flutter时使用gradle编译以下错误:

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;
Run Code Online (Sandbox Code Playgroud)

简短的版本

只有在我添加足够的依赖项时才会出现这种情况,如预期的那样.我已启用multidex并build.gradle根据说明(https://developer.android.com/studio/build/multidex.html)在Android项目文件中添加了multidex依赖项,但不知道如何处理第2步中的操作对于Flutter应用程序"为multidex配置应用程序",甚至是否遗漏了该步骤是问题所在.

重新创建的步骤:

  1. File/New/New Flutter Project从工具栏中选择
  2. 选择"颤动应用程序"
  3. 包括Kotlin和Swift支持
  4. 检查应用程序编译并运行
  5. 将以下内容添加到依赖项中pubspec.yaml:

    dependencies:
      flutter_google_place_picker: "^0.0.1"
      location: "^1.2.0"
    
    Run Code Online (Sandbox Code Playgroud)
  6. 点击Packages GetAndroid Studio或flutter packages get在项目目录中运行
  7. 修改android/app/build.gradle以在适当的位置添加以下部分:

    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    android {
        defaultConfig {
            multiDexEnabled true
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  8. Run/Run从工具栏中选择

我试过的其他事情

  1. 用以下各项替换"compile"依赖项build.gradle:

    compile 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support:multidex:1.0.1'
    implementation 'com.android.support:multidex:1.0.3'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 遵循每个依赖项的多索引步骤; 即修改其build.gradle文件,启用multidex并添加multidex依赖项.

  3. build.gradle我的项目及其依赖项的每个文件中将minSdkVersion修改为21和27中的每一个,并为它们启用multidex.
  4. 启用缩小我的项目.
  5. 替换location: "^1.2.0"geolocation: "^0.2.1"
  6. 根本不启用multidex(即跳过重新创建的步骤7).这会导致以下错误:

    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
    
    Run Code Online (Sandbox Code Playgroud)

颤动的医生输出

$ 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!
Run Code Online (Sandbox Code Playgroud)

Boo*_*unz 27

2020 年及以后的初学者开发者更新:

如果您可以将所需的最低 Android API 级别设置为 21(截至撰写本文时,您的应用程序仍将在 94.1% 的设备上运行),那么您所要做的就是:

  1. 打开存在于 [your project]\android\app\build.gradle 的“应用级 build.gradle 文件”

  2. 将 16(或任何适合您的数字)更改为至少 21:

     defaultConfig {
     // ...
     minSdkVersion 16
     // ...
     }
    
    Run Code Online (Sandbox Code Playgroud)

... 到:

defaultConfig {
    // ...
    minSdkVersion 21
    // ...
}
Run Code Online (Sandbox Code Playgroud)

无需进行任何其他修改即可使multidex 正常工作。

显然,新 Flutter 项目的默认 minSDK 设置是 16,因此在 pubspec.yaml 中添加足够的依赖项后,许多新开发人员会遇到 multidex 错误并在线搜索,可能会陷入混乱的信息中,这些信息仅适用于最低级别设置为小于 21。

  • 这是有效的,因为:“如果您的应用程序仅针对 Android 21 或更高版本 (minSdkVersion),则默认情况下已启用 multidex,并且您不需要 multidex 支持库。” (13认同)
  • 节省大量时间!这是最好的解决方案 (5认同)

Yur*_*yac 25

如果您没有开发Android应用程序的经验,则此信息可能会有所帮助,否则您将找不到任何新内容。


如何为扑扑项目启用multidex

1)启用multidex。

打开project/app/build.gradle并添加以下行。

defaultConfig {
    ...

    multiDexEnabled true
}
Run Code Online (Sandbox Code Playgroud)

dependencies {
    ...

    implementation 'com.android.support:multidex:1.0.3'
}
Run Code Online (Sandbox Code Playgroud)

2)启用Jetifier

打开project/android/app/gradle.properties并添加以下行。

android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)

3)创建自定义应用程序类。

如果你不知道在哪里创建该文件做附近MainActivity例如project/android/app/src/main/kotlin(or java if you didn't enable kotlin)/your/great/pakage/appname/

kotlin示例: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)
    }

}
Run Code Online (Sandbox Code Playgroud)

Java示例: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);
    }

}
Run Code Online (Sandbox Code Playgroud)

4)将默认应用程序文件更改为new。

打开 project/android/app/src/main/AndroidManifest.xml

更改android:name="io.flutter.app.FlutterApplication"android:name=".App"

  • 感谢您的精彩回答!但在 Flutter 1.7 中,我“只”需要步骤 1 和 2 即可使多重 dex 正常工作。如果我应用步骤 3 和 4,应用程序实际上会崩溃! (3认同)

小智 11

你的两个软件包似乎不同意它们的传递依赖性.一个想要11.6.+,另一个想要11. +一些播放服务依赖.由于11.6.2和11.8.0都在那里,这最终会导致冲突.

如果./gradlew androidDependenciesandroid/文件夹中运行,则会获得依赖项解析结果的列表,其中包含以下内容:

+--- :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
Run Code Online (Sandbox Code Playgroud)

这些11.6.2和11.8.0软件包不能一起使用.要解决此问题,您需要修补依赖项以使其彼此一致,或者将依赖性覆盖添加到android/app/build.gradle文件的顶级并希望获得最佳:

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'
    }
}
Run Code Online (Sandbox Code Playgroud)


iqf*_*eez 8

从Flutter 2.10开始

Multidex支持会自动启用如果您的应用程序支持低于 21 的 Android SDK 版本,并且超出了 64K 方法限制,只需将标志传递给--multidexor flutter build appbundleflutter build apk您的应用程序将支持 multidex。


S.R*_*hav 6

在 android 内的应用程序文件夹中

defaultConfig {
    ...

    multiDexEnabled true
}
Run Code Online (Sandbox Code Playgroud)

另请查看:为具有超过 64K 方法的应用程序启用 multidex