Flutter谷歌登录错误:无法合并dex。

11

亲爱的Flutter社区成员们,

我正在苦思冥想一个看似简单的任务。我想在我的应用程序中添加Firebase身份验证。它在iOS上有效,但是当我尝试在Android上实现时,我总是会遇到以下错误:

使用x86编译的Android SDK模式下启动lib/main.dart... 初始化gradle... 解析依赖项... 运行 'gradlew assembleDebug'... 在项目 ':app'中的配置“compile”已过时,请改用“implementation”。registerResGeneratingTask已过时,请使用registerGeneratedFolders(FileCollection)registerResGeneratingTask已过时,请使用registerGeneratedFolders(FileCollection)registerResGeneratingTask已过时,请使用registerGeneratedFolders(FileCollection)项目':google_sign_in'中的配置“compile”已过时,请改用“implementation”。

失败: 任务执行失败 ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'。

  • 出错了:java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

  • 尝试: 运行--stacktrace选项可获取堆栈跟踪。运行--info或--debug选项以获取更多日志输出。

  • 获取更多帮助请参考https://help.gradle.org

Gradle构建失败,共用时34秒,已结束:1个错误

我按照以下步骤复制了错误:使用'flutter create'创建项目然后按照'Codelab'中的指导添加Firebase功能https://codelabs.developers.google.com/codelabs/flutter-firebase/#4

此处是对'pubspec.yaml'唯一的修改:

dependencies:
  flutter:
    sdk: flutter
  google_sign_in: 0.3.1 # ONLY MODIFICATION
  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.0

通用的build.gradle文件:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.google.gms:google-services:3.1.0' #ONLY MODIF
    }

}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

应用程序 build.gradle 文件:

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withInputStream { stream ->
        localProperties.load(stream)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.3'

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.mycompany.test"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

}

apply plugin: 'com.google.gms.google-services'

以下是Flutter Doctor的输出:

[✓] Flutter(在Mac OS X 10.13.2 17C88,区域设置为fr-BE,渠道为master) • Flutter位于 /Users/sergebesnard/flutter • Framework修订版4d2c2aaaa1(6天前),2017年12月27日07:30:31 -0800 • Engine修订版7c126001d8 • Tools Dart版本1.25.0-dev.11.0 • Engine Dart版本2.0.0-edge.9e8a3e2d31621c1bdf6139d068e7898a2ac2ab5a

[✓] Android工具链 - 用于Android设备的开发(Android SDK 27.0.2) • Android SDK位于 /Users/sergebesnard/Library/Android/sdk • 没有配置Android NDK位置(可选;对于本机分析支持很有用) • 平台android-27,构建工具27.0.2 • Java二进制文件位于:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java版本OpenJDK Runtime Environment(build 1.8.0_152-release-915-b08)

[✓] iOS工具链 - 用于iOS设备的开发(Xcode 9.2) • Xcode位于 /Applications/Xcode.app/Contents/Developer • Xcode 9.2,构建版本9C40b • ios-deploy 1.9.2 • CocoaPods版本1.3.1

[✓] Android Studio(版本3.0) • Android Studio位于 /Applications/Android Studio.app/Contents • Java版本OpenJDK Runtime Environment(build 1.8.0_152-release-915-b08)

[✓] IntelliJ IDEA Community Edition(版本2017.2.5) • Flutter插件版本18.0 • Dart插件版本172.4155.35

[✓] 连接的设备 • Android SDK为x86构建• emulator-5554• android-x86•Android 8.0.0(API 26)(模拟器)

显然,我对Android开发很新,并且不想成为专家才能使教程工作。我找到的每个解决方案都需要修改.gradle文件,仅适用于react-native

感谢您的帮助!


build.gradle 的依赖在哪里? - Aditya
我应该补充一下,我还没有修改源代码,在上述修改之前它能够完美运行。 - Serge B.
@Heisen-Berg,你指的是什么?我复制了整个内容,每个文件都有依赖关系。 - Serge B.
尽管我使用了所有最新的库,但我仍然遇到了这个问题。我发现特别是在应用程序 build.gradle 文件底部包含 apply plugin 行是导致失败的原因。 - JMRboosties
https://dev59.com/TlUL5IYBdhLWcg3wt6IK - Günter Zöchbauer
9个回答

12

我也碰到了同样的问题,后来读到你需要在app\build.gradle的defaultConfig部分包含multiDexEnabled true。这个方法对我起作用了。


8
这个错误意味着你的某些依赖项使用了不同版本的Google Play服务。
您需要降级/升级插件以统一使用的版本。

5

android/app/build.gradle中的minSdkVersion从16更改为21



最终版本

  • pubspec.yaml
    • cloud_firestore: ^0.8.2+3
  • android/build.gradle
    • classpath 'com.google.gms:google-services:3.2.1' // 谷歌服务插件
  • android/app/build.gradle
    • targetSdkVersion 27
    • minSdkVersion 21

3
解决方案:插件和框架之间使用的版本不兼容。 Google SignIn插件0.4.0及以上版本应与使用最新版本的flutter create创建的新项目一起使用。 codelab不再有效,应进行更新。

2
我遇到了同样的问题。在我的App/build.gradle文件中的android/defaultConfig部分,我添加了以下代码行:
    multiDexEnabled true

和依赖项有关

    implementation 'androidx.multidex:multidex:2.0.1'

App/build.gradle看起来像这样:

def localProperties = new Properties()
...

android {
    compileSdkVersion 28

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        ....
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }


flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    .....
    implementation 'androidx.multidex:multidex:2.0.1'
}

它对我有效


2
这个链接对我解决了同样的问题。
首先,我在我的pubspec.yaml中设置了依赖项:
dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^0.8.2 

在我的IDE终端中运行flutter packages get。此外,我还需要更改最小目标SDK版本:
  1. 打开android/app/build.gradle,找到一行写着minSdkVersion 16的代码。
  2. 将该行更改为minSdkVersion 21。
  3. 保存文件。
这可能已经解决了您的问题;但是,由于某些依赖项版本不匹配,我还需要执行以下操作:
我需要打开android/app/build.gradle,然后在文件的最后一行添加以下行:apply plugin: 'com.google.gms.google-services' 接下来,我需要打开android/build.gradle,然后在buildscript标签内添加一个新的依赖项:
buildscript {
   repositories {
       // ...
   }

   dependencies {
       // ...
       classpath 'com.google.gms:google-services:3.2.1'   // new
   }
}

经过这个步骤,我的应用程序终于在Android模拟器上运行。

如果你遇到困难,此链接提供了更详细的指导。

另外需要注意的是,我不需要将multiDexEnabled设置为true。

Original Answer翻译成“最初的回答”


1
这里可能的问题是你所依赖的插件具有冲突的 gradle 依赖关系。
这个 SO 回答 https://dev59.com/TlUL5IYBdhLWcg3wt6IK#49901209 提供了一种解决方法,通过查找冲突的依赖关系并覆盖它们来解决这个问题。
引用原始回答:

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

0

我在我的Flutter应用程序中添加了admob_flutter: ^0.3.4,但没有使用。从pubspec.yaml文件中删除对应的部分对我有效。


0
原因是您正在使用不同版本的依赖项。 要解决此问题,请转到您的项目/App/src/ 并打开 Build.gradle。 然后在默认配置部分中添加 multiDexEnabled true 行。
例如:像这样 defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true }

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