Android 什么是;“程序类型已存在”;什么意思?

Android 什么是;“程序类型已存在”;什么意思?,android,android-studio,gradle,Android,Android Studio,Gradle,我正在尝试在Android Studio中构建一个应用程序。在添加Eclipse Paho库作为gradle依赖项(或者是Maven?我是Android生态系统的新手)之后,我得到了以下错误: Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat Message{kind=ERROR, text=Program type already presen

我正在尝试在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/' }
} 

这个问题通常来自命名冲突,在您的例子中是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
然后您应该能够编译您的应用程序


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

将支持库添加到应用程序级别的Gradle文件中

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

如果一个类在运行时类路径上出现多次,则会出现如下类似的错误:

程序类型已存在com.example.MyClass

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

  • 二进制依赖项包括一个库,您的应用程序也包括该库作为直接依赖项

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

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

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


    • 对我来说,只要清洁一下就可以了,项目解决了这个问题

      使用终端

      ./gradlew clean
      
      Build (menu) > Clean Project
      
      使用Android Studio:

      ./gradlew clean
      
      Build (menu) > Clean Project
      

      这也发生在我身上,但在我的例子中,我尝试使用
      debugApi
      &
      Api
      包含具有相同类的不同依赖项,因此Android Studio标记为重复类,因此,我通过使用
      debugApi
      releaseApi
      来解决这个问题,根据构建变量包含不同的依赖项。

      在我的例子中,这意味着我在源代码中有2个*.jar文件或2个库。 例如:我在
      app/libary
      module/libary中有2个
      youtube.jar
      删除多余的内容一次就可以了

      我希望它能帮助别人,
      一个Build>Clean项目对我有效。

      此问题的问题-如果您将该库用作模块&与另一个库中的依赖项使用相同的库

      示例:LibraryA作为模块导入&sameLibraryA作为依赖项添加到任何其他库模块中

      如何解决这个问题

      解决方案1->如果您想保留这两个->只需重构LibraryA模块的包名即可

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

      实施项目(“:LibraryA”)


      我也有同样的问题,但是在从AndroidStudio 4.0.2升级到4.1之后,我的项目的内部库出现了问题。我已经搜索和尝试了很多东西,但都没有成功。如果你们和我有同样的情况,我希望这个答案能有所帮助。我所做的:

    • 清理项目
      然后
      重建项目
      -失败
    • 使缓存无效/重新启动
      -失败
    • 删除全局Gradle缓存(
      /User/username/.Gradle/caches
      用于macOS)-失败
    • 使用命令通过终端调查应用程序依赖关系:
      /gradlew app:dependencies
      或通过Gradle工具窗口调查应用程序依赖关系:
      项目->任务->android->androidDependencies
      -无可疑
    • 从我的根项目-成功中删除
      .gradle
      .idea
      (尽管我不确定是否需要同时删除这两个项目。也许只需删除其中一个即可)

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

      implementation ('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
          exclude module: 'support-v4'
      }
      
      Code (menu) -> Convert Java file to Kotlin file
      
      旧的Java类必须仍然挂在类路径上,导致重复。正在进行一次清洁修复:

      Build (menu) -> Clean Project
      

      我有一个完全不同的冲突,但你的回答帮助我实际上得到了一些东西可能冲突的想法。我一直在使用两种不同的播放器,它们都使用Android Exo Player。也许有一天会帮助别人。谢谢@Vucko你是如何识别clash的?纯粹是运气使然。我开始研究,发现我的brightcove视频播放器库使用exoplayer作为它的依赖项。试着看看这对你有什么好处。对!可能是android studio的错误。在android studio中,也可以通过菜单
      Build>Clean Project
      完成。对于android studio
      File>Invalidate Caches/Restart>Invalidate and Restart
      也可以解决此问题。此答案没有解释错误的含义,这就是问题所在。几个月后,我写下了答案,只是为了与未来的读者分享我的经验。。他们可能会寻找长期的解决方案和解释,而这可以通过一个简单的步骤来解决@USER2102929另一位回答者的评论中已经提出了此解决方案,非常感谢。对我来说,第一个是问题的原因。我将compileOnly用于另一个库中的重复库,构建时将排除该库。