多个dex文件定义了BuildConfig

4

我正在将一个项目从Eclipse迁移到Android Studio,遇到了问题。我有许多库模块在不同的项目之间共享,并且其中几个库模块具有相同的包名,因此我会遇到以下错误:

AGPBI: {"kind":"SIMPLE","text":"com.android.dex.DexException: Multiple dex files define Lcom/foo/bar/BuildConfig;","position":{},"original":"com.android.dex.DexException: Multiple dex files define Lcom/foo/bar/BuildConfig;"}

我的依赖关系已经没问题了,所以不是这个问题:

compile - Classpath for compiling the main sources.
+--- project :project1
|    +--- com.mixpanel.android:mixpanel-android:4.6.0
|    \--- com.google.android.gms:play-services-gcm:7.5.0
|         \--- com.google.android.gms:play-services-base:7.5.0
|              \--- com.android.support:support-v4:22.0.0
|                   \--- com.android.support:support-annotations:22.0.0
+--- project :facebook
|    \--- com.parse.bolts:bolts-android:1.1.4
+--- com.google.android.gms:play-services-location:7.5.0
|    \--- com.google.android.gms:play-services-maps:7.5.0
+--- project :project2
|    \--- project :project3
|         \--- project :project4
|              \--- project :project5
+--- project :project6
\--- project :project7

然而,当我搜索我的目录中的BuildConfig.java时,我得到了以下结果:
./project1/build/generated/source/buildConfig/androidTest/debug/com/foo/bar/test/BuildConfig.java
./project1/build/generated/source/buildConfig/debug/com/foo/bar/BuildConfig.java
./project1/build/generated/source/buildConfig/release/com/foo/bar/BuildConfig.java
./project5/build/generated/source/buildConfig/androidTest/debug/com/foo/bar/test/BuildConfig.java
./project5/build/generated/source/buildConfig/debug/com/foo/bar/BuildConfig.java
./project5/build/generated/source/buildConfig/release/com/foo/bar/BuildConfig.java
./project4/build/generated/source/buildConfig/androidTest/debug/com/foo/bar/test/BuildConfig.java
./project4/build/generated/source/buildConfig/debug/com/foo/bar/BuildConfig.java
./project4/build/generated/source/buildConfig/release/com/foo/bar/BuildConfig.java

看起来问题是我有几个共享命名空间的模块。有没有办法解决这个问题?我不想改变其他项目的命名空间。

在典型的模仿编程中,我尝试添加:

dexOptions {
    preDexLibraries = false
}

我在应用程序的build.gradle文件中添加了一个android块,但这只会让情况变得更糟,并且构建开始抱怨其他依赖项。

有没有其他方法可以解决这个问题,而不必重命名包名?

3个回答

9

我通过更改子模块清单中的包名称解决了这个问题,之前我的所有库都使用了相同的名称。


我花了一整天的时间才发现我的一个子模块与我新导入的模块具有相同的包名称。 - Elye

2

我已经定义了一个库项目。我将这个库项目作为依赖项包含在我的主项目中。BuildConfig具有相同的包。

库项目清单文件如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.<companyname>.library.baseapp">

主要项目
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.<companyname>.library.baseapp">

我得到的错误是:
baseapp_android/build/.transforms/23204dbdbf5b7208d6261a7b35e24e97/classes/classes.dex
Type com.<companyname>.library.baseapp.BuildConfig is defined multiple times: /<path>/baseapptest_android/baseapp_android/build/.transforms/23204dbdbf5b7208d6261a7b35e24e97/classes/classes.dex, /<path>/baseapptest_android/baseapp_test/build/intermediates/project_dex_archive/debug/out/com/<companyname>/library/baseapp/BuildConfig.dex
com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: /Users/jsiddharth/AndroidStudioProjects/baseapptest_android/baseapp_android/build/.transforms/23204dbdbf5b7208d6261a7b35e24e97/classes/classes.dex
com.android.tools.r8.utils.b: Type com.<companyname>.library.baseapp.BuildConfig is defined multiple times: /<path>/baseapp_android/build/.transforms/23204dbdbf5b7208d6261a7b35e24e97/classes/classes.dex, /<path>/baseapptest_android/baseapp_test/build/intermediates/project_dex_archive/debug/out/com/<companyname>/library/baseapp/BuildConfig.dex
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 

我将主项目清单(manifest)更改为:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.<companyname>.library.baseapp_test">

它起作用了。


0

主要问题在于这一行

Multiple dex files define Lcom/foo/bar/BuildConfig;

首先尝试从上述位置或libs文件夹中删除AppCompatLibrary

当单个项目依赖项中存在两个相同的库时,会出现此错误。


1
com.foo.bar.BuildConfig不在AppCompatLibrary中。此外,从我的依赖图表中可以看出,那里没有多余的依赖项。而且,从我的依赖图表中可以看出,我没有使用AppCompatLibrary。 - Catherine
这个错误是因为在一个项目的依赖中存在两个相同的库。@Catherine - Asad Mehmood
1
我的依赖项中没有两个相同的库。你可以在我的依赖图上看到这一点。 - Catherine

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