Android Studio Gradle ошибка "Несколько файлов dex определяют..."
Мой проект работал нормально, когда я добавил facebook sdk в свой проект, у меня есть ошибка, подобная этой, я пробовал так много способов исправить это, но я этого не сделал. Что мне делать?
Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: bolts/AggregateException.class
Мое приложение gradle находится ниже
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion '21.1.2'
defaultConfig {
applicationId "com.example.myproject"
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
multiDexEnabled = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile project(':facebook')
}
И вот facebook build.gradle
apply plugin: 'com.android.library'
repositories {
mavenCentral()
}
project.group = 'com.facebook.android'
dependencies {
compile 'com.android.support:support-v4:[21,22)'
compile 'com.parse.bolts:bolts-android:1.1.4'
}
android {
compileSdkVersion 21
buildToolsVersion '21.1.2'
defaultConfig {
minSdkVersion 9
targetSdkVersion 21
}
lintOptions {
abortOnError false
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
apply plugin: 'maven'
apply plugin: 'signing'
def isSnapshot = version.endsWith('-SNAPSHOT')
def ossrhUsername = hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
def ossrhPassword = hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
task setVersion {
// The version will be derived from source
project.version = null
def sdkVersionFile = file('src/com/facebook/FacebookSdkVersion.java')
sdkVersionFile.eachLine{
def matcher = (it =~ /(?:.*BUILD = \")(.*)(?:\".*)/)
if (matcher.matches()) {
project.version = matcher[0][1]
return
}
}
if (project.version.is('unspecified')) {
throw new GradleScriptException('Version could not be found.', null)
}
}
uploadArchives {
repositories.mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
pom.project {
name 'Facebook-Android-SDK'
artifactId = 'facebook-android-sdk'
packaging 'aar'
description 'Facebook Android SDK'
url 'https://github.com/facebook/facebook-android-sdk'
scm {
connection 'scm:[email protected]:facebook/facebook-android-sdk.git'
developerConnection 'scm:[email protected]:facebook/facebook-android-sdk.git'
url 'https://github.com/facebook/facebook-android-sdk'
}
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'https://github.com/facebook/facebook-android-sdk/blob/master/LICENSE.txt'
distribution 'repo'
}
}
developers {
developer {
id 'facebook'
name 'Facebook'
}
}
}
}
}
uploadArchives.dependsOn(setVersion)
signing {
required { !isSnapshot && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
afterEvaluate {
androidJavadocs.classpath += project.android.libraryVariants.toList().first().javaCompile.classpath
}
Ответы
Ответ 1
Теперь они разделяют болты-андроид на болты-приложения и болты-задачи. Так что вам нужно исключить как из gradle build
compile ('com.facebook.android:facebook-android-sdk:4.10.0'){
exclude group: 'com.parse.bolts',
module: 'bolts-tasks'
exclude group: 'com.parse.bolts',
module: 'bolts-applinks';}
Это отлично работает для меня!!!!
Ответ 2
Для меня я добавлял Facebook SDK в качестве проекта и задавал его как зависимости.
Однако, исключить работу после того, как я переключился на использование источника maven.
Я думаю, что это только для maven, а не для зависимостей проекта? (пожалуйста, сообщите правильную информацию, если кто-то знает об этом)
Другими словами, теперь вы можете удалить проект и файлы SDK для Facebook.
не забудьте добавить
repositories {
mavenCentral()
}
если вы не использовали maven.
Итак, build.gradle выглядит так, я прокомментировал путь к проекту.
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':google-play-services_lib')
compile ('com.facebook.android:facebook-android-sdk:3.23.0'){
exclude module: 'bolts-android'
exclude module: 'support-v4'
}
// compile (project(':FacebookSDK')){
// exclude module: 'bolts-android'
// exclude module: 'support-v4'
// }
compile (project(':UserVoiceSDK')){ exclude module: 'support-v4' }
}
Ответ 3
У меня была аналогичная проблема. Это было очень неприятно для меня, потому что все работало нормально, и внезапно оно сломалось без причины.
Проблема намечена на duplicate entry: bolts/AggregateException.class
. Это столкновение библиотеки Bolts, используемое Facebook и Parse.
Для меня проблема заключается в следующих двух строках:
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.parse.bolts:bolts-android:1.1.4'
Я загрузил библиотеки Parse и поместил их в папку /libs/
. Проблема заключалась в том, что в этой папке был еще один файл bolts-android
.
Решение состоит в том, чтобы удалить эту библиотеку и сохранить часть compile 'com.parse.bolts:bolts-android:1.1.4'
.
Альтернативная проблема
В моем случае я использовал compile 'com.parse.bolts:bolts-android:1.+'
вместо конкретной версии. Это всегда берет последнюю версию. Поэтому, когда bolts
обновлен до версии 1.2.0
, вещь просто казалась случайным образом сломанной, потому что внезапно версия в папке /libs/
и последняя версия больше не выровнены.
Лучшая практика заключается в том, чтобы избежать стиля 1.+
, и просто продолжайте проверять и обновлять до последней версии время от времени.
Надеюсь, это поможет кому-то.
Ответ 4
нет необходимости удалять файлы jar. В файле Gradle мы написали эти две строки
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.parse.bolts:bolts-android:1.1.4'
просто удалите
compile fileTree(dir: 'libs', include: ['*.jar'])
потому что мы компилируем все файлы jar, а затем снова включаем болты для компиляции, из-за которых отображается ошибка.
Ответ 5
в моем случае я добавил jar в код библиотеки. библиотека, в свою очередь, используется в основном приложении. dex все еще находился в файле кеша, даже если я очистил свой проект и установил его. Чтобы убедиться, что в главном приложении вы можете проверить количество библиотек. Кэш файл "Project → build → dex-cache → cache.xml". Если у вас несколько счетчиков библиотеки, вам нужно сделать это в Android Studio → Файл → сделать недействительным кеш/перезапуск