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的应用程序中工作?

Solutions Collecting From Web of "Android库项目com.android.dex.DexException:多个dex文件定义Lcom / google / gson / JsonSerializer"

有两种情况需要考虑

  • 首先,考虑删除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 } }