Несколько файлов dex определяют <мой пакет>/BuildConfig, не могут найти причину:

Я использую новую систему сборки 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, не совпадает.

Может ли кто-нибудь увидеть какие-либо проблемы в моей конфигурации, которые могут вызвать эту проблему?

Ответы

Ответ 1

В моем случае подобная ошибка произошла, потому что в файлах AndroidManifest.xml было 2 модуля с тем же именем пакета. Использование разных имен пакетов в модулях решает проблему.

То же самое происходит, когда бит библиотеки включается дважды (или несколько раз) в несколько модулей в качестве зависимости. В этом случае сообщение об ошибке говорит о повторяющихся конфигурациях, названных в честь имени этого библиотечного пакета. Я решил его с включением библиотеки в качестве зависимости в одном модуле, а второй модуль имел в зависимостях первый модуль.

Ответ 2

Добавьте это в свой build.gradle:

android {
    dexOptions {
        preDexLibraries = false
    }
}

Я полагаю, что нет пути к конфликту BuildConfig.java.

EDIT:

Почему это работает: Студия Android сначала будет dex в библиотеках перед расширением модуля приложения. Если у вас есть модуль библиотеки с тем же именем пакета, что и ваш модуль приложения, это "предварительное удаление" приведет к созданию BuildConfig.java в том же пакете, что и для приложения.

Не 'pre-dexing' будет немного замедлить процесс сборки, поэтому я предлагаю вместо этого изменить имя пакета библиотеки.

Ответ 3

Для меня просто очистка от проекта очистила эту ошибку.