"Loại chương trình đã có" nghĩa là gì?


99

Tôi đang cố gắng tạo một ứng dụng trong Android Studio. Sau khi thêm thư viện Eclipse Paho dưới dạng phụ thuộc gradle (hoặc là Maven? Tôi là người mới sử dụng hệ sinh thái Android), tôi gặp lỗi sau:

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

Tôi đã kiểm tra nhiều câu hỏi StackOverflow khác nhau liên quan đến lỗi này, nhưng tất cả các câu trả lời đều dành riêng cho một số thư viện nhất định. Tôi không chỉ tìm kiếm giải pháp cho lỗi mà còn tìm hiểu ý nghĩa của lỗi . Bằng cách đó, mọi người sẽ dễ dàng tìm ra giải pháp cho các trường hợp cụ thể của họ hơn. Cho đến nay, không có câu trả lời nào cung cấp điều đó.

Từ các câu trả lời StackOverflow khác, tôi đã thu thập được rằng nó có liên quan gì đó đến tệp gradle của tôi. Vì vậy, đây là 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/' }
} 

Câu trả lời:


73

Sự cố này thường xuất phát từ xung đột đặt tên, trong trường hợp của bạn là thư viện support-v4, được một số thư viện sử dụng.

Để tìm danh sách các phụ thuộc cho mô-đun app(tên mô-đun mặc định cho ứng dụng), chúng ta có thể thực hiệngradlew app:dependencies truy xuất danh sách tất cả các thư viện.

Chúng tôi thấy rằng nó support-v4được sử dụng bởi:

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

Chúng tôi thấy rằng support-v4 trên Maps sẽ sử dụng phiên bản được cung cấp từ support-v13.

Chúng tôi cũng thấy rằng thư viện nhật thực đang sử dụng phiên bản khác (r7 ??).

Để giải quyết vấn đề của bạn, bạn có thể thử loại trừ mô-đun support-v4khỏi thư viện nhật thực này như sau:

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

Sau đó, bạn sẽ có thể biên dịch ứng dụng của mình.

Btw, bạn nên cẩn thận rằng mô-đun nhật thực sẽ không bị hỏng khi kiểm tra mã của bạn.


2
Tôi đã có một cuộc đụng độ hoàn toàn khác, nhưng câu trả lời của bạn đã giúp tôi thực sự NHẬN được ý tưởng rằng một cái gì đó có thể xảy ra xung đột. Tôi đã sử dụng 2 trình phát khác nhau sử dụng Android Exo Player. Có thể giúp ai đó một ngày nào đó. Cảm ơn!
Vucko

@Vucko Làm thế nào bạn xác định được cuộc đụng độ?
Vir Rajpurohit

Nhờ may mắn tuyệt đối. Tôi bắt đầu nghiên cứu và nhận thấy rằng thư viện trình phát video Brightcove của tôi sử dụng exoplayer vì nó phụ thuộc. Hãy thử xem điều đó có thể dành cho bạn.
Vucko

82

Đối với tôi, chỉ cần dọn dẹp dự án đã giải quyết được vấn đề

Sử dụng thiết bị đầu cuối :

./gradlew clean

Sử dụng Android Studio :

Build (menu) > Clean Project

Đúng! Có thể đó là lỗi của studio android.
aolphn

3
Trong Android Studio cũng có thể được thực hiện từ menu Build > Clean Project.
Salvador

1
Đối với Android Studio File > Invalidate Caches / Restart > Invalidate and restartcũng có thể khắc phục sự cố
Tối đa

12

Từ Doc chính thức

Nếu một lớp xuất hiện nhiều lần trên classpath thời gian chạy, bạn sẽ gặp lỗi tương tự như sau:

Program type already present com.example.MyClass

Lỗi này thường xảy ra do một trong các trường hợp sau:

  • Phần phụ thuộc nhị phân bao gồm một thư viện mà ứng dụng của bạn cũng bao gồm như một phần phụ thuộc trực tiếp.

    Ví dụ: ứng dụng của bạn khai báo sự phụ thuộc trực tiếp vào Thư viện A và Thư viện B, nhưng Thư viện A đã bao gồm Thư viện B trong tệp nhị phân của nó. Để giải quyết vấn đề này, hãy xóa Thư viện B dưới dạng phụ thuộc trực tiếp.

  • Ứng dụng của bạn có phụ thuộc nhị phân cục bộ và phụ thuộc nhị phân từ xa trên cùng một thư viện.

    Để giải quyết vấn đề này, hãy xóa một trong các phụ thuộc nhị phân. (Xem nếu cùng một thư viện được thêm vào dưới dạng phụ thuộc jar và gradle)


Cảm ơn rất nhiều. Thứ nhất là nguyên nhân gây ra vấn đề cho tôi. Tôi đã sử dụng compileOnly cho thư viện lặp lại bên trong một thư viện khác, mà bản dựng sẽ loại trừ khi xây dựng.
Monster Brain

4

Điều đó cũng xảy ra với tôi nhưng trong trường hợp của tôi, tôi cố gắng bao gồm các phần phụ thuộc khác nhau có cùng lớp bằng cách sử dụng debugApi& Apido đó, Android Studio được đánh dấu là lớp trùng lặp, vì vậy tôi đã giải quyết vấn đề bằng cách sử dụng debugApi& releaseApibao gồm các phần phụ thuộc khác nhau dựa trên biến thể bản dựng.


3

Thêm thư viện Hỗ trợ vào tệp Gradle cấp ứng dụng

triển khai 'com.android.support:design:27.1.0'


2

Trong trường hợp của tôi, nó có nghĩa là tôi có tệp 2 * .jar hoặc 2 libary một số nơi trong mã nguồn. Ví dụ: Tôi có 2 youtube.jartrong app/libarymodule/libary Xóa thừa một lần và nó sẽ ổn


1

Tôi hy vọng nó sẽ giúp ích cho ai đó, một Dự án Xây dựng> Sạch sẽ phù hợp với tôi.


3
Giải pháp này đã được đề xuất trong các bình luận của một câu trả lời khác
Fanick

1

Sự cố cho sự cố này - Nếu bạn sử dụng thư viện dưới dạng mô-đun & cùng một thư viện làm phụ thuộc trong thư viện khác.

Thí dụ: Thư việnA được nhập dưới dạng Mô-đun & cùng Thư việnA được thêm làm phụ thuộc trong bất kỳ mô-đun thư viện nào khác.

Làm thế nào để giải quyết vấn đề này?

Giải pháp 1 -> nếu bạn muốn giữ cả hai -> Chỉ cần cấu trúc lại tên gói của mô-đun LibraryA

Giải pháp 2 -> loại bỏ phụ thuộc LibraryA và sử dụng mô-đun

dự án thực hiện (': LibraryA')

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.