多个dex文件定义了<我的包名>/BuildConfig,找不到原因。

33

我正在使用新的Gradle构建系统,但遇到了以下问题:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/kibo/mobi/BuildConfig;
    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)

打印依赖项,我看不到任何东西,这里它们:

 firstDebugCompile - ## Internal use, do not manually configure ##
 \--- KiboGradle:KiboSDK:unspecified
 +--- KiboGradle:TextInputAPI:unspecified
 +--- KiboGradle:VoiceImeUtils:unspecified
 +--- com.google.android.gms:play-services:5.0.77
 |    \--- com.android.support:support-v4:19.1.0
 +--- com.squareup.picasso:picasso:2.3.2
 +--- com.google.code.gson:gson:2.2.4
 \--- com.crittercism:crittercism-android-agent:4.5.1

我尝试验证问题不是重复的支持库,所以我尝试添加:

compile ('com.google.android.gms:play-services:5.0.77'){
    exclude module: 'support-v4'
}

这导致错误,即一些support-v4库类找不到,因此该库无法从任何其他位置进行编译。

我想可能导致此问题的一件事是我使用了Flavors功能,以便使用不同的资源文件创建多个应用程序版本。

当我查看错误文件时,我看到了这个:

**
* Automatically generated file. DO NOT MODIFY
*/
package com.kibo.mobi;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String PACKAGE_NAME = "com.kibo.mobi.test.official";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "liverpool";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
}

因此,文件中的包和指定的字符串值中的包不相同。

有人能看出我的配置中有什么问题可能导致这个问题吗?


这也发生在我身上。有趣的是,从命令行构建是成功的,只有从Studio运行时才会失败。 - Gavriel
6个回答

89

在我的情况下,出现了类似的错误,原因是AndroidManifest.xml文件中有两个具有相同包名的模块。在模块中使用不同的包名解决了这个问题。

当一个库jar被多次包含在几个模块中作为依赖关系时,也会发生同样的情况。在这种情况下,错误消息会指出以该库的包名命名的重复配置。我通过将库包含为一个模块的依赖项,并在第二个模块中将第一个模块作为依赖项解决了这个问题。


顺便说一下,我必须删除库的构建目录。清理而不是删除它... - Kevin Robatel
我在构建一个Android库时遇到了这个问题。我有两个模块(一个库模块和一个示例应用程序模块),它们都具有相同的包名。通过为其中一个模块重命名包名,我成功地解决了这个问题。 - Chirag Maheshwari
5
我花了1.5天才发现这个。 - Elye

24

将以下内容添加到你的 build.gradle 文件中:

android {
    dexOptions {
        preDexLibraries = false
    }
}

我想这样做就不会有冲突的BuildConfig.java了。

编辑:

为什么上述方法有效: Android Studio会先对库进行dex处理,然后再对应用程序模块进行dex处理。如果您的库模块与应用程序模块具有相同的包名称,则此“预处理”将导致在与应用程序相同的包中创建一个BuildConfig.java

注意:“预处理”会稍微减慢构建过程的速度,因此建议您改变库的包名称。


1
它对我有效。我不确定使用这种方法是否会有后果,但它有效。非常感谢!!! - Thai Tran
谢谢!这救了我的命)))))) 只是更改库包名称。 - maXp
不幸的是,这对我没有起作用。如果我更改基本模块名称,那么com.google.gms.google-services就会失败。该死! - Fran Marzoa
非常感谢!这个答案对我有用,你救了我的一天,我的生命。 - Dnyanesh M
'dexOptions(Action<DexOptions>): Unit' is deprecated. Setting dexOptions is obsolete. - YektaDev

11

对我而言,仅对该项目进行一次清理操作即可消除此错误。


8
我在签署我的即时apk时遇到了问题。 问题: bad module/app/manifest.xml。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.stackoverflow">

good: module/app/manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.stackoverflow.app">

只需在软件包名称末尾添加 .app


2

在我的情况下,有两个相同的命名空间。

  1. 点击shift shift进行搜索
  2. 搜索包名,例如com.kibo.mobi,在你的情况下搜索mobi
  3. 你可能会在不同的地方找到两个或更多的位置,请检查错误的位置的build.gradle文件中的android块中的命名空间是否重复

例如:

android {
    namespace 'com.xyz.duplicatedPackage'
}

更改为

android {
    namespace 'com.xyz.yourRightPackageName'
}

1
这也是我的问题,谢谢! - Lee WonJoong

0
如果使用NewRelic,请将其更新至至少5.21.1

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