【问题标题】:Duplicate files copied in APK Android在 APK Android 中复制的重复文件
【发布时间】:2017-07-12 15:22:34
【问题描述】:

我在尝试编译我的 Android 项目时遇到了“在 APK 中复制的重复文件”问题。

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK org/bytedeco/javacpp/windows-x86/msvcp120.dll
    File1: C:\Users\yuh5\.gradle\caches\modules-2\files-2.1\org.bytedeco.javacpp-presets\opencv\3.1.0-1.3\3d455d0c218e90072827d5b22b4163b1eea323e9\opencv-3.1.0-1.3-windows-x86.jar
    File2: C:\Users\yuh5\.gradle\caches\modules-2\files-2.1\org.bytedeco.javacpp-presets\hdf5\1.10.0-patch1-1.3\76b579910f51cd628bed8f6cbb245670483b9eeb\hdf5-1.10.0-patch1-1.3-windows-x86.jar

它说这是因为 msvcp120.dll 包含在两个地方,但我不知道如何执行“排除”或“选择优先”以消除此错误。

我的 gradle 脚本:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "com.yuh5.nih.testall"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/INDEX.LIST'
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile project(':libraries:opencv')
    compile ('org.deeplearning4j:deeplearning4j-core:0.8.0'){
        exclude group: 'org.json', module: 'json'
    }
    compile 'org.nd4j:nd4j-native:0.8.0'
    compile 'org.nd4j:nd4j-native:0.8.0:android-arm'

}

【问题讨论】:

    标签: android gradle dl4j


    【解决方案1】:

    将此添加到packagingOptions

     pickFirst 'org/bytedeco/javacpp/windows-x86/msvcp120.dll'
    

    【讨论】:

    • 那么我怎样才能得到正确的路径呢?我都尝试了:排除“META-INF/msvcp120.dll”并排除“META-INF/org/bytedeco/javacpp/windows-x86/msvcp120.dll”。但它们都不起作用。
    • 只使用exclude作为一个放置它,用星星
    • pickFirst 'org/bytedeco/javacpp/windows-x86/msvcp120.dll' 呢?
    • 成功了。非常感谢!还有其他三个文件我需要做同样的事情,所以完整的答案是:pickFirst 'org/bytedeco/javacpp/windows-x86/msvcp120.dll' pickFirst 'org/bytedeco/javacpp/windows-x86_64/msvcp120.dll' pickFirst 'org/bytedeco/javacpp/windows-x86/msvcr120.dll' pickFirst 'org/bytedeco/javacpp/windows-x86_64/msvcr120.dll'
    • 嗨@ToYonos,我想知道你是否也在你的Android项目中使用dl4j?如果是这样,您如何看待为什么没有帖子问这个问题?是因为它很容易,人们可以自己弄清楚吗?