Flutter的Multidex问题

时间:2018-04-17 20:05:35

标签: android flutter android-gradle

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

短版

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

重新创建的步骤:

  1. 从工具栏中选择File/New/New Flutter Project
  2. 选择" Flutter Application"
  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. 从工具栏中选择Run/Run
  9. 我试过的其他事情

    1. 更换"编译" 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'
      
    2. 遵循每个依赖项的多索引步骤;即修改他们的build.gradle文件,启用multidex并添加multidex依赖。

    3. 将minSdkVersion修改为项目及其依赖项的每个build.gradle文件中的21和27中的每一个,并为它们启用multidex。
    4. 启用缩小我的项目。
    5. location: "^1.2.0"
    6. 替换geolocation: "^0.2.1"
    7. 根本不启用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
      
    8. 颤动的医生输出

      $ 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!
      

7 个答案:

答案 0 :(得分:21)

2020年面向初学者的更新:

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

  1. 打开您的“应用程序级别build.gradle文件”,该文件位于[您的项目] \ android \ app \ build.gradle

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

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

...到:

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

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

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

答案 1 :(得分:9)

你的两个包似乎在他们的传递依赖关系上存在分歧。一个想要11.6。+,另一个想要11. +一些播放服务依赖。由于11.6.2和11.8.0都在那里,所以最终会发生冲突。

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

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

这些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'
    }
}

答案 2 :(得分:9)

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


如何为抖动项目启用multidex

1)启用多dex。

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

defaultConfig {
    ...

    multiDexEnabled true
}

dependencies {
    ...

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

2)启用Jetifier

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

android.useAndroidX=true
android.enableJetifier=true

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)
    }

}

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);
    }

}

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

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

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

答案 3 :(得分:0)

在android中的应用文件夹中

defaultConfig {
    ...

    multiDexEnabled true
}

还可以检出:Enable multidex for apps with over 64K methods

答案 4 :(得分:0)

在您的应用级别的build.gradle文件中

  1. 将minSdkVersion从16增加到20。

  2. 启用multiDex。

    defaultConfig {
         ...
    
         minSdkVersion 20   //Copy this
         multiDexEnabled true //Copy this  
     }
    

答案 5 :(得分:0)

只需更改app \ build.gradle中的行

rollDie()

不添加任何依赖项 我首先添加了multidex依赖项,但是程序说找不到它 然后,我将maven添加到build.gradle中,但未做任何更改

实际上您需要将false更改为true Android Studio会休息

答案 6 :(得分:-1)

如果您通过USB安装,请确保在设备要求许可时单击安装按钮,这是我的解决方案。