O que significa “Tipo de programa já presente”?

99

Estou tentando construir um aplicativo no Android Studio. Depois de adicionar a biblioteca Eclipse Paho como uma dependência do Gradle (ou é Maven? Sou novo no ecossistema Android), recebi o seguinte erro:

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

Eu verifiquei muitas perguntas StackOverflow diferentes relacionadas a esse erro, mas as respostas são todas específicas para certas bibliotecas. Estou procurando não apenas uma solução para o erro, mas uma compreensão do que significa o erro . Dessa forma, será mais fácil para as pessoas descobrirem soluções para seus casos específicos. Até agora, nenhuma resposta forneceu isso.

De outras respostas StackOverflow, concluí que tem algo a ver com meu arquivo Gradle. Então, aqui 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/' }
} 
user2102929
fonte

Respostas:

73

Esse problema geralmente vem de um conflito de nomes, no seu caso, a biblioteca support-v4, que é usada por várias bibliotecas.

Para encontrar a lista de dependências para o módulo app(nome do módulo padrão para o aplicativo), podemos fazer um gradlew app:dependenciespara recuperar uma lista de todas as bibliotecas.

Descobrimos que support-v4é usado 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 o support-v4 no Maps usará a versão fornecida pelo support-v13.

Também vemos que a biblioteca do eclipse está usando outra versão (r7 ??).

Para resolver seu problema, você pode tentar excluir o módulo support-v4desta biblioteca eclipse desta forma:

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

Então você deve ser capaz de compilar seu aplicativo.

A propósito, você deve tomar cuidado para que o módulo eclipse não seja interrompido testando seu código.

xiaomi
fonte
2
Eu tive um confronto completamente diferente, mas sua resposta me ajudou a realmente TER a ideia de que algo pode entrar em conflito. Tenho usado 2 jogadores diferentes que usam o Android Exo Player. Pode ajudar alguém algum dia. Obrigado!
Vucko
@Vucko Como você identificou o conflito?
Vir Rajpurohit
Por pura sorte. Comecei a pesquisar e percebi que minha biblioteca do player de vídeo do brightcove usa exoplayer como dependência. Tente ver o que isso pode significar para você.
Vucko,
82

Para mim, apenas limpar o projeto resolveu o problema

Usando o Terminal :

./gradlew clean

Usando o Android Studio :

Build (menu) > Clean Project
MujtabaFR
fonte
Correto! Talvez seja o bug do Android Studio.
aolphn de
3
No Android Studio pode ser feito também a partir do menu Build > Clean Project.
Salvador
1
O Android Studio também File > Invalidate Caches / Restart > Invalidate and restartpode corrigir o problema
máx.
12

Do Doc oficial

Se uma classe aparecer mais de uma vez no caminho de classe do tempo de execução, você receberá um erro semelhante ao seguinte:

Program type already present com.example.MyClass

Esse erro normalmente ocorre devido a uma das seguintes circunstâncias:

  • Uma dependência binária inclui uma biblioteca que seu aplicativo também inclui como uma dependência direta.

    Por exemplo, seu aplicativo declara uma dependência direta da Biblioteca A e da Biblioteca B, mas a Biblioteca A já inclui a Biblioteca B em seu binário. Para resolver esse problema, remova a Biblioteca B como uma dependência direta.

  • Seu aplicativo tem uma dependência binária local e uma dependência binária remota na mesma biblioteca.

    Para resolver esse problema, remova uma das dependências binárias. (Veja se a mesma biblioteca é adicionada como dependência jar e gradle)

Manohar Reddy
fonte
Muito obrigado. O primeiro foi a causa do problema para mim. Usei compileOnly para a biblioteca repetida que está dentro de outra biblioteca, que a compilação irá excluir durante a construção.
Monster Brain
4

Aconteceu comigo também, mas no meu caso, tento incluir diferentes dependências que têm a mesma classe usando debugApi&, Apiportanto, o Android Studio marcado como classe duplicada, então resolvi o problema usando debugApi& releaseApipara incluir diferentes dependências com base na variante de compilação.

Juadha mexicana
fonte
3

Adicionar biblioteca de suporte ao arquivo Gradle de nível de aplicativo

implementação 'com.android.support:design:27.1.0'

Phani Varma
fonte
2

No meu caso, significa que tenho arquivo 2 * .jar ou 2 bibliotecas em algum lugar do código-fonte. Por exemplo: eu tenho 2 youtube.jardentro app/libarye module/libary excluo o redundante uma vez e vai ficar tudo bem

Kyo Huu
fonte
1

Espero que ajude alguém, um projeto Build> Clean funcionou para mim.

Miki Mirat
fonte
3
Esta solução já foi sugerida nos comentários de outra resposta
Fanick
1

Problema para este problema - se você usar a biblioteca como módulo e a mesma biblioteca como dependência em outra biblioteca.

Exemplo: BibliotecaA importada como Módulo e a mesma BibliotecaA adicionada como dependência em qualquer outro módulo de biblioteca.

Como consertar este problema?

Solução 1 -> se você deseja manter ambos -> Apenas refatorar o nome do pacote do módulo LibraryA

Solução 2 -> remover a dependência da BibliotecaA e usar o módulo

projeto de implementação (': LibraryA')

Ranjith Kumar
fonte