Android Twitter Fabric SDK 与 Google GSON 冲突

Posted

技术标签:

【中文标题】Android Twitter Fabric SDK 与 Google GSON 冲突【英文标题】:Android Twitter Fabric SDK conflict with Google GSON 【发布时间】:2014-10-23 13:14:49 【问题描述】:

我在将 Twitter Fabric SDK 集成到我的应用时遇到了困难。我按照Twitter tutorial 的步骤进行操作,一切顺利,但是当我尝试使用 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 库,之后一切正常。从 gradle 模块依赖项中删除添加 twitter sdk 的行时也是如此,所以我很确定这两者之间存在某种冲突,我正在寻求解决它。

任何帮助将不胜感激!

如果它对那里的人有任何用处,这里是我的 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 感谢您的回答。那正是我所想 !我将考虑从 Fabric SDK 中删除 Gson,因为我浏览了 SDK 中的每个包,但没有找到类似的东西。您对在 gradle 中从 SDK 中删除 Gson 有任何见解吗? 是的,它会是这样,但与您的相关库:compile('com.google.dexmaker:dexmaker-mockito:1.1') exclude module: 'hamcrest-core' @Blundell 非常感谢,我会尝试 :) @Blundell compile('com.twitter.sdk.android:twitter:1.0.0@aar') transitive = true; exclude module: 'gson' 成功了。您是要发布答案(额外的声誉等)还是要我这样做? 【参考方案1】:

我是一名 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 及其管理依赖项的方式的理解 删除所有“构建”文件后对我有用:),谢谢【参考方案2】:

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'

以上是关于Android Twitter Fabric SDK 与 Google GSON 冲突的主要内容,如果未能解决你的问题,请参考以下文章

Android Fabric Twitter 和数字问题

如何通过 twitter 的 Fabric API (Android) 获取用户数据

如何使用适用于 Android 的 Fabric Sdk 从 Twitter 注销

如何从 android 项目中完全卸载 Twitter 的 Fabric SDK?

使用 twitter fabric sdk for android 显示特定 twitter 个人资料的时间线

Twitter 如何在 Android Studio 中使用 Fabric 插件获取用户个人资料图片