Flutter google_sign_in错误:无法合并dex

时间:2018-01-02 12:21:39

标签: android firebase android-gradle flutter

亲爱的Flutter社区,

我正在敲打一个看似简单的任务。 我想在我的应用中添加firebase身份验证。它适用于iOS但是当我尝试为android实现它时,我系统地得到错误:

  

在调试模式下为x86构建的Android SDK上启动lib / main.dart ...   初始化gradle ...解决依赖关系...运行'gradlew   assembleDebug'...在项目':app'中配置'compile'是   弃用。请改用“实施”。 registerResGeneratingTask是   不推荐使用,使用registerGeneratedFolders(FileCollection)   registerResGeneratingTask已弃用,请使用   registerGeneratedFolders(FileCollection)registerResGeneratingTask是   不推荐使用,使用registerGeneratedFolders(FileCollection)配置   项目':google_sign_in'中的'compile'已弃用。使用   相反,“实施”。

     

失败:构建因异常而失败。

     
      
  • 出了什么问题:任务'执行失败':app:transformDexArchiveWithExternalLibsDexMergerForDebug'。

         
        

    java.lang.RuntimeException:java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:无法合并     DEX

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

  •   
  • https://help.gradle.org

  • 获取更多帮助   
     

在34s内建立失败完成错误:Gradle构建失败:1

我使用'flutter create'重现了错误,然后在Firebase之后添加了codelab功能 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
}

App 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(在Mac OS X 10.13.2 17C88上,语言环境fr-BE,通道主站)       •在/ Users / sergebesnard / flutter处晃动       •框架修订版4d2c2aaaa1(6天前),2017-12-27 07:30:31 -0800       •发动机版本7c126001d8       •Tools Dart版本1.25.0-dev.11.0       •Engine Dart版本2.0.0-edge.9e8a3e2d31621c1bdf6139d068e7898a2ac2ab5a

     

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

     

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

     

[✓] Android Studio(3.0版)       •Android Studio / Applications / Android Studio.app/Contents       •Java版OpenJDK运行时环境(版本1.8.0_152-release-915-b08)

     

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

     

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

我显然是Android开发的新手,并且不希望成为专家来使教程正常工作。我发现的每个解决方案都需要修改.gradle files并仅适用于react-native

感谢您的帮助!

9 个答案:

答案 0 :(得分:4)

此错误表示您的某些依赖项使用不同版本的Google Play服务。

您必须降级/升级插件才能统一使用的版本

答案 1 :(得分:3)

我也遇到了同样的问题,并且我读到您必须在app \ build.gradle defaultConfig部分中包含multiDexEnabled true。这对我有用。

答案 2 :(得分:2)

解决:插件和框架之间使用的不兼容版本。 Google SignIn插件0.4.0及更高版本应与最新版本中使用flutter create创建的新项目一起使用。

codelab不再有效,应予以更新。

答案 3 :(得分:1)

这里的问题可能是您依赖的插件具有冲突的gradle依赖性。

这里的答案https://stackoverflow.com/a/49901209/90918提供了如何通过查找冲突的依赖关系并覆盖它们来解决此问题的说明。

引用原始答案:

  

你的两个包似乎在他们的传递依赖关系上存在分歧。   一个想要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'
    }
}

答案 4 :(得分:0)

原因是您使用的依赖关系的版本不同。要解决此问题,请转到您的项目/ App / src /,然后打开Build.gradle。然后在默认配置部分内添加multiDexEnabled true Line。

例如:像这样  defaultConfig {         testInstrumentationRunner“ android.support.test.runner.AndroidJUnitRunner”         multiDexEnabled是     }

答案 5 :(得分:0)

这个link为我解决了同样的问题。

首先,我将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模拟器上运行了。

如果遇到困难,link的演练会更完整。

另外,请注意,我不必将multiDexEnabled设置为true。

答案 6 :(得分:0)

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



最终版本

  • pubspec.yaml
    • cloud_firestore: ^0.8.2+3
  • android / build.gradle
    • classpath 'com.google.gms:google-services:3.2.1' // Google Services plugin
  • android / app / build.gradle
    • targetSdkVersion 27
    • minSdkVersion 21

答案 7 :(得分:0)

我在flutter应用程序中添加了admob_flutter:^ 0.3.4,但未在任何地方使用。从pubspec.yaml文件中删除对我有用。

答案 8 :(得分:0)

我遇到了同样的问题 我在我的 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'
}

它对我有用