Android Twitter Fabric SDK与Google GSON冲突

8

我在将Twitter Fabric SDK集成到我的应用程序时遇到了困难。我按照Twitter教程的步骤操作,一切都很顺利,但是当我尝试使用gradle构建我的项目时,出现了以下错误:

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\Android\android-studio\sdk\build-tools\android-4.4W\dx.bat --dex --output ...
Error Code: 2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/gson/JsonSerializer;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

我尝试从我的应用程序模块lib文件夹中删除静态Gson库,之后一切都很顺利。同样的,当我删除添加Twitter SDK的gradle模块依赖行时,也是如此。所以我相信这两者之间存在某种冲突,并且我正在寻求解决它。
非常感谢任何帮助!
如果这对大家有用的话,这是我的gradle应用程序模块文件:
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

android {
    ...
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            signingConfig signingConfigs.debug
            ext.enableCrashlytics = false
        }
    }
}

repositories {
    jcenter()
    mavenCentral()
    maven{ url 'https://maven.fabric.io/repo'}
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':facebook')
    compile 'com.android.support:support-v13:20.0.0'
    compile 'com.google.android.gms:play-services:6.1.11'
    compile('com.twitter.sdk.android:twitter:1.0.0@aar') {
        transitive = true;
    }
}

Fabric SDK必须在内部使用Gson,因此如果它被公开,您也可以使用它并从/libs/中删除Gson。或者,在Gradle中导入两个库作为依赖项,然后您可以从Fabric中排除Gson - Blundell
@Blundell 感谢您的回答。这正是我想的!我将研究从 Fabric SDK 中删除 Gson,因为我浏览了 SDK 中的每个包,但没有找到类似的东西。您对在 gradle 中从 SDK 中删除 Gson 有什么见解吗? - user3476114
1
是的,就像这样,但使用您相关的库:compile('com.google.dexmaker:dexmaker-mockito:1.1') { exclude module: 'hamcrest-core' } - Blundell
@Blundell 非常感谢,我会尝试的 :) - user3476114
1
@Blundell compile('com.twitter.sdk.android:twitter:1.0.0@aar') { transitive = true; exclude module: 'gson' } 这个方法解决了问题。你想要发布答案(获取额外声望等)还是让我来发布? - user3476114
2个回答

13

我是一名Twitter的Android开发者。

尝试运行./gradlew app:dependencies 命令,查看你的gradle任务的所有依赖关系。编译依赖项将包括类似以下内容:

+--- com.twitter.sdk.android:twitter-core:1.0.0
|    |    +--- com.squareup.retrofit:retrofit:1.6.1
|    |    |    \--- com.google.code.gson:gson:2.2.4
|    |    +--- com.google.code.gson:gson:2.2.4
|    |    \--- io.fabric.sdk.android:fabric:1.0.0

这表明Fabric内部确实使用了GSON。

我的建议是从您的libs/文件夹中删除GSON,并将其作为直接依赖项添加到您的build.gradle中,而不是从Twitter deps图中排除它。您也可以利用构建工具中的依赖解析机制。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])  // Maybe remove this.
    compile project(':facebook')
    compile 'com.android.support:support-v13:20.0.0'
    compile 'com.google.android.gms:play-services:6.1.11'
    compile('com.twitter.sdk.android:twitter:1.0.0@aar') {
        transitive = true;
    }
    compile 'com.google.code.gson:gson:2.2.4'  // Added.
}

你好,感谢你的回答。看起来这是Android Studio/Gradle想要的方式,所以我一定会尝试的 :) 很高兴你帮我完善了对Gradle和它管理依赖项的理解。 - user3476114
删除所有的“Build”文件后,它对我有效,谢谢。 - Hamid Zandi

12

这个 fabric SDK 必须内部使用 Gson,因此如果它被公开了,你也可以使用它并从你的 /libs/ 中移除 Gson。

或者在 Gradle 中将这两个库作为依赖项导入,然后你就可以从 Fabric 中排除 Gson。

像这样从 Fabric 中排除 gson:

compile('com.twitter.sdk.android:twitter:1.0.0@aar') { 
       transitive = true; 
       exclude module: 'gson' 
}

相同的方法也可以用于 Twitter 的其他软件包。例如:compile ('com.twitter.sdk.android:twitter-core:3.1.1') { exclude module: 'gson' } - efkan

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