多个dex文件定义<my package>/BuildConfig,找不到原因:

Emi*_*Adz 29 java android gradle dex android-productflavors

我正在使用新的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)
Run Code Online (Sandbox Code Playgroud)

打印依赖项我什么都看不到,这里是:

 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
Run Code Online (Sandbox Code Playgroud)

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

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

这导致一些support-v4库类无法找到的错误,因此这个库不能从任何其他位置编译.

有一件事我脑子里想的,可能会导致这个问题是我使用的事实Flavorsfeautre在oreder创建我有不同的国土资源文件的应用程序的多个版本.

当我查看错误中的文件时,我看到了:

**
* 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";
}
Run Code Online (Sandbox Code Playgroud)

因此,文件的包和String中指定的包不一样.

任何人都可以在我的配置中看到任何可能导致此问题的问题吗?

Mix*_*xaz 76

在我的情况下,发生了类似的错误,因为AndroidManifest.xml文件中有2个具有相同包名的模块.在模块中使用不同的包名解决了这个问题.

当一个库jar在几个模块中被包含两次(或多次)时,也会发生同样的事情,作为依赖.在这种情况下,错误消息说明了以该库的包名称命名的重复配置.我解决了它,将库作为​​依赖项包含在一个模块中,第二个模块依赖于第一个模块.

  • 花了我1.5天才发现这个. (4认同)

ice*_*man 22

将其添加到build.gradle:

android {
    dexOptions {
        preDexLibraries = false
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这种方式没有冲突BuildConfig.java.

编辑:

为什么以上工作:Android工作室将首先dex库之前dex-ing app模块.如果您的库模块与您的应用程序模块具有相同的程序包名称,则此"预处理"将导致在BuildConfig.java与应用程序相同的程序包中创建.

不是'pre-dexing'会减慢你的构建过程,所以我建议你改变你的库的包名.

  • 这解决了我,但为什么!? (2认同)

小智 11

对我来说,只需对项目进行清理即可清除此错误.


Pab*_*rra 7

我在签署我的即时apk时遇到了这个问题。问题:

坏模块/应用程序/manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.stackoverflow">
Run Code Online (Sandbox Code Playgroud)

好:模块/应用程序/manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.stackoverflow.app">
Run Code Online (Sandbox Code Playgroud)

只需在包名末尾添加 .app