Что означает "тип программы, уже присутствующий"?
Я пытаюсь создать приложение в Android Studio. После добавления библиотеки Eclipse Paho в качестве зависимости от градиента (или это Maven? Я новичок в экосистеме Android), я получил следующую ошибку:
Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat
Message{kind=ERROR, text=Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat, sources=[Unknown source file], tool name=Optional.of(D8)}
Я проверил множество разных вопросов StackOverflow, связанных с этой ошибкой, но ответы являются специфичными для определенных библиотек. Я ищу не только решение ошибки, но и понимание того, что означает ошибка. Таким образом, людям будет легче найти решения для своих конкретных случаев. Пока ответа не было.
Из других ответов StackOverflow я понял, что это имеет какое-то отношение к моему файлу gradle. Итак, здесь app/build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "---REDACTED FOR PRIVACY---"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation 'com.android.support:support-media-compat:27.1.0'
implementation 'com.android.support:support-v13:27.1.0'
implementation 'com.google.android.gms:play-services-maps:12.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.0.2'
}
repositories {
maven { url 'https://repo.eclipse.org/content/repositories/paho-releases/' }
}
Ответы
Ответ 1
Обычно эта проблема возникает из-за конфликта имен, в вашем случае это библиотека поддержки-v4, которая используется несколькими библиотеками.
Чтобы найти список зависимостей для app
модуля (имя модуля по умолчанию для приложения), мы можем сделать gradlew app:dependencies
для получения списка всех библиотек.
Мы обнаружили, что support-v4
используется:
//short version of the dependencies list highlighting support-v4
+--- com.android.support:support-v13:27.1.0
| \--- com.android.support:support-v4:27.1.0
+--- com.google.android.gms:play-services-maps:12.0.1
| +--- com.google.android.gms:play-services-base:12.0.1
| | +--- com.google.android.gms:play-services-basement:12.0.1
| | | +--- com.android.support:support-v4:26.1.0 -> 27.1.0 (*)
+--- org.eclipse.paho:org.eclipse.paho.android.service:1.0.2
| +--- com.google.android:support-v4:r7 // <- problem here
Мы видим, что поддержка-v4 на Картах будет использовать версию, предоставленную из support-v13.
Мы также видим, что библиотека eclipse использует другую версию (r7??).
Чтобы устранить проблему, вы можете попытаться исключить support-v4
модуля support-v4
из этой библиотеки eclipse следующим образом:
implementation ('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
exclude module: 'support-v4'
}
Затем вы сможете скомпилировать свое приложение.
Кстати, вам следует позаботиться о том, чтобы модуль eclipse не сломался, протестировав ваш код.
Ответ 2
Для меня просто уборка проекта решила вопрос
./gradlew clean
Ответ 3
Из официального документа
Если класс появляется более одного раза в пути к классам среды выполнения, вы получаете сообщение об ошибке, подобное следующему:
Program type already present com.example.MyClass
Эта ошибка обычно возникает из-за одного из следующих обстоятельств:
Бинарная зависимость включает в себя библиотеку, которую ваше приложение также включает в качестве прямой зависимости.
Например, ваше приложение объявляет прямую зависимость от библиотеки A и библиотеки B, но библиотека A уже включает библиотеку B в свой двоичный файл.
Чтобы решить эту проблему, удалите библиотеку B как прямую зависимость.
Ваше приложение имеет локальную двоичную зависимость и удаленную двоичную зависимость от той же библиотеки.
Чтобы решить эту проблему, удалите одну из двоичных зависимостей.
(Посмотрите, добавлена ли та же библиотека как зависимость jar и gradle)
Ответ 4
Это случилось и со мной, но в моем случае я пытаюсь включить разные зависимости, имеющие один и тот же класс, используя debugApi
& Api
, поэтому Android Studio помечена как дублирующий класс, поэтому я решил проблему с помощью debugApi
& releaseApi
, чтобы включить различные зависимости, основанные на варианте сборки.
Ответ 5
Добавить библиотеку поддержки на уровне приложения Gradle file
реализация 'com.android.support:design:27.1.0'
Ответ 6
В моем случае это означает, что у меня есть 2 *.jar файл или 2 библиотеки в исходном коде.
Например: у меня есть 2 youtube.jar
в app/libary
и module/libary
Удалите лишнее один раз, и все будет хорошо