“程序类型已经存在”是啥意思?

Posted

技术标签:

【中文标题】“程序类型已经存在”是啥意思?【英文标题】:What does "Program type already present" mean?“程序类型已经存在”是什么意思? 【发布时间】:2018-09-15 11:59:58 【问题描述】:

我正在尝试在 android Studio 中构建一个应用。在将 Eclipse Paho 库添加为 gradle 依赖项后(或者是 Maven?我是 Android 生态系统的新手),出现以下错误:

Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat
Messagekind=ERROR, text=Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat, sources=[Unknown source file], tool name=Optional.of(D8)

我检查了许多与此错误相关的不同 *** 问题,但答案都是特定于某些库的。 我不仅要寻找错误的解决方案,还要了解错误的含义这样人们就更容易找到解决方案他们的具体案例。到目前为止,还没有答案。

从其他 *** 答案中,我收集到它与我的 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/' 
 

【问题讨论】:

【参考方案1】:

对我来说只是清理项目解决了问题

使用终端

./gradlew clean

使用 Android Studio

Build (menu) > Clean Project

【讨论】:

正确!可能是android studio的问题。 在 Android Studio 中也可以通过菜单 Build > Clean Project 完成。 对于 Android Studio File > Invalidate Caches / Restart > Invalidate and restart 也可以解决问题 这个答案没有解释错误的含义,这就是问题所要问的。 几个月后我写了答案,只是为了与未来的读者分享我的经验..他们可能会寻找较长的解决方案和解释,而可以通过一个简单的步骤来解决..@user2102929跨度> 【参考方案2】:

这个问题通常来自命名冲突,在你的例子中是 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 ??)。

要解决您的问题,您可以尝试从这个 Eclipse 库中排除模块 support-v4,如下所示:

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

那么你应该可以编译你的应用程序了。

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

【讨论】:

我遇到了完全不同的冲突,但你的回答帮助我真正理解了某些事情可能会发生冲突的想法。我一直在使用 2 个使用 Android Exo Player 的不同播放器。有一天可能会帮助某人。谢谢! @Vucko 你是如何识别冲突的? 纯属运气。我开始研究并注意到我的 brightcove 视频播放器库使用 exoplayer 作为它的依赖项。试着看看这对你有什么好处。【参考方案3】:

来自official Doc

如果一个类在运行时类路径中出现多次,您会收到类似于以下内容的错误:

Program type already present com.example.MyClass

此错误通常由以下情况之一引起:

二进制依赖项包含一个库,您的应用也将其作为直接依赖项包含在内。

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

您的应用在同一个库上具有本地二进制依赖项和远程二进制依赖项。

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

【讨论】:

非常感谢。第一个是我问题的原因。我将 compileOnly 用于另一个库中的重复库,构建时构建将排除该库。【参考方案4】:

这也发生在我身上,但就我而言,我尝试使用 debugApiApi 包含具有相同类的不同依赖项,因此 Android Studio 标记为重复类,所以我通过使用 debugApi & 解决了这个问题releaseApi 根据构建变体包含不同的依赖项。

【讨论】:

【参考方案5】:

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

【讨论】:

是的!这个对我有帮助!【参考方案6】:

将支持库添加到应用级 Gradle 文件

实现'com.android.support:design:27.1.0'

【讨论】:

【参考方案7】:

此问题的问题 - 如果您将库用作模块并将相同的库用作另一个库中的依赖项。

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

如何解决这个问题?

解决方案 1 -> 如果你想保留两者 -> 只需重构 LibraryA 模块的包名

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

实施项目(':LibraryA')

【讨论】:

【参考方案8】:

我收到此错误的原因是因为我将 Java 文件转换为 Kotlin 文件,如下所示:

Code (menu) -> Convert Java file to Kotlin file

旧的 Java 类一定仍然在类路径中徘徊,从而导致重复。做一个干净的修复它:

Build (menu) -> Clean Project

【讨论】:

【参考方案9】:

我希望它可以帮助某人, 一个 Build > Clean Project 对我有用。

【讨论】:

此解决方案已在另一个答案的 cmets 中提出【参考方案10】:

从 Android Studio 4.0.2 更新到 4.1 后,我的项目的内部库出现了同样的问题。我已经搜索并尝试了很多事情但没有成功。如果你们和我有同样的情况,希望这个答案能帮到你。我做了什么:

    Clean Project 然后 Rebuild Project - 失败 Invalidate Caches / Restart - 失败 删除全局 Gradle 缓存(/User/username/.gradle/caches 用于 macOS)- 失败 通过终端使用以下命令调查应用程序依赖项:./gradlew app:dependencies 通过 Gradle 工具窗口:project-&gt;Tasks-&gt;android-&gt;androidDependencies - 没什么可疑的 从我的根项目中删除 .gradle.idea - 成功(虽然我不确定是否需要删除两者。也许只需删除其中一个也可以)

【讨论】:

以上是关于“程序类型已经存在”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

程序类型已经存在:com.google.android.gms.internal.measurement.zzea

程序类型已经存在:org.intellij.lang.annotations.Flow

程序类型已存在:android.support.v7.util.AsyncListUtil $ 1

Android Studio - 程序类型已经存在:com.google.android.gms.internal.measurement.zzwp

AndroidStudio - 程序类型已经存在:com.google.android.gms.location.places.zza

com.android.tools.r8.errors.CompilationError:程序类型已经存在:androidx.annotation.AnimRes