Apa artinya "Jenis program sudah ada"?

99

Saya mencoba membuat aplikasi di Android Studio. Setelah menambahkan pustaka Eclipse Paho sebagai dependensi gradle (atau apakah itu Maven? Saya baru mengenal ekosistem Android), saya mendapat kesalahan berikut:

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

Saya telah memeriksa banyak pertanyaan StackOverflow berbeda yang berkaitan dengan kesalahan ini, tetapi jawabannya semuanya khusus untuk pustaka tertentu. Saya mencari tidak hanya untuk solusi untuk kesalahan, tetapi memahami apa kesalahan berarti . Dengan begitu, orang-orang akan lebih mudah menemukan solusi untuk kasus spesifik mereka. Sejauh ini, belum ada jawaban yang memberikan itu.

Dari jawaban StackOverflow lainnya, saya telah menyimpulkan bahwa itu ada hubungannya dengan file gradle saya. Jadi, inilah 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/' }
} 
pengguna2102929
sumber

Jawaban:

73

Masalah ini biasanya berasal dari konflik penamaan, dalam kasus Anda pustaka support-v4, yang digunakan oleh beberapa pustaka.

Untuk menemukan daftar dependensi untuk modul app(nama modul default untuk aplikasi) kita dapat melakukan a gradlew app:dependenciesuntuk mengambil daftar semua pustaka.

Kami menemukan bahwa support-v4digunakan oleh:

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

Kami melihat bahwa support-v4 di Maps akan menggunakan versi yang disediakan dari support-v13.

Kami juga melihat bahwa perpustakaan gerhana menggunakan versi lain (r7 ??).

Untuk mengatasi masalah Anda, Anda dapat mencoba mengecualikan modul support-v4dari pustaka gerhana seperti ini:

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

Maka Anda harus dapat mengkompilasi aplikasi Anda.

Btw Anda harus berhati-hati bahwa modul gerhana tidak akan rusak dengan menguji kode Anda.

xiaomi
sumber
2
Saya memiliki bentrokan yang berbeda sama sekali, tetapi jawaban Anda telah membantu saya benar-benar MENDAPATKAN gagasan bahwa ada sesuatu yang mungkin bentrok. Saya telah menggunakan 2 pemain berbeda yang menggunakan Android Exo Player. Semoga membantu seseorang suatu hari nanti. Terima kasih!
Vucko
@Vucko Bagaimana Anda mengidentifikasi bentrokan?
Vir Rajpurohit
Melalui keberuntungan belaka. Saya mulai meneliti dan memperhatikan bahwa perpustakaan pemutar video brightcove saya menggunakan exoplayer karena ketergantungannya. Cobalah untuk melihat apa manfaatnya bagi Anda.
Vucko
84

Bagi saya, membersihkan proyek saja sudah menyelesaikan masalah

Menggunakan Terminal :

./gradlew clean

Menggunakan Android Studio :

Build (menu) > Clean Project
MujtabaFR
sumber
Benar! Mungkin itu bug studio android.
aolphn
3
Di Android Studio bisa dilakukan juga dari menu Build > Clean Project.
Salvador
1
Untuk Android Studio File > Invalidate Caches / Restart > Invalidate and restartdapat memperbaiki masalah juga
Max
Jawaban ini tidak menjelaskan apa arti kesalahan tersebut, yang merupakan pertanyaan yang diajukan.
pengguna2102929
Saya menulis jawabannya beberapa bulan kemudian, hanya untuk berbagi pengalaman saya dengan pembaca yang akan datang .. mereka mungkin mencari solusi dan penjelasan yang panjang, sementara itu dapat diselesaikan dengan satu langkah sederhana .. @ user2102929
MujtabaFR
13

Dari Dok resmi

Jika sebuah kelas muncul lebih dari sekali di classpath waktu proses, Anda akan mendapatkan error yang mirip dengan berikut:

Program type already present com.example.MyClass

Kesalahan ini biasanya terjadi karena salah satu dari keadaan berikut:

  • Dependensi biner menyertakan pustaka yang juga disertakan aplikasi Anda sebagai dependensi langsung.

    Misalnya, aplikasi Anda mendeklarasikan dependensi langsung pada Library A dan Library B, tetapi Library A sudah menyertakan Library B dalam binernya. Untuk mengatasi masalah ini, hapus Library B sebagai dependensi langsung.

  • Aplikasi Anda memiliki ketergantungan biner lokal dan ketergantungan biner jarak jauh di perpustakaan yang sama.

    Untuk mengatasi masalah ini, hapus salah satu dependensi biner. (Lihat apakah perpustakaan yang sama ditambahkan sebagai ketergantungan jar dan gradle)

Manohar Reddy
sumber
Terima kasih banyak. Yang pertama adalah penyebab masalah bagi saya. Saya menggunakan compileOnly untuk library berulang yang ada di dalam library lain, yang akan dikecualikan build saat membangun.
Monster Brain
4

Itu juga terjadi pada saya, tetapi dalam kasus saya, saya mencoba menyertakan dependensi berbeda yang memiliki kelas yang sama menggunakan debugApi& Apijadi Android Studio ditandai sebagai kelas duplikat, jadi saya menyelesaikan masalah dengan menggunakan debugApi& releaseApiuntuk menyertakan dependensi yang berbeda berdasarkan varian build.

mexan juadha
sumber
2

Tambahkan pustaka Dukungan ke file Gradle tingkat aplikasi

implementasi 'com.android.support:design:27.1.0'

Phani varma
sumber
2

Dalam kasus saya itu berarti saya memiliki 2 file * .jar atau 2 perpustakaan di beberapa tempat dalam kode sumber. Sebagai contoh: Saya memiliki 2 youtube.jardi app/libarydan module/libary Hapus redundan sekali dan itu akan baik-baik saja

Kyo Huu
sumber
1

Masalah untuk masalah ini - Jika Anda menggunakan pustaka sebagai modul & pustaka yang sama sebagai ketergantungan di pustaka lain.

Contoh: LibraryA diimpor sebagai Module & LibraryA yang sama ditambahkan sebagai dependensi di modul library lainnya.

Bagaimana cara memperbaiki masalah ini?

Solusi 1 -> jika Anda ingin menyimpan keduanya -> Cukup refactor nama paket modul LibraryA

Solusi 2 -> hapus ketergantungan LibraryA dan gunakan modul

proyek implementasi (': LibraryA')

Ranjith Kumar
sumber
0

Saya harap ini membantu seseorang, Proyek Build> Clean berhasil untuk saya.

Miki Mirat
sumber
3
Solusi ini telah disarankan dalam komentar dari jawaban lain
Fanick