Co oznacza „typ programu już obecny”?

99

Próbuję zbudować aplikację w Android Studio. Po dodaniu biblioteki Eclipse Paho jako zależności gradle (czy może to Maven? Jestem nowy w ekosystemie Androida), otrzymałem następujący błąd:

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

Sprawdziłem wiele różnych pytań StackOverflow związanych z tym błędem, ale wszystkie odpowiedzi są specyficzne dla niektórych bibliotek. Szukam nie tylko rozwiązania błędu, ale zrozumienia, co oznacza błąd . W ten sposób ludziom łatwiej będzie znaleźć rozwiązania dla ich konkretnych przypadków. Jak dotąd żadna odpowiedź tego nie zapewniła.

Z innych odpowiedzi StackOverflow wywnioskowałem, że ma to coś wspólnego z moim plikiem gradle. Oto 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
źródło

Odpowiedzi:

73

Ten problem zwykle wynika z konfliktu nazw, w twoim przypadku biblioteki support-v4, z której korzysta kilka bibliotek.

Aby znaleźć listę zależności dla modułu app(domyślna nazwa modułu dla aplikacji), możemy wykonać a, gradlew app:dependenciesaby pobrać listę wszystkich bibliotek.

Odkryliśmy, że support-v4jest używany przez:

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

Widzimy, że support-v4 w Mapach będzie używał wersji dostarczonej z support-v13.

Widzimy również, że biblioteka eclipse używa innej wersji (r7 ??).

Aby rozwiązać problem, możesz spróbować wykluczyć moduł support-v4z tej biblioteki eclipse w następujący sposób:

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

Wtedy powinieneś być w stanie skompilować swoją aplikację.

Przy okazji powinieneś uważać, aby moduł eclipse nie zepsuł się podczas testowania kodu.

xiaomi
źródło
2
Miałem zupełnie inny konflikt, ale Twoja odpowiedź pomogła mi faktycznie POZNAĆ, że coś może się zderzyć. Używałem 2 różnych odtwarzaczy, które używają Android Exo Player. Może kiedyś komuś pomóc. Dzięki!
Vucko,
@Vucko Jak zidentyfikowałeś konflikt?
Vir Rajpurohit
Przez zwykłe szczęście. Zacząłem badać i zauważyłem, że moja biblioteka odtwarzacza wideo Brightcove używa exoplayer, ponieważ jest zależna. Spróbuj zobaczyć, co to może być dla Ciebie.
Vucko,
84

U mnie samo wyczyszczenie projektu rozwiązało problem

Korzystanie z terminala :

./gradlew clean

Korzystanie z Android Studio :

Build (menu) > Clean Project
MujtabaFR
źródło
Prawidłowo! Może to błąd studia Android.
aolphn
3
W Android Studio można to zrobić również z poziomu menu Build > Clean Project.
Salvador
1
W przypadku Androida Studio File > Invalidate Caches / Restart > Invalidate and restartmoże również rozwiązać problem
maksymalnie
Ta odpowiedź nie wyjaśnia, co oznacza błąd, o co chodzi w pytaniu.
user2102929
Napisałem odpowiedź wiele miesięcy później, aby podzielić się swoim doświadczeniem z przyszłymi czytelnikami ... mogą szukać długich rozwiązań i wyjaśnień, a można to rozwiązać jednym prostym krokiem. @ User2102929
MujtabaFR
13

Od oficjalnego Doc

Jeśli klasa pojawia się więcej niż raz w ścieżce klas środowiska wykonawczego, pojawia się błąd podobny do następującego:

Program type already present com.example.MyClass

Ten błąd zwykle występuje z powodu jednej z następujących okoliczności:

  • Zależność binarna obejmuje bibliotekę, którą aplikacja zawiera również jako bezpośrednią zależność.

    Na przykład aplikacja deklaruje bezpośrednią zależność od biblioteki A i biblioteki B, ale biblioteka A zawiera już bibliotekę B w swoim pliku binarnym. Aby rozwiązać ten problem, usuń bibliotekę B jako bezpośrednią zależność.

  • Twoja aplikacja ma lokalną zależność binarną i zdalną zależność binarną w tej samej bibliotece.

    Aby rozwiązać ten problem, usuń jedną z zależności binarnych. (Zobacz, czy ta sama biblioteka jest dodana jako zależność jar i gradle)

Manohar Reddy
źródło
Wielkie dzięki. Pierwsza była przyczyną problemu dla mnie. Użyłem compileOnly dla powtarzanej biblioteki, która znajduje się w innej bibliotece, którą kompilacja wykluczy podczas budowania.
Monster Brain
4

Przydarzyło mi się to również, ale w moim przypadku próbuję uwzględnić różne zależności, które mają tę samą klasę, używając debugApi&, Apiwięc Android Studio jest oznaczone jako zduplikowana klasa, więc rozwiązałem problem, używając debugApi&, releaseApiaby uwzględnić różne zależności w zależności od wariantu kompilacji.

mexan juadha
źródło
2

Dodaj bibliotekę obsługi do pliku Gradle na poziomie aplikacji

wdrożenie „com.android.support:design:27.1.0”

Phani varma
źródło
2

W moim przypadku oznacza to, że mam 2 pliki * .jar lub 2 biblioteki gdzieś w kodzie źródłowym. Na przykład: mam 2 youtube.jarw app/libaryi module/libary Usuń zbędne raz i będzie dobrze

Kyo Huu
źródło
1

Problem związany z tym problemem - jeśli używasz biblioteki jako modułu i tej samej biblioteki jako zależności w innej bibliotece.

Przykład: Biblioteka A zaimportowana jako moduł i ta sama biblioteka A dodana jako zależność w dowolnym innym module biblioteki.

Jak rozwiązać ten problem?

Rozwiązanie 1 -> jeśli chcesz zachować oba -> Po prostu zmodyfikuj nazwę pakietu LibraryA modułu

Rozwiązanie 2 -> usuń zależność LibraryA i użyj modułu

projekt wdrożeniowy (': LibraryA')

Ranjith Kumar
źródło
0

Mam nadzieję, że to komuś pomoże, projekt Build> Clean działał dla mnie.

Miki Mirat
źródło
3
To rozwiązanie zostało już zasugerowane w komentarzach do innej odpowiedzi
Fanick