“ ประเภทโปรแกรมมีอยู่แล้ว” หมายความว่าอย่างไร


102

ฉันกำลังพยายามสร้างแอปใน Android Studio หลังจากเพิ่มไลบรารี Eclipse Paho เป็นการพึ่งพาผู้ไล่ระดับ (หรือเป็น Maven ฉันยังใหม่กับระบบนิเวศของ Android) ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

ฉันได้ตรวจสอบคำถาม StackOverflow ที่แตกต่างกันมากมายเกี่ยวกับข้อผิดพลาดนี้ แต่คำตอบทั้งหมดเฉพาะสำหรับบางไลบรารี ฉันไม่เพียง แต่มองหาวิธีแก้ไขข้อผิดพลาดเท่านั้น แต่ยังเข้าใจถึงความหมายของข้อผิดพลาดด้วย ด้วยวิธีนี้จะง่ายขึ้นสำหรับผู้คนที่จะหาทางแก้ไขสำหรับกรณีเฉพาะ จนถึงขณะนี้ยังไม่มีคำตอบที่ระบุไว้

จากคำตอบอื่น ๆ ของ StackOverflow ฉันได้รวบรวมว่ามันเกี่ยวข้องกับไฟล์ gradle ของฉัน ดังนั้นนี่คือ 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/' }
} 

คำตอบ:


73

ปัญหานี้มักมาจากความขัดแย้งในการตั้งชื่อในกรณีของคุณคือไลบรารี support-v4 ซึ่งใช้โดยไลบรารีหลายแห่ง

หากต้องการค้นหารายการการอ้างอิงสำหรับโมดูลapp(ชื่อโมดูลเริ่มต้นสำหรับแอป) เราสามารถgradlew app:dependenciesดึงรายการไลบรารีทั้งหมดได้

เราพบว่าsupport-v4ใช้โดย:

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

เราเห็นว่า support-v4 บนแผนที่จะใช้เวอร์ชันที่มาจาก support-v13

เรายังเห็นว่าไลบรารี eclipse กำลังใช้เวอร์ชันอื่น (r7 ??)

ในการแก้ไขปัญหาของคุณคุณสามารถลองแยกโมดูลsupport-v4ออกจากไลบรารี eclipse ได้ดังนี้:

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

จากนั้นคุณจะสามารถรวบรวมแอปพลิเคชันของคุณได้

Btw คุณควรดูแลไม่ให้โมดูล eclipse พังโดยการทดสอบโค้ดของคุณ


2
ฉันมีการปะทะที่แตกต่างออกไปอย่างสิ้นเชิง แต่คำตอบของคุณช่วยให้ฉันได้รับความคิดที่ว่ามีบางอย่างอาจขัดแย้งกัน ฉันใช้ผู้เล่น 2 คนที่ใช้ Android Exo Player อาจช่วยใครสักคนได้สักวัน ขอบคุณ!
Vucko

@ Vucko คุณระบุการปะทะได้อย่างไร?
เวียร์ราชปุโรหิต

ด้วยความโชคดี ฉันเริ่มค้นคว้าและสังเกตเห็นว่าไลบรารีโปรแกรมเล่นวิดีโอ brightcove ของฉันใช้ exoplayer ตามการพึ่งพา ลองดูว่าอะไรจะเหมาะกับคุณ
Vucko

85

สำหรับฉันการทำความสะอาดโครงการก็ช่วยแก้ปัญหาได้

ใช้Terminal :

./gradlew clean

การใช้Android Studio :

Build (menu) > Clean Project

1
ถูกต้อง! อาจจะเป็นบั๊กของ android studio
aolphn

3
ในสตูดิโอของ Android Build > Clean Projectสามารถทำได้จากเมนู
ซัลวาดอร์

1
สำหรับ Android Studio File > Invalidate Caches / Restart > Invalidate and restartอาจแก้ไขปัญหาได้เช่นกัน
สูงสุด

คำตอบนี้ไม่ได้อธิบายว่าข้อผิดพลาดหมายถึงอะไรซึ่งเป็นคำถามที่ถาม
user2102929

ฉันเขียนคำตอบหลายเดือนต่อมาเพียงเพื่อแบ่งปันประสบการณ์ของฉันกับผู้อ่านในอนาคต .. พวกเขาอาจมองหาวิธีแก้ปัญหาและคำอธิบายที่ยาว แต่ก็สามารถแก้ไขได้ด้วยขั้นตอนง่ายๆเพียงขั้นตอนเดียว .. @ user2102929
MujtabaFR

13

จากเอกสารอย่างเป็นทางการ

หากคลาสปรากฏขึ้นมากกว่าหนึ่งครั้งบนคลาสพา ธ รันไทม์คุณจะได้รับข้อผิดพลาดคล้ายกับสิ่งต่อไปนี้:

Program type already present com.example.MyClass

ข้อผิดพลาดนี้มักเกิดขึ้นเนื่องจากหนึ่งในสถานการณ์ต่อไปนี้:

  • การพึ่งพาไบนารีรวมถึงไลบรารีที่แอปของคุณรวมไว้เป็นการพึ่งพาโดยตรง

    ตัวอย่างเช่นแอปของคุณประกาศการพึ่งพาไลบรารี A และไลบรารี B โดยตรง แต่ไลบรารี A รวมไลบรารี B ไว้ในไบนารีแล้ว ในการแก้ไขปัญหานี้ให้ลบไลบรารี B เป็นการอ้างอิงโดยตรง

  • แอปของคุณมีการพึ่งพาไบนารีในพื้นที่และการพึ่งพาไบนารีระยะไกลบนไลบรารีเดียวกัน

    ในการแก้ไขปัญหานี้ให้ลบการอ้างอิงไบนารีตัวใดตัวหนึ่งออก (ดูว่ามีการเพิ่มไลบรารีเดียวกันเป็น jar และ gradle dependency หรือไม่)


ขอบคุณมาก. อันดับแรกเป็นสาเหตุของปัญหาสำหรับฉัน ฉันใช้ compileOnly สำหรับไลบรารีซ้ำที่อยู่ภายในไลบรารีอื่นซึ่งบิลด์จะไม่รวมเมื่อสร้าง
Monster Brain

4

มันเกิดขึ้นกับผมยัง แต่ในกรณีของฉันฉันพยายามที่จะรวมการอ้างอิงที่แตกต่างกันที่มีระดับเดียวกันโดยใช้debugApiและApiเพื่อ Android สตูดิโอทำเครื่องหมายว่าเป็นระดับที่ซ้ำกันดังนั้นผมจึงแก้ปัญหาด้วยการใช้debugApiและreleaseApiจะรวมถึงการอ้างอิงที่แตกต่างกันขึ้นอยู่กับการสร้างความแตกต่าง



2

ในกรณีของฉันหมายความว่าฉันมีไฟล์ 2 * .jar หรือ 2 libary ซึ่งอยู่ในซอร์สโค้ด ตัวอย่างเช่นฉันมี 2 youtube.jarในapp/libaryและmodule/libary ลบซ้ำซ้อนหนึ่งครั้งและจะไม่เป็นไร


1

ปัญหาสำหรับปัญหานี้ - หากคุณใช้ไลบรารีเป็นโมดูลและไลบรารีเดียวกับการอ้างอิงในไลบรารีอื่น

ตัวอย่าง: LibraryAนำเข้าเป็นโมดูล & เดียวกันLibraryAเพิ่มเป็นพึ่งพาในโมดูลห้องสมุดอื่น ๆ

จะแก้ไขปัญหานี้ได้อย่างไร?

โซลูชันที่ 1 -> หากคุณต้องการเก็บทั้งสองอย่าง -> เพียงแค่เปลี่ยนชื่อแพ็กเกจของโมดูลLibraryA

โซลูชันที่ 2 -> ลบการพึ่งพาLibraryAและใช้โมดูล

โครงการดำเนินการ (': LibraryA')


0

ฉันหวังว่ามันจะช่วยใครสักคน Build> Clean Project ได้ผลสำหรับฉัน


3
โซลูชันนี้ได้รับการแนะนำแล้วในความคิดเห็นของคำตอบอื่น
Fanick

0

ฉันมีปัญหาเดียวกัน แต่ด้วยไลบรารีภายในโครงการของฉันหลังจากอัปเดตจาก Android Studio 4.0.2 เป็น 4.1 ฉันได้ค้นหาและลองหลายสิ่งหลายอย่างไม่ประสบความสำเร็จ หากพวกคุณมีกรณีเดียวกันกับฉันฉันหวังว่าคำตอบนี้จะช่วยได้ สิ่งที่ฉันทำ:

  1. Clean Projectแล้วRebuild Project- ล้มเหลว
  2. Invalidate Caches / Restart - ล้มเหลว
  3. ลบแคช Gradle ส่วนกลาง ( /User/username/.gradle/cachesสำหรับ macOS) - ล้มเหลว
  4. การตรวจสอบการอ้างอิงแอพผ่านเทอร์มินัลด้วยคำสั่ง: ./gradlew app:dependencies หรือผ่านหน้าต่างเครื่องมือ Gradle: project->Tasks->android->androidDependencies- ไม่มีอะไรน่าสงสัย
  5. ลบ.gradleและ.ideaออกจากโปรเจ็กต์รูทของฉัน - สำเร็จ (แม้ว่าฉันจะไม่แน่ใจว่าต้องลบทั้งสองอย่างหรือไม่บางทีอาจจะลบอย่างใดอย่างหนึ่งก็ได้เช่นกัน)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.