Que signifie «type de programme déjà présent»?

99

J'essaie de créer une application dans Android Studio. Après avoir ajouté la bibliothèque Eclipse Paho en tant que dépendance gradle (ou est-ce Maven? Je suis nouveau dans l'écosystème Android), j'ai l'erreur suivante:

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

J'ai vérifié de nombreuses questions StackOverflow relatives à cette erreur, mais les réponses sont toutes spécifiques à certaines bibliothèques. Je cherche non seulement une solution à l'erreur, mais une compréhension de ce que signifie l'erreur . De cette façon, il sera plus facile pour les gens de trouver des solutions pour leurs cas spécifiques. Jusqu'à présent, aucune réponse n'a fourni cela.

À partir d'autres réponses StackOverflow, j'ai compris que cela avait quelque chose à voir avec mon fichier gradle. Alors, voici 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
la source

Réponses:

73

Ce problème vient généralement d'un conflit de noms, dans votre cas la bibliothèque support-v4, qui est utilisée par plusieurs bibliothèques.

Pour trouver la liste des dépendances pour le module app(nom du module par défaut pour l'application), nous pouvons faire un gradlew app:dependenciespour récupérer une liste de toutes les bibliothèques.

Nous avons constaté qu'il support-v4est utilisé par:

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

Nous voyons que le support-v4 sur Maps utilisera la version fournie par support-v13.

On voit aussi que la bibliothèque eclipse utilise une autre version (r7 ??).

Pour résoudre votre problème, vous pouvez essayer d'exclure le module support-v4 de cette bibliothèque eclipse comme ceci:

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

Ensuite, vous devriez être en mesure de compiler votre application.

Btw, vous devez vous assurer que le module eclipse ne se cassera pas en testant votre code.

xiaomi
la source
2
J'ai eu un affrontement complètement différent, mais votre réponse m'a aidé à avoir réellement l'idée que quelque chose peut entrer en conflit. J'utilise 2 joueurs différents qui utilisent Android Exo Player. Peut aider quelqu'un un jour. Merci!
Vucko
@Vucko Comment avez-vous identifié le choc?
Vir Rajpurohit
Par pure chance. J'ai commencé des recherches et j'ai remarqué que ma bibliothèque de lecteurs vidéo Brightcove utilise exoplayer comme dépendance. Essayez de voir ce que cela pourrait être pour vous.
Vucko
82

Pour moi juste nettoyer du projet a résolu le problème

Utilisation du terminal :

./gradlew clean

Utilisation d' Android Studio :

Build (menu) > Clean Project
MujtabaFR
la source
Correct! C'est peut-être le bogue du studio Android.
aolphn
3
Dans Android Studio peut être fait également à partir du menu Build > Clean Project.
Salvador le
1
Pour Android, Studio File > Invalidate Caches / Restart > Invalidate and restartpeut également résoudre le problème
maximum
12

Du document officiel

Si une classe apparaît plus d'une fois sur le chemin de classe d'exécution, vous obtenez une erreur similaire à la suivante:

Program type already present com.example.MyClass

Cette erreur se produit généralement en raison de l'une des circonstances suivantes:

  • Une dépendance binaire comprend une bibliothèque que votre application inclut également en tant que dépendance directe.

    Par exemple, votre application déclare une dépendance directe sur la bibliothèque A et la bibliothèque B, mais la bibliothèque A inclut déjà la bibliothèque B dans son binaire. Pour résoudre ce problème, supprimez la bibliothèque B en tant que dépendance directe.

  • Votre application a une dépendance binaire locale et une dépendance binaire distante sur la même bibliothèque.

    Pour résoudre ce problème, supprimez l'une des dépendances binaires. (Voir si la même bibliothèque est ajoutée en tant que dépendance jar et gradle)

Manohar Reddy
la source
Merci beaucoup. Le premier était la cause du problème pour moi. J'ai utilisé compileOnly pour la bibliothèque répétée qui se trouve dans une autre bibliothèque, que la construction exclura lors de la construction.
Monster Brain
4

Cela m'est également arrivé, mais dans mon cas, j'essaie d'inclure différentes dépendances qui ont la même classe en utilisant debugApi& Apidonc Android Studio marqué comme classe en double, donc j'ai résolu le problème en utilisant debugApi& releaseApipour inclure différentes dépendances basées sur la variante de construction.

mexan juadha
la source
3

Ajouter la bibliothèque de support au fichier Gradle au niveau de l'application

mise en œuvre 'com.android.support:design:27.1.0'

Phani varma
la source
2

Dans mon cas, cela signifie que j'ai 2 fichiers * .jar ou 2 bibliothèques quelque part dans le code source. Par exemple: j'ai 2youtube.jar dans app/libaryet module/libary Suppr redondant une fois et ce sera bien

Kyo Huu
la source
1

J'espère que cela aide quelqu'un, un projet Build> Clean a fonctionné pour moi.

Miki Mirat
la source
3
Cette solution a déjà été suggérée dans les commentaires d'une autre réponse
Fanick
1

Problème pour ce problème - Si vous utilisez la bibliothèque comme module et même bibliothèque comme dépendance dans une autre bibliothèque.

Exemple: LibraryA importé en tant que module et même LibraryA ajouté en tant que dépendance dans tout autre module de bibliothèque.

Comment résoudre ce problème?

Solution 1 -> si vous souhaitez conserver les deux -> Refactorisez simplement le nom du package du module LibraryA

Solution 2 -> supprimer la dépendance LibraryA et utiliser le module

projet de mise en œuvre (': LibraryA')

Ranjith Kumar
la source