Що означає «тип програми вже присутній»?


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. Отже, ось додаток / 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/' }
} 

Відповіді:


73

Ця проблема зазвичай виникає внаслідок конфлікту імен, у вашому випадку бібліотеки support-v4, яка використовується декількома бібліотеками.

Щоб знайти список залежностей для модуля app(назва модуля за замовчуванням для програми), ми можемо зробити a 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з цієї бібліотеки затемнення наступним чином:

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

Тоді ви зможете скомпілювати свою заявку.

До речі, слід подбати про те, щоб модуль eclipse не зламався, протестуючи ваш код.


2
У мене було інше зіткнення повністю, але ваша відповідь допомогла мені фактично ОТРИМАТИ думку, що щось може зіткнутися. Я використовую 2 різних програвачі, які використовують Android Exo Player. Може допоможе комусь колись. Дякую!
Вучко

@Vucko Як ви визначили зіткнення?
Vir Rajpurohit

Через чисту удачу. Я почав досліджувати і помітив, що у моїй бібліотеці відеоплеєрів з яскравою ящиком використовується екзоплеєр, оскільки це залежність. Спробуйте зрозуміти, що це може бути для вас.
Вучко

82

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

Використання терміналу :

./gradlew clean

Використання Android Studio :

Build (menu) > Clean Project

Правильно! Можливо, це помилка андроїд-студії.
aolphn

3
В Android Studio це можна зробити також з меню Build > Clean Project.
Сальвадор

1
File > Invalidate Caches / Restart > Invalidate and restartПроблему може вирішити і Android Studio
Макс.

12

З офіційного документу

Якщо клас з'являється більше одного разу на шляху виконання до класу, ви отримуєте помилку, подібну до наведеної нижче:

Program type already present com.example.MyClass

Ця помилка зазвичай виникає внаслідок однієї з таких обставин:

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

    Наприклад, ваш додаток оголошує пряму залежність від бібліотеки A та бібліотеки B, але бібліотека A вже включає бібліотеку B у свій двійковий файл. Щоб вирішити цю проблему, видаліть бібліотеку B як пряму залежність.

  • Ваш додаток має локальну двійкову залежність та віддалену двійкову залежність від тієї самої бібліотеки.

    Щоб вирішити цю проблему, видаліть одну з бінарних залежностей. (Подивіться, чи додано ту саму бібліотеку як залежність jar та gradle)


Дуже дякую. Причиною видачі для мене став перший. Я використовував compileOnly для повторюваної бібліотеки, що знаходиться всередині іншої бібліотеки, яку збірка виключить під час побудови.
Monster Brain

4

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


3

Додайте бібліотеку підтримки до файлу Gradle на рівні програми

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


2

У моєму випадку це означає, що я маю 2 * .jar файл або 2 бібліотеки, десь у вихідному коді. Наприклад: у мене є 2 youtube.jarв app/libaryі module/libary видалити зайві рази і це буде добре


1

Сподіваюся, це комусь допоможе, для мене працював проект «Збірка> Очищення».


3
Це рішення вже пропонувалось у коментарях до іншої відповіді
Фаніка

1

Проблема цього випуску - якщо ви використовуєте бібліотеку як модуль і ту саму бібліотеку як залежність в іншій бібліотеці.

Приклад: LibraryA, імпортований як модуль, і та сама LibraryA, додана як залежність у будь-якому іншому бібліотечному модулі.

Як виправити цю проблему?

Рішення 1 -> якщо ви хочете зберегти обидва -> Просто переформатуйте ім'я пакета модуля LibraryA

Рішення 2 -> видаліть залежність LibraryA та використовуйте модуль

проект реалізації (': LibraryA')

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.