“程序类型已经存在”是啥意思?
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】:这也发生在我身上,但就我而言,我尝试使用 debugApi
和 Api
包含具有相同类的不同依赖项,因此 Android Studio 标记为重复类,所以我通过使用 debugApi
& 解决了这个问题releaseApi
根据构建变体包含不同的依赖项。
【讨论】:
【参考方案5】:就我而言,这意味着我在源代码中的某些位置有 2 个 *.jar 文件或 2 个库。
例如:我在app/libary
和module/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->Tasks->android->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