Android Studio Несколько файлов dex gradle ошибка
Я получаю эту ошибку, когда я запускаю- > приложение для приложения Android в Android Studio
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/common/annotations/Beta;
...
И вот вывод gradlew -q: app: dependments
+--- project :shared
+--- com.google.api-client:google-api-client:1.19.0
| +--- com.google.oauth-client:google-oauth-client:1.19.0
| | +--- com.google.http-client:google-http-client:1.19.0
| | | +--- com.google.code.findbugs:jsr305:1.3.9
| | | \--- org.apache.httpcomponents:httpclient:4.0.1
| | | +--- org.apache.httpcomponents:httpcore:4.0.1
| | | +--- commons-logging:commons-logging:1.1.1
| | | \--- commons-codec:commons-codec:1.3
| | \--- com.google.code.findbugs:jsr305:1.3.9
| +--- com.google.http-client:google-http-client-jackson2:1.19.0
| | +--- com.google.http-client:google-http-client:1.19.0 (*)
| | \--- com.fasterxml.jackson.core:jackson-core:2.1.3
| \--- com.google.guava:guava-jdk5:13.0
+--- com.google.http-client:google-http-client-gson:1.19.0
| \--- com.google.code.gson:gson:2.1
+--- com.google.api-client:google-api-client-android:1.19.0
| +--- com.google.api-client:google-api-client:1.19.0 (*)
| \--- com.google.http-client:google-http-client-android:1.19.0
| \--- com.google.http-client:google-http-client:1.19.0 (*)
+--- com.google.http-client:google-http-client-android:1.19.0 (*)
+--- com.google.guava:guava:14.0.+ -> 14.0.1
+--- project :backend-appengine
| \--- com.google.api-client:google-api-client-android:1.19.0 (*)
+--- com.android.support:appcompat-v7:20.0.0
| \--- com.android.support:support-v4:20.0.0
| \--- com.android.support:support-annotations:20.0.0
+--- com.google.android.gms:play-services:5.0.89
\--- com.google.maps.android:android-maps-utils:0.3.+ -> 0.3.1
Вот блок зависимостей от build.gradle
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':shared')
// Add the Google API client library.
compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
// Exclude artifacts that the Android SDK/Runtime provides.
exclude(group: 'com.google.guava') //-- !!! this does not seem to work !!!
exclude(group: 'xpp3', module: 'xpp3')
exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
exclude(group: 'junit', module: 'junit')
exclude(group: 'com.google.android', module: 'android')
exclude(group: 'com.google.http-client', module: 'google-http-client')
}
compile('com.google.http-client:google-http-client-gson:1.19.0') {
exclude module: 'httpclient'
exclude(group: 'com.google.http-client', module: 'google-http-client')
}
compile(group: 'com.google.api-client', name: 'google-api-client-android', version: '1.19.0') {
exclude(group: 'com.google.android.gms', module: 'play-services')
exclude group: 'com.google.guava', module: 'guava-jdk5'
}
compile(group: 'com.google.http-client', name: 'google-http-client-android', version: '1.19.0') {
exclude(group: 'com.google.android', module: 'android')
}
// This is used by the Google HTTP client library.
compile(group: 'com.google.guava', name: 'guava', version: '14.0.+')
//-- endpoints
dependencies {
compile project(path: ':backend-appengine', configuration: 'android-endpoints')
}
compile 'com.android.support:appcompat-v7:20.0.0'
compile ('com.google.android.gms:play-services:5.0.89') {
exclude(group: 'com.android.support', module: 'support-v4')
}
compile ('com.google.maps.android:android-maps-utils:0.3.+') {
exclude(group: 'com.google.android.gms', module: 'play-services')
}
}
Ответы
Ответ 1
Пакет com.google.common.annotations
кажется частью Guava. Я вижу это в зависимостях дважды в несколько разных вариантах: один раз как часть Клиента API Google, один раз в качестве вашей собственной зависимости:
+--- com.google.api-client:google-api-client:1.19.0
| \--- com.google.guava:guava-jdk5:13.0
и
+--- com.google.guava:guava:14.0.+ -> 14.0.1
Таким образом, причиной этой ошибки является то, что у вас есть те же классы, которые определены в нескольких файлах dex (в разных вариантах библиотеки Guava), которые включены вашими другими зависимостями. Вам нужно найти способ исключить эти дублированные зависимости или, возможно, просто обеспечить, чтобы вы использовали одну и ту же версию для всех зависимостей.
Одна вещь, которую вы могли бы попробовать, - исключить модуль guava из одной из зависимостей. Итак, если у вас установлен модуль API-клиента, добавьте правило исключения для модуля guava:
compile ('com.google.api-client:google-api-client:1.19.0') {
exclude group: 'com.google.guava', module: 'guava-jdk5'
}
Я не могу гарантировать, что это не вызовет проблем для клиентской библиотеки Google API (так как это две разные версии Guava), но стоит попробовать.
РЕДАКТИРОВАТЬ: Из ваших настроек попробуйте изменить это:
compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
// Exclude artifacts that the Android SDK/Runtime provides.
exclude(group: 'com.google.guava') //-- !!! this does not seem to work !!!
в
compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
exclude(group: 'com.google.guava', module: 'guava-jdk5')
Библиотека google-api-client-android фактически не содержит Guava - я не понимал, что у вас есть две аналогичные зависимости.
Ответ 2
Для тех, кто использует конечные точки Google Cloud в приложении Android:
compile(project(path: ':backend', configuration: 'android-endpoints')) {
exclude(module: 'guava-jdk5')
}
Где backend
- это имя вашего модуля с приложением AppEngine.
В любом другом случае просто найдите транзитивную зависимость guava-jdk5
и исключите ее.
Ответ 3
Кажется, вы не можете использовать как guava, так и guava-jdk5 в одном проекте. Guava-jdk5 по-прежнему поддерживается, поэтому рассмотрите возможность изменения ссылки на проект guava на guava-jdk5:
compile 'com.google.guava:guava-jdk5:17.0'
Ответ 4
Вот правильное решение, работающее для меня. Исключение модуля зависимости guava-jdk5 от каждого отдельного импорта является контрпродуктивным (для меня это не сработало, потому что у меня были некоторые внутренние зависимости, исходящие из моего бэкэнд, от которых зависит мое приложение, и это открывает реальную проблему при таком подходе).
Следующее решение проблемы и рекомендуемый подход:
configurations {
all*.exclude group: 'com.google.guava', module: 'guava-jdk5'
}
Источник: https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html