¿Qué significa “Tipo de programa ya presente”?

99

Estoy intentando crear una aplicación en Android Studio. Después de agregar la biblioteca Eclipse Paho como una dependencia de gradle (¿o es Maven? Soy nuevo en el ecosistema de Android), recibí el siguiente error:

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

Revisé muchas preguntas diferentes de StackOverflow relacionadas con este error, pero las respuestas son todas específicas para ciertas bibliotecas. Estoy buscando no solo una solución al error, sino también una comprensión de lo que significa el error . De esa manera, será más fácil para las personas encontrar soluciones para sus casos específicos. Hasta ahora, ninguna respuesta ha proporcionado eso.

De otras respuestas de StackOverflow, he deducido que tiene algo que ver con mi archivo gradle. Entonces, aquí está 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/' }
} 
usuario2102929
fuente

Respuestas:

73

Este problema generalmente proviene de un conflicto de nombres, en su caso, la biblioteca support-v4, que utilizan varias bibliotecas.

Para encontrar la lista de dependencias para el módulo app(el nombre del módulo predeterminado para la aplicación) podemos hacer una gradlew app:dependenciespara recuperar una lista de todas las bibliotecas.

Descubrimos que support-v4es utilizado por:

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

Vemos que support-v4 en Maps usará la versión proporcionada por support-v13.

También vemos que la biblioteca de eclipse está usando otra versión (r7 ??).

Para resolver su problema, puede intentar excluir el módulo support-v4de esta biblioteca de eclipse de esta manera:

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

Entonces debería poder compilar su aplicación.

Por cierto, debe tener cuidado de que el módulo eclipse no se rompa al probar su código.

xiaomi
fuente
2
Tuve un choque completamente diferente, pero tu respuesta me ha ayudado a TENER la idea de que algo puede chocar. He estado usando 2 reproductores diferentes que usan Android Exo Player. Puede ayudar a alguien algún día. ¡Gracias!
Vucko
@Vucko ¿Cómo ha identificado el choque?
Vir Rajpurohit
Por pura suerte. Comencé a investigar y noté que mi biblioteca de reproductores de video Brightcove usa exoplayer como dependencia. Trate de ver qué podría ser para usted.
Vucko
82

Para mí, solo limpiar el proyecto resolvió el problema

Usando Terminal :

./gradlew clean

Usando Android Studio :

Build (menu) > Clean Project
MujtabaFR
fuente
¡Correcto! Tal vez sea el error de Android Studio.
aolphn
3
En Android Studio se puede hacer también desde el menú Build > Clean Project.
Salvador
1
Para Android Studio también File > Invalidate Caches / Restart > Invalidate and restartpuede solucionar el problema
Max
12

Del documento oficial

Si una clase aparece más de una vez en la ruta de clases en tiempo de ejecución, obtiene un error similar al siguiente:

Program type already present com.example.MyClass

Este error suele ocurrir debido a una de las siguientes circunstancias:

  • Una dependencia binaria incluye una biblioteca que su aplicación también incluye como dependencia directa.

    Por ejemplo, su aplicación declara una dependencia directa de la Biblioteca A y la Biblioteca B, pero la Biblioteca A ya incluye la Biblioteca B en su binario. Para resolver este problema, elimine la Biblioteca B como una dependencia directa.

  • Tu aplicación tiene una dependencia binaria local y una dependencia binaria remota en la misma biblioteca.

    Para resolver este problema, elimine una de las dependencias binarias. (Vea si se agrega la misma biblioteca como dependencia de jar y gradle)

Manohar Reddy
fuente
Muchas gracias. El primero fue la causa del problema para mí. Usé compileOnly para la biblioteca repetida que está dentro de otra biblioteca, que la compilación excluirá al compilar.
Monster Brain
4

También me pasó a mí, pero en mi caso, trato de incluir diferentes dependencias que tienen la misma clase usando debugApi& Apientonces Android Studio marcado como clase duplicada, así que resolví el problema usando debugApi& releaseApipara incluir diferentes dependencias basadas en la variante de compilación.

mexan juadha
fuente
3

Agregue la biblioteca de soporte al archivo Gradle de nivel de aplicación

implementación 'com.android.support:design:27.1.0'

Phani varma
fuente
2

En mi caso, significa que tengo 2 archivos * .jar o 2 bibliotecas en algún lugar del código fuente. Por ejemplo: tengo 2 youtube.jaren app/libaryy module/libary elimino el redundante una vez y estará bien

Kyo Huu
fuente
1

Espero que ayude a alguien, un proyecto Build> Clean funcionó para mí.

Miki Mirat
fuente
3
Esta solución ya se sugirió en los comentarios de otra respuesta
Fanick
1

Problema para este problema: si usa la biblioteca como módulo y la misma biblioteca como dependencia en otra biblioteca.

Ejemplo: LibraryA importada como módulo y la misma LibraryA agregada como dependencia en cualquier otro módulo de biblioteca.

¿Cómo arreglar este problema?

Solución 1 -> si desea mantener ambos -> Simplemente refactorice el nombre del paquete del módulo LibraryA

Solución 2 -> elimine la dependencia LibraryA y use el módulo

proyecto de implementación (': LibraryA')

Ranjith Kumar
fuente