我正在使用新的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
feautre在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";
}
因此文件的包和String中指定的包不一样。
任何人都可以在我的配置中看到可能导致此问题的任何问题吗?
答案 0 :(得分:71)
在我的情况下发生了类似的错误,因为在AndroidManifest.xml文件中有2个具有相同包名的模块。在模块中使用不同的包名解决了这个问题。
当库jar在几个模块中被包含两次(或更多次)时,也会发生同样的事情,作为依赖。在这种情况下,错误消息说明了以该库名称命名的重复配置。我解决了它,将库作为依赖项包含在一个模块中,第二个模块依赖于第一个模块。
答案 1 :(得分:21)
将此添加到build.gradle:
android {
dexOptions {
preDexLibraries = false
}
}
我想这种方式没有冲突的BuildConfig.java
。
修改强>
为什么上述工作原理:
在推出应用模块之前,Android工作室将首先dex这些库。如果您的库模块与应用程序模块具有相同的程序包名称,则此“预处理”将导致在与应用程序相同的程序包中创建BuildConfig.java
。
不会'pre-dexing'会slow down your build process a bit所以我建议您更改图书馆的包名称。
答案 2 :(得分:11)
对我来说,只需对项目进行清理即可清除此错误。
答案 3 :(得分:3)
我在签署即时 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">
好: 模块/应用程序/的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
答案 4 :(得分:0)
如果使用NewRelic,则将其至少更新为:sql_last_start
。