Android库项目com.android.dex.DexException:多个dex文件定义Lcom / google / gson / JsonSerializer

我正在Android Studio中编写一个库项目。 我的gradle文件包括gson凌空play-services等…
当我的库embedded到一个项目中时,我得到:

com.android.dex.DexException:多个dex文件定义Lcom / google / gson / JsonSerializer;

有人可以解释创build库项目时gradle的工作原理吗?
我应该怎样解释集成我的SDK的开发人员,排除模块是如何工作的,以及为什么它不在包括我的aar的应用程序中工作?

  • Android gradle uploadArchivesbuild设时
  • Android Studio中的外部项目链接模块
  • 可以使用带有IntelliJ的Android Gradle Plugin 3.0.0
  • 未解决的参考匕首2 + kotlin + android gradle
  • 为什么Android Studio不允许我创buildJava类?
  • 升级到Android Studio 2.3后,“包android.support.multidex不存在”
  • Vector Drawables标志在支持库24+上不起作用
  • 在Android Studio中使用Gradle中的系统环境variables的正确方法
  • 有两种情况需要考虑

    • 首先,考虑删除Gson,如果你已经在app / build.gradle中声明了它

      dependencies {compile'c​​om.google.code.gson:gson:2.4'}

    • 其次,如果你还没有在你的app/build.gradle你可能需要调查哪个库有重复声明Gson依赖。 那么你可以从该库中排除Gson。 你可能想要检查这个排除传递依赖

    在这里,我将提供一个从库中排除appcompat-v7的例子

    运行此命令以查看依赖关系图表树

     ./gradlew app:dependencies 

    它将显示依赖关系树,如下面的示例

     | \--- com.mikepenz:materialdrawer:4.6.3 | +--- com.android.support:appcompat-v7:23.1.1 (*) | +--- com.android.support:recyclerview-v7:23.1.1 (*) | +--- com.mikepenz:materialize:0.5.1 | | \--- com.android.support:appcompat-v7:23.1.1 (*) | +--- com.mikepenz:iconics-core:2.5.3 | | \--- com.android.support:appcompat-v7:23.1.1 (*) | \--- com.android.support:support-annotations:23.1.1 

    你发现库声明重复依赖。 你可以开始排除它。

     dependencies { compile("com.mikepenz:materialdrawer:4.6.3") { exclude module: 'appcompat-v7' } } 

    Gradle不能神奇地解决这个问题 – 在SDK和用户应用程序中可能有不同版本的相同库 – 这些版本不能合并或以某种方式区分。

    我还开发了使用了几个stream行的第三方库的SDK。 我只是宣布我使用了它们,如果用户还需要它们,那么用户不必在自己的应用程序中为这些依赖项提供jar。 我认为只要您在SDK中提供这些库的最新版本就没有问题。

    1. 避免碰撞的唯一好方法就是改变导入库中的类名 – 但这真的很枯燥乏味。 你也可以使用gradle shadow插件之类的东西来重新定位包,但这对我来说似乎很危险。 它看起来像这样:

    shadowJar { relocate 'com.google.gson', 'shadow.com.google.gson' }

    1. 另外你的开发人员可以unjar你的库,删除gson并将其重新打回。 但是如果他使用其他版本的gson,你的图书馆可能会中断。

    2. 哦,是的,你也可以将你的SDK作为源代码来分发,而不是作为JAR,那么用户就可以把它join到应用程序中,并使用他们想要的任何库。 但是通常你不想公开你的SDK的代码(即使通过库坛很容易反转)。

    dx的–multi-dex选项与pre-dexing库项目不兼容。 因此,如果您的应用程序使用库项目,则需要禁用预分离,然后才能使用–multi-dex。

    要么

    更新你的IDE

    如果删除GSON不适合您,请尝试enablin multidex支持到您的build.gradle文件中:

     android { ... ... defaultConfig { ... ... // Enabling multidex support. multiDexEnabled true } }