Что означает «Тип программы уже присутствует»?

99

Я пытаюсь создать приложение в Android Studio. После добавления библиотеки Eclipse Paho в качестве зависимости gradle (или это 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/' }
} 
user2102929
источник

Ответы:

73

Эта проблема обычно возникает из-за конфликта имен, в вашем случае библиотеки support-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

Мы видим, что support-v4 на Картах будет использовать версию, предоставленную в support-v13.

Мы также видим, что библиотека eclipse использует другую версию (r7 ??).

Чтобы решить вашу проблему, вы можете попробовать исключить модуль support-v4из этой библиотеки eclipse следующим образом:

implementation ('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
    exclude module: 'support-v4'
}

Тогда вы сможете скомпилировать свое приложение.

Кстати, вы должны позаботиться о том, чтобы модуль eclipse не сломался при тестировании вашего кода.

xiaomi
источник
2
У меня было совершенно другое столкновение, но ваш ответ помог мне ПОЛУЧИТЬ идею, что что-то может конфликтовать. Я использовал 2 разных плеера, которые используют Android Exo Player. Может когда-нибудь помочь кому-нибудь. Спасибо!
Vucko
@Vucko Как вы определили столкновение?
Вир Раджпурохит
Благодаря чистой удаче. Я начал исследовать и заметил, что моя библиотека видеоплееров Brightcove использует exoplayer в качестве зависимости. Попытайтесь увидеть, что это может быть для вас.
Vucko
84

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

Используя Терминал :

./gradlew clean

Используя Android Studio :

Build (menu) > Clean Project
MujtabaFR
источник
Правильно! Может это баг студии android.
aolphn
3
В Android Studio это можно сделать также из меню Build > Clean Project.
Сальвадор
1
Для Android Studio также File > Invalidate Caches / Restart > Invalidate and restartможет решить проблему
Макс,
Этот ответ не объясняет, что означает ошибка, о чем и задается вопрос.
user2102929
Я написал ответ много месяцев спустя, просто чтобы поделиться своим опытом с будущими читателями ... они могут искать длинные решения и объяснения, в то время как это может быть решено одним простым шагом .. @ user2102929
MujtabaFR
13

Из официального документа

Если класс появляется более одного раза в пути к классам среды выполнения, вы получите ошибку, подобную следующей:

Program type already present com.example.MyClass

Эта ошибка обычно возникает из-за одного из следующих обстоятельств:

  • Бинарная зависимость включает в себя библиотеку, которую ваше приложение также включает в качестве прямой зависимости.

    Например, ваше приложение декларирует прямую зависимость от библиотеки A и библиотеки B, но библиотека A уже включает библиотеку B в свой двоичный файл. Чтобы решить эту проблему, удалите библиотеку B как прямую зависимость.

  • Ваше приложение имеет локальную двоичную зависимость и удаленную двоичную зависимость от одной и той же библиотеки.

    Чтобы решить эту проблему, удалите одну из двоичных зависимостей. (Посмотрите, добавлена ​​ли такая же библиотека как зависимость jar и gradle)

Манохар Редди
источник
Большое спасибо. 1-й был для меня причиной проблемы. Я использовал compileOnly для повторяющейся библиотеки, которая находится внутри другой библиотеки, которую сборка исключит при сборке.
Monster Brain
4

Это случилось и со мной, но в моем случае я пытаюсь включить различные зависимости, которые имеют один и тот же класс, используя debugApi&, Apiпоэтому Android Studio помечена как повторяющийся класс, поэтому я решил проблему, используя debugApi&, releaseApiчтобы включить различные зависимости на основе варианта сборки.

мексан джуадха
источник
2

Добавить библиотеку поддержки в файл Gradle уровня приложения

реализация 'com.android.support:design:27.1.0'

Фани варма
источник
2

В моем случае это означает, что у меня есть 2 файла * .jar или 2 библиотеки где-то в исходном коде. Например: у меня есть 2 youtube.jarв app/libaryи module/libary удалить лишние разы и это будет хорошо

Kyo Huu
источник
1

Проблема для этой проблемы - если вы используете библиотеку как модуль и ту же библиотеку как зависимость в другой библиотеке.

Пример: LibraryA импортирована как модуль, а такая же LibraryA добавлена ​​как зависимость в любой другой библиотечный модуль.

Как исправить эту проблему?

Решение 1 -> если вы хотите сохранить оба -> Просто измените имя пакета модуля LibraryA

Решение 2 -> удалите зависимость LibraryA и используйте модуль

проект внедрения (': LibraryA')

Ранджит Кумар
источник
0

Надеюсь, это кому-то поможет, у меня сработал проект Build> Clean.

Мики Мират
источник
3
Это решение уже предлагалось в комментариях к другому ответу
Fanick