Doppelte Klasse android.support.v4.app.INotificationSideChannel in Modulklassen gefunden?

73

Ich entwickle eine Nachrichten-App, erhalte jedoch folgende Fehler von der Gradle-Konsole

(androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub$Proxy found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$1 found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyResultReceiver found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.os.ResultReceiver$MyRunnable found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.core.internal.package-info found in modules classes.jar (androidx.core:core:1.0.1) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class androidx.versionedparcelable.CustomVersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.NonParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelField found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelImpl$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.ParcelUtils found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$1 found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcel$ParcelException found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelParcel found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$FieldBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelStream$InputBuffer found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelable found in modules classes.jar (androidx.versionedparcelable:versionedparcelable:1.0.0) and classes.jar (com.android.support:versionedparcelable:28.0.0)
Duplicate class androidx.versionedparcelable.VersionedParcelize found in modules class

unter meiner app.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    implementation 'com.github.bassaer:chatmessageview:2.0.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
Schweden Edgar
quelle
Ihr Projekt (oder eines ihrer Teilprojekte) bezieht sich auf eine Abhängigkeit mit der + Pluszeichen an seinem Ende; Überprüfen Sie, ob die Antwort auf Ausführung für Aufgabe ': app: checkDebugDuplicateClasses' fehlgeschlagen ist (obwohl es sich bei dieser Frage um Ionic handelt, sollte die Antwort funktionieren).
Top-Master

Antworten:

150

Sie können Ihrer gradle.propertiesDatei folgende Zeilen hinzufügen :

android.useAndroidX=true
android.enableJetifier=true

Einzelheiten:

Wenn Sie androidx-namespaced-Bibliotheken in einem neuen Projekt verwenden möchten, müssen Sie das Kompilierungs-SDK auf Android 9.0 (API-Level 28) oder höher und beide genannten Android Gradle-Plugin-Flags auf setzen true.

android.useAndroidX: Wenn dieses Flag auf gesetzt ist true, verwendet das Android-Plugin die entsprechende AndroidX-Bibliothek anstelle einer Support-Bibliothek. Das Flag ist falsestandardmäßig, wenn es nicht angegeben ist.

android.enableJetifier: Wenn dieses Flag auf gesetzt ist true, migriert das Android-Plugin automatisch vorhandene Bibliotheken von Drittanbietern, um AndroidX-Abhängigkeiten zu verwenden, indem die Binärdateien neu geschrieben werden. Das Flag ist falsestandardmäßig, wenn es nicht angegeben ist.

Anice Jahanjoo
quelle
3
Können Sie ein wenig mehr Informationen darüber hinzufügen, was genau dies tut?
Nathan F.
3
@ NathanF. Dies liegt am Mischen von Unterstützungsbibliotheken. durch Hinzufügen dieser Zeilen androidX als Ihre Support-Bibliothek ausgewählt
Anice Jahanjoo
3
Dies ersetzt nur zwangsweise jede Abhängigkeit von android.support.*durch androidx.*Abhängigkeiten (aber für mich führte dies nur zu einem Kompilierungsfehler, weil android.supporter in den Codes verwendet wurde), falls jemand nach einer Lösung anstelle einer Problemumgehung sucht, überprüfen Sie die Antwort auf Ausführung fehlgeschlagen für Aufgabe ' : app: checkDebugDuplicateClasses ' (obwohl diese Frage Ionic betrifft, sollte die Antwort funktionieren).
Top-Master
gleicher Fehler für mich. und ich benutze keine androidX Library, aber standardmäßig wird beim Kompilieren hinzugefügt. Bitte hilf mir.
Er.nishka
2
@nicej Ich konnte das Problem lösen, indem ich in der Menüleiste Refactor> "Zu AndroidX migrieren" auswählte. Vielen Dank.
Pablo Alfonso
11

Durch Hinzufügen dieser Zeilen zur Datei gradle.properties werden Fehler "Klasse duplizieren" behoben:

android.useAndroidX=true

android.enableJetifier=true

Dies führte jedoch zu neuen Fehlern in meinem Projekt:

"Paket android.support.annotation existiert nicht"

"Symbolklassenfragment kann nicht gefunden werden"

"Paket android.support.v4.content existiert nicht"

"Programmtyp bereits vorhanden"

etc.

Das Refactoring hat bei mir jedoch funktioniert:

Migrate your project to AndroidX by selecting Refactor > 
"Migrate to AndroidX" from the menu bar.

Select Build > Clean project

Restore Android Studio

Jetzt funktioniert mein Projekt (Match4app) mit AndroidX und ich konnte es ohne Probleme im PlayStore veröffentlichen.

Kommentar: Mit dieser Aufgabe konnte ich auch alle anderen Bibliotheken aktualisieren, die von AndroidX abhängen (dh com.firebaseui: firebase-ui-auth: 6.0.2, com.google.android.gms: play-services-games: 18.0.1, com.google.android.gms: play-services-auth: 17.0.0, com.google.android.gms: play-services-ads: 18.2.0 usw.).

Pablo Alfonso
quelle
11

Ich stoße auf so etwas und unten basiert auf meiner anderen Antwort :

Ihr Projekt (oder eines seiner Unterprojekte) bezieht sich auf eine Abhängigkeit mit dem Pluszeichen + am Ende. com.google.firebase:firebase-auth:+Verwenden Sie also nach Möglichkeit eine höhere Version, und diese neuere Version verwendet keine android.supportBibliotheken mehr und stattdessen mit androidx; Führen Sie die folgenden Schritte aus, um dieses Problem zu beheben.

Schritte:

  1. Stellen Sie sicher, dass die ANDROID_HOMEUmgebungsvariable festgelegt ist, und öffnen Sie dann ein Konsolenfenster (wie git-bash, da die gesamte Befehlsausgabe beibehalten wird) und cddas androidVerzeichnis Ihres Projekts (für ionische Projekte sollte dies der Fall sein platforms/android).
  2. Zuerst Liste alle Abhängigkeiten von unten ausgeführt wird (in git-bash):
    ./gradlew :app:dependencies
    
  3. Kopieren Sie das Ergebnis in Ihren bevorzugten Texteditor und suchen Sie nach androidx.
  4. Wenn Sie etwas gefunden haben, folgen Sie den nachstehenden Schritten, sonst sind Sie fertig! (und Sie müssen diese Schritte nicht wiederholen).
  5. Scrollen Sie nach oben, bis Sie -> am Ende einer Zeile sehen, wie zum Beispiel 16.0.8 -> 19.0.0oder + -> 19.0.0, was bedeutet, dass die Version automatisch aufgelöst wurde (auf etwas höheres als von Ihnen aufgrund von + angegeben ).
  6. Stellen Sie die Version also manuell ein:
    • Wenn möglich, suchen Sie in Ihrem Projekt (oder Unterprojekt) das + -Zeichen und ersetzen Sie es durch eine bestimmte Version.
    • Oder erzwingen Sie eine bestimmte Version der Abhängigkeiten wie unten erwähnt.
  7. Wiederholen Sie zum Schluss die obigen Schritte (aber anstelle von Schritt eins nur cleardie Konsole).

Um eine bestimmte Version der Abhängigkeiten zu erzwingen, fügen Sie Ihrer Stammdatei build.gradleFolgendes hinzu (was bei mir funktioniert hat), bearbeiten Sie es jedoch unten und fügen Sie Ihre eigenen Regeln hinzu (da diese für Ihren Fall möglicherweise nicht funktionieren):

allprojects {
  // ...
  configurations.all {
    resolutionStrategy {
      force 'com.google.firebase:firebase-common:17.0.0'
      force 'com.google.android.gms:play-services-basement:16.2.0'
      force 'com.google.firebase:firebase-iid:16.0.0'
      force 'com.google.firebase:firebase-auth:17.0.0'
    }
  }
}
Top-Master
quelle
2

Geben Sie hier die Bildbeschreibung ein

Von hier genommen . AndroidX ist das Open-Source-Projekt, mit dem das Android-Team Bibliotheken in Jetpack entwickelt, testet, verpackt, versioniert und veröffentlicht.

Ahmed
quelle
2

Wie @Ahmed sagt, besteht die Lösung darin, AndroidX zu implementieren, es funktioniert für mich. Es ist jedoch kein einfacher Weg und erfordert ein wenig Geduld ... Dies sind die Schritte, die ich getan habe:

  • Erstens ist es sehr wichtig, dass Sie all diese Änderungen in einem anderen Zweig vornehmen oder eine Sicherungskopie Ihres Projekts erstellen.

  • Sie benötigen das Android Gradle Plugin Version 3.5.1. Also, in build.gradle set:dependencies { classpath 'com.android.tools.build:gradle:3.5.1' ...

  • Mit Android Studio Tool auf AndroidX migrieren : Refactor -> Auf AndroidX migrieren ...
  • Wenn es fertig ist, wurden alle relevanten Änderungen vorgenommen, aber möglicherweise können Sie das Projekt nicht korrekt bereitstellen, da Sie Fehler finden. Dies sind die Probleme, die ich gefunden habe und die Lösungen:

  • Wenn Sie Kotlin verwenden , setzen Sie in build.gradle: buildscript { ext.kotlin_version = '1.3.10' ... undcompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

  • Wenn Sie die Zielmethode verwenden, fügen Sie den Parameter "Datei" hinzu:destination file("$reportsDir/checkstyle/checkstyle.xml")
  • Wenn Sie Butterknife verwenden , verwenden Sie die Version 10.0.0
fvaldivia
quelle
0

Die Antwort von Top-Master funktioniert nur, wenn Sie ein Downgrade auf eine bestimmte Version durchführen können. In meinem Fall habe ich eine React Native-App und eine der von mir verwendeten Bibliotheken wurde auf AndroidX migriert. Die vorherige Version hatte Probleme mit iOS, daher musste ich die neueste Version verwenden. Was ich tun musste war:

  1. Migrieren Sie das Android-Projekt zu AndroidX (Refactor> Zu AndroidX migrieren).
  2. Verwenden Sie jetify , um node_moduleAbhängigkeiten in AndroidX zu konvertieren. Ab React Native 0.60 wird jetify automatisch ausgeführt, sodass Sie diese Bibliothek nicht installieren müssen.
ataravati
quelle