Was bedeutet "Programmtyp bereits vorhanden"?

99

Ich versuche eine App in Android Studio zu erstellen. Nach dem Hinzufügen der Eclipse Paho-Bibliothek als Gradle-Abhängigkeit (oder ist es Maven? Ich bin neu im Android-Ökosystem) wurde der folgende Fehler angezeigt:

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)}

Ich habe viele verschiedene StackOverflow-Fragen zu diesem Fehler geprüft, aber die Antworten sind alle spezifisch für bestimmte Bibliotheken. Ich suche nicht nur nach einer Lösung für den Fehler, sondern auch nach einem Verständnis dessen, was der Fehler bedeutet . Auf diese Weise können die Menschen leichter Lösungen für ihre speziellen Fälle finden. Bisher hat dies keine Antwort geliefert.

Aus anderen StackOverflow-Antworten habe ich herausgefunden, dass dies etwas mit meiner Gradle-Datei zu tun hat. Also, hier ist 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
quelle

Antworten:

73

Dieses Problem ist normalerweise auf einen Namenskonflikt zurückzuführen, in Ihrem Fall auf die support-v4-Bibliothek, die von mehreren Bibliotheken verwendet wird.

Um die Liste der Abhängigkeiten für das Modul zu finden app(Name des Standardmoduls für die App), können Sie gradlew app:dependencieseine Liste aller Bibliotheken abrufen.

Wir haben festgestellt, dass support-v4verwendet wird von:

//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

Wir sehen, dass support-v4 auf Maps die von support-v13 bereitgestellte Version verwendet.

Wir sehen auch, dass die Eclipse-Bibliothek eine andere Version verwendet (r7 ??).

Um Ihr Problem zu beheben, können Sie versuchen, das Modul support-v4wie folgt aus dieser Eclipse-Bibliothek auszuschließen :

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

Dann sollten Sie in der Lage sein, Ihre Anwendung zu kompilieren.

Übrigens sollten Sie darauf achten, dass das Eclipse-Modul nicht durch Testen Ihres Codes beschädigt wird.

Xiaomi
quelle
2
Ich hatte einen völlig anderen Konflikt, aber Ihre Antwort hat mir tatsächlich geholfen, die Idee zu bekommen, dass etwas zusammenstoßen könnte. Ich habe 2 verschiedene Player verwendet, die Android Exo Player verwenden. Kann jemandem eines Tages helfen. Vielen Dank!
Vucko
@Vucko Wie haben Sie Zusammenstoß identifiziert?
Vir Rajpurohit
Durch reines Glück. Ich begann zu recherchieren und bemerkte, dass meine Brightcove-Video-Player-Bibliothek Exoplayer als Abhängigkeit verwendet. Versuchen Sie zu sehen, was das für Sie sein könnte.
Vucko
82

Für mich löste das Reinigen des Projekts das Problem

Mit Klemme :

./gradlew clean

Verwenden von Android Studio :

Build (menu) > Clean Project
MujtabaFR
quelle
Richtig! Vielleicht ist es der Fehler von Android Studio.
Aolphn
3
In Android Studio kann auch über das Menü erfolgen Build > Clean Project.
Salvador
1
Für Android Studio File > Invalidate Caches / Restart > Invalidate and restartkann das Problem ebenfalls
Max
12

Aus dem offiziellen Doc

Wenn eine Klasse mehr als einmal im Laufzeitklassenpfad angezeigt wird, wird ein Fehler angezeigt, der dem folgenden ähnelt:

Program type already present com.example.MyClass

Dieser Fehler tritt normalerweise aufgrund eines der folgenden Umstände auf:

  • Eine binäre Abhängigkeit enthält eine Bibliothek, die Ihre App auch als direkte Abhängigkeit enthält.

    Beispielsweise deklariert Ihre App eine direkte Abhängigkeit von Bibliothek A und Bibliothek B, aber Bibliothek A enthält Bibliothek B bereits in ihrer Binärdatei. Entfernen Sie Bibliothek B als direkte Abhängigkeit, um dieses Problem zu beheben.

  • Ihre App hat eine lokale binäre Abhängigkeit und eine entfernte binäre Abhängigkeit von derselben Bibliothek.

    Entfernen Sie eine der binären Abhängigkeiten, um dieses Problem zu beheben. (Überprüfen Sie, ob dieselbe Bibliothek als JAR- und Gradle-Abhängigkeit hinzugefügt wurde.)

Manohar Reddy
quelle
Vielen Dank. Der erste war der Grund für mich. Ich habe compileOnly für die wiederholte Bibliothek verwendet, die sich in einer anderen Bibliothek befindet, die der Build beim Erstellen ausschließt.
Monster Brain
4

Es ist auch mir passiert ist, aber in meinem Fall, ich versuche , verschiedene Abhängigkeiten enthalten , die gleiche Klasse haben mit debugApi& Apiso Android Studio als doppelte Klasse markiert, so dass ich das Problem gelöst , indem Sie debugApi& releaseApiverschiedenen Abhängigkeiten sind auf der Build - Variante basiert.

mexikanische Juadha
quelle
3

Fügen Sie die Support-Bibliothek zur Gradle-Datei auf App-Ebene hinzu

Implementierung 'com.android.support:design:27.1.0'

Phani Varma
quelle
2

In meinem Fall bedeutet dies, dass ich 2 * .jar-Dateien oder 2 Bibliotheken habe, von denen einige im Quellcode enthalten sind. Zum Beispiel: Ich habe 2 youtube.jarin app/libaryund module/libary lösche die redundante einmal und es wird in Ordnung sein

Kyo Huu
quelle
1

Ich hoffe es hilft jemandem, ein Build> Clean Projekt hat für mich funktioniert.

Miki Mirat
quelle
3
Diese Lösung wurde bereits in Kommentaren einer anderen Antwort vorgeschlagen
Fanick
1

Problem für dieses Problem - Wenn Sie die Bibliothek als Modul und dieselbe Bibliothek als Abhängigkeit in einer anderen Bibliothek verwenden.

Beispiel: LibraryA als Modul & gleiche LibraryA importiert als Abhängigkeit in einem anderen Bibliotheksmodul hinzugefügt.

Wie kann ich dieses Problem beheben?

Lösung 1 -> wenn Sie beide behalten möchten -> Überarbeiten Sie einfach den Paketnamen des LibraryA- Moduls

Lösung 2 -> Entfernen Sie die LibraryA- Abhängigkeit und verwenden Sie das Modul

Implementierungsprojekt (': LibraryA')

Ranjith Kumar
quelle