"이미 존재하는 프로그램 유형"은 무엇을 의미합니까?


99

Android Studio에서 앱을 빌드하려고합니다. Eclipse Paho 라이브러리를 gradle 종속성으로 추가 한 후 (또는 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
나는 완전히 다른 충돌을 겪었지만 귀하의 답변은 실제로 무언가 충돌 할 수 있다는 아이디어를 얻는 데 도움이되었습니다. 저는 Android Exo Player를 사용하는 2 개의 다른 플레이어를 사용하고 있습니다. 언젠가 누군가를 도울 수 있습니다. 감사!
Vucko

@Vucko 충돌을 어떻게 식별 했습니까?
Vir Rajpurohit 2010

순전히 행운을 통해. 나는 조사를 시작했고 내 brightcove 비디오 플레이어 라이브러리가 의존성으로 exoplayer를 사용한다는 것을 알았습니다. 그것이 당신을 위해 무엇인지보십시오.
Vucko 2010

84

나를 위해 프로젝트를 청소 하면 문제가 해결되었습니다.

터미널 사용 :

./gradlew clean

Android Studio 사용 :

Build (menu) > Clean Project

맞습니다! 아마도 그것은 안드로이드 스튜디오의 버그 일 것입니다.
aolphn

3
Android Studio에서는 메뉴에서도 수행 할 수 있습니다 Build > Clean Project.
Salvador

1
Android Studio의 File > Invalidate Caches / Restart > Invalidate and restart경우 문제도 해결 될 수 있습니다.
Max

이 대답은 오류가 의미하는 바를 설명하지 않습니다.
user2102929

나는 몇 달 후에 답을 썼다. 미래의 독자들과 내 경험을 공유하기 위해 .. 그들은 긴 해결책과 설명을 찾을 수 있지만 간단한 한 단계로 해결할 수 있습니다 .. @ user2102929
MujtabaFR

13

에서 공식 문서

클래스가 런타임 클래스 경로에 두 번 이상 나타나면 다음과 유사한 오류가 발생합니다.

Program type already present com.example.MyClass

이 오류는 일반적으로 다음 상황 중 하나로 인해 발생합니다.

  • 바이너리 종속성에는 앱이 직접 종속성으로 포함하는 라이브러리가 포함됩니다.

    예를 들어 앱이 라이브러리 A와 라이브러리 B에 대한 직접적인 종속성을 선언하지만 라이브러리 A에는 이미 바이너리에 라이브러리 B가 포함되어 있습니다. 이 문제를 해결하려면 라이브러리 B를 직접 종속성으로 제거하십시오.

  • 앱에 동일한 라이브러리에 대한 로컬 바이너리 종속성과 원격 바이너리 종속성이 있습니다.

    이 문제를 해결하려면 이진 종속성 중 하나를 제거하십시오. (동일한 라이브러리가 jar 및 gradle 종속성으로 추가되었는지 확인하십시오)


감사합니다. 첫 번째는 저에게 문제의 원인이었습니다. 다른 라이브러리 안에있는 반복 라이브러리에 대해 compileOnly를 사용했는데, 빌드시 빌드가 제외됩니다.
Monster Brain

4

나에게도 발생했지만 제 경우에는 debugApi&를 사용하여 동일한 클래스를 가진 다른 종속성을 포함하려고 시도 Api하므로 Android Studio가 중복 클래스로 표시되었으므로 debugApi& releaseApi를 사용 하여 빌드 변형에 따라 다른 종속성을 포함 하여 문제를 해결했습니다 .


2

앱 수준 Gradle 파일에 지원 라이브러리 추가

구현 'com.android.support:design:27.1.0'


2

제 경우에는 소스 코드에 2 개의 * .jar 파일 또는 2 개의 라이브러리가 있음을 의미합니다. 예를 들어 : 2 youtube.jarapp/libary있고 module/libary 중복을 한 번 삭제하면 괜찮습니다.


1

이 문제에 대한 문제-라이브러리를 모듈로 사용하고 다른 라이브러리의 종속성과 동일한 라이브러리를 사용하는 경우.

예 : Module로 가져온 LibraryA 및 다른 라이브러리 모듈의 종속성으로 추가 된 동일한 LibraryA .

이 문제를 해결하는 방법은 무엇입니까?

솔루션 1-> 둘 다 유지하려면-> LibraryA 모듈 의 패키지 이름을 리팩터링하십시오.

솔루션 2-> LibraryA 종속성 제거 및 모듈 사용

구현 프로젝트 ( ': LibraryA')


0

누군가에게 도움이되기를 바랍니다. Build> Clean Project가 저에게 효과적이었습니다.


3
이 솔루션은 이미 다른 답변의 의견에서 제안되었습니다
Fanick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.