“已经存在的程序类型”是什么意思?


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

Answers:


73

此问题通常来自命名冲突,在您的情况下为support-v4库,该库由多个库使用。

要查找模块的依赖关系列表app(应用程序的默认模块名称),我们可以执行a 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

我们看到Maps上的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'
}

然后,您应该能够编译您的应用程序。

顺便说一句,您应该注意通过测试代码,eclipse模块不会中断。


2
我完全遇到了其他冲突,但是您的回答实际上帮助我获得了可能发生冲突的想法。我一直在使用2个使用Android Exo Player的播放器。有一天可能会帮助某人。谢谢!
Vucko

@Vucko您如何识别冲突?
Vir Rajpurohit

真是幸运。我开始研究,发现我的Brightcove视频播放器库使用exoplayer作为依赖项。尝试看看这可能适合您。
Vucko '18 -10-10

82

对我来说,清洁项目就解决了问题

使用终端

./gradlew clean

使用Android Studio

Build (menu) > Clean Project

正确!也许是android studio的bug。
aolphn

3
在Android Studio中,也可以从菜单完成Build > Clean Project
萨尔瓦多

1
对于Android Studio File > Invalidate Caches / Restart > Invalidate and restart也可以解决该问题
Max

12

来自官方文件

如果一个类在运行时类路径上不止一次出现,则会出现类似于以下错误:

Program type already present com.example.MyClass

通常由于以下情况之一而发生此错误:

  • 二进制依赖项包括一个库,您的应用程序也将其包含为直接依赖项。

    例如,您的应用声明了对库A和库B的直接依赖关系,但库A已在其二进制文件中包含库B。若要解决此问题,删除库B作为直接依赖项。

  • 您的应用程序在同一库上具有本地二进制依赖关系和远程二进制依赖关系。

    若要解决此问题,删除二进制依赖项之一。(查看是否将相同的库添加为jar和gradle依赖项)


非常感谢。第一个是我的问题原因。我将compileOnly用于另一个库中的重复库,该库在构建时将排除在外。
Monster Brain

4

这也发生在我身上,但就我而言,我尝试使用debugApi&来包含具有相同类的不同依赖项,Api因此Android Studio被标记为重复类,因此我通过使用debugApireleaseApi来解决了此问题,并基于build变体包含了不同的依赖项。



2

就我而言,这意味着我在源代码中的某些位置有2个* .jar文件或2个库。例如:我有2 youtube.jarin app/libarymodule/libary 删除一次冗余,就可以了



1

此问题的问题-如果您将该库用作模块,并将同一库用作依赖关系的另一个库。

示例:将LibraryA导入为模块,并将相同的LibraryA作为依赖项添加到任何其他库模块中。

如何解决这个问题?

解决方案1->如果要同时保留它们->只需重构LibraryA模块的软件包名称

解决方案2->删除LibraryA依赖项并使用该模块

实施项目(':LibraryA')

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.