Flutter中的Multidex问题

164

在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;

简短版

只有当我添加足够的依赖项时才会发生这种情况,这是可以预料的。我已经按照说明在Android项目的build.gradle文件中启用了multidex并添加了multidex依赖项(https://developer.android.com/studio/build/multidex.html),但不确定如何处理"为您的应用程序配置multidex"中的步骤2以用于Flutter应用,甚至是否省略了该步骤是问题的原因。

重现步骤:

  1. 从工具栏中选择文件/新建/新的Flutter项目
  2. 选择"Flutter应用程序"
  3. 包括Kotlin和Swift支持
  4. 检查应用程序能够编译和运行
  5. 将以下内容添加到pubspec.yaml文件中的依赖项中:

    dependencies:
      flutter_google_place_picker: "^0.0.1"
      location: "^1.2.0"
    
  6. 在Android Studio中点击Packages Get 或者在项目目录下运行flutter packages get
  7. 修改android/app/build.gradle文件,在适当的位置添加以下部分:

    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    android {
        defaultConfig {
            multiDexEnabled true
        }
    }
    
  8. 从工具栏中选择运行/运行

我尝试过的其他方法

  1. build.gradle中,将"compile"依赖项替换为以下每个依赖项:

    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. 按照多dex步骤处理我的每个依赖项;即修改它们的build.gradle文件,启用multidex并添加multidex依赖。

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

  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
    

    Flutter doctor 输出

    $ 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!
    
17个回答

1
只需更改app\build.gradle中的行。
defaultConfig{
multiDexEnabled true
}

请勿添加任何依赖项 我最初添加了multidex依赖项,但程序显示找不到它 然后我在build.gradle中添加了maven,但没有改变

实际上,您只需要将false更改为true,其他都不需要 Android Studio会处理其余部分


1

将build.gradle更新到minSdkVersion 21

Android 5.0及以上版本使用名为ART的运行时,它本地支持从APK文件加载多个DEX文件。

支持旧版Android

如果您想支持Android 5.0(API级别21)之前的Multidex,请查看上面的文档

enter image description here


0
在 build.gradle 文件中
defaultConfig 
{
minSdkVersion 21
multiDexEnabled true
}


dependencies {
implementation("androidx.multidex:multidex:2.0.1")
}

在 AndroidManifest.xml 中

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

0
在你的应用级别的 build.gradle 文件中。
  1. 将minSdkVersion从16提高到20。

  2. 启用multiDex。

    defaultConfig {
         ...
    
         minSdkVersion 20   //复制此行
         multiDexEnabled true //复制此行  
     }
    

-1

-1
如果您与Stripe的更新包有冲突,那么您需要在pubspec.yaml文件中将以下行注释掉: stripe_payment: ^1.1.4

-2
如果您正在通过USB安装,请确保在设备请求权限时单击安装按钮,这是我遇到的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接