Cosa significa "Tipo di programma già presente"?


99

Sto cercando di creare un'app in Android Studio. Dopo aver aggiunto la libreria Eclipse Paho come dipendenza gradle (o è Maven? Sono nuovo nell'ecosistema Android), ho ricevuto il seguente errore:

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

Ho controllato molte domande StackOverflow diverse relative a questo errore, ma le risposte sono tutte specifiche per determinate librerie. Non sto cercando solo una soluzione all'errore, ma una comprensione del significato dell'errore . In questo modo sarà più facile per le persone trovare soluzioni per i loro casi specifici. Finora, nessuna risposta lo ha fornito.

Da altre risposte di StackOverflow, ho capito che ha qualcosa a che fare con il mio file gradle. Quindi, ecco 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/' }
} 

Risposte:


73

Questo problema di solito deriva da un conflitto di denominazione, nel tuo caso la libreria support-v4, che viene utilizzata da diverse librerie.

Per trovare l' elenco delle dipendenze per il modulo app(nome del modulo predefinito per l'app) possiamo fare a gradlew app:dependenciesper recuperare un elenco di tutte le librerie.

Abbiamo scoperto che support-v4viene utilizzato da:

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

Vediamo che support-v4 su Maps utilizzerà la versione fornita da support-v13.

Vediamo anche che la libreria eclipse usa un'altra versione (r7 ??).

Per risolvere il tuo problema, puoi provare a escludere il modulo support-v4da questa libreria di eclissi in questo modo:

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

Quindi dovresti essere in grado di compilare la tua applicazione.

A proposito, dovresti fare attenzione che il modulo eclipse non si rompa testando il tuo codice.


2
Ho avuto uno scontro completamente diverso, ma la tua risposta mi ha aiutato a AVERE l'idea che qualcosa potrebbe scontrarsi. Ho utilizzato 2 diversi lettori che utilizzano Android Exo Player. Può aiutare qualcuno un giorno. Grazie!
Vucko

@Vucko Come hai identificato lo scontro?
Vir Rajpurohit

Per pura fortuna. Ho iniziato a fare ricerche e ho notato che la mia libreria del lettore video brightcove utilizza exoplayer in quanto dipendenza. Prova a vedere cosa potrebbe essere per te.
Vucko

84

Per me la semplice pulizia del progetto ha risolto il problema

Utilizzando il terminale :

./gradlew clean

Utilizzando Android Studio :

Build (menu) > Clean Project

Corretto! Forse è un bug di Android Studio.
aolphn

3
In Android Studio può essere fatto anche dal menu Build > Clean Project.
Salvador

1
Anche per Android Studio File > Invalidate Caches / Restart > Invalidate and restartpuò risolvere il problema
massimo

Questa risposta non spiega cosa significa l'errore, che è ciò che la domanda sta chiedendo.
user2102929

Ho scritto la risposta molti mesi dopo, solo per condividere la mia esperienza con i futuri lettori .. potrebbero cercare lunghe soluzioni e spiegazioni, mentre può essere risolto con un semplice passaggio .. @ user2102929
MujtabaFR

13

Dal Doc. Ufficiale

Se una classe viene visualizzata più di una volta nel percorso classi di runtime, viene visualizzato un errore simile al seguente:

Program type already present com.example.MyClass

Questo errore si verifica in genere a causa di una delle seguenti circostanze:

  • Una dipendenza binaria include una libreria che l'app include anche come dipendenza diretta.

    Ad esempio, la tua app dichiara una dipendenza diretta dalla libreria A e dalla libreria B, ma la libreria A include già la libreria B nel suo file binario. Per risolvere questo problema, rimuovere la libreria B come dipendenza diretta.

  • La tua app ha una dipendenza binaria locale e una dipendenza binaria remota dalla stessa libreria.

    Per risolvere questo problema, rimuovere una delle dipendenze binarie. (Verifica se la stessa libreria viene aggiunta come dipendenza jar e gradle)


Molte grazie. Il primo era la causa del problema per me. Ho usato compileOnly per la libreria ripetuta che si trova all'interno di un'altra libreria, che la build escluderà durante la creazione.
Monster Brain

4

È successo anche a me, ma nel mio caso, cerco di includere dipendenze diverse che hanno la stessa classe utilizzando debugApie Apiquindi Android Studio contrassegnato come classe duplicata, quindi ho risolto il problema utilizzando debugApie releaseApiper includere dipendenze diverse in base alla variante di build.


2

Aggiungi la libreria di supporto al file Gradle a livello di app

implementazione "com.android.support:design:27.1.0"


2

Nel mio caso significa che ho un file 2 * .jar o 2 librerie da qualche parte nel codice sorgente. Ad esempio: ho 2 youtube.jarin app/libaryed module/libary Elimina il ridondante una volta e andrà bene


1

Problema per questo problema: se si utilizza la libreria come modulo e la stessa libreria come dipendenza in un'altra libreria.

Esempio: LibreriaA importata come Modulo e stessa LibreriaA aggiunta come dipendenza in qualsiasi altro modulo di libreria.

Come risolvere questo problema?

Soluzione 1 -> se vuoi mantenerli entrambi -> Rifattorizza semplicemente il nome del pacchetto del modulo LibraryA

Soluzione 2 -> rimuovi la dipendenza LibraryA e usa il modulo

progetto di implementazione (': LibraryA')


0

Spero che aiuti qualcuno, un progetto Build> Clean ha funzionato per me.


3
Questa soluzione è già stata suggerita nei commenti di un'altra risposta
Fanick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.