【问题标题】:Duplicate files during packaging of APK or UnsatisfiedLinkError AndroidAPK打包过程中文件重复或Android UnsatisfiedLinkError
【发布时间】:2015-12-08 11:59:54
【问题描述】:

我有一个使用相互依赖的库的 Android 项目:

Android 应用程序依赖于以下原生库

  • 模块 tess-2(包含 tesseract 和 leptonica)
  • 模块 opencv4android
  • 模块库

mylibrary 也依赖于 tess-two 和 opencv4android

以下是我的 Android 应用的 build.gradle 文件:

apply plugin: 'com.android.application'

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
    compile project(':libraries:opencv4android')
    compile project(':libraries:tess-two')
    compile project(':libraries:mylibrary')
}

android {
    compileSdkVersion 19
    buildToolsVersion "22.0.1"


    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }

//    packagingOptions {
//        exclude 'lib/armeabi/liblept.so'
//        exclude 'lib/armeabi/libtess.so'
//        exclude 'lib/armeabi-v7a/liblept.so'
//        exclude 'lib/armeabi-v7a/libtess.so'
//        exclude 'lib/mips/liblept.so'
//        exclude 'lib/mips/libtess.so'
//        exclude 'lib/x86/liblept.so'
//        exclude 'lib/x86/libtess.so'
//    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

由于 liblept.solibtess.so 被复制两次,基于此配置的 gradle 构建失败并出现 duplicate files during packaging of APK 错误。

但是,当我取消注释我可以成功构建的打包选项时,我会在运行时得到一个 UnsatisfiedLinkError,因为 liblept.solibtess.so 根本不包含在 apk 中。

我怎样才能让 liblept.solibtess.so 只包含在 apk 中一次?

【问题讨论】:

    标签: android gradle android-ndk android-gradle-plugin


    【解决方案1】:

    我想我找到了解决方案,但是我不太明白。

    mylibrary 和 tess-two 模块的 build.gradle 文件包含对

    的定义

    android.sourceSets.main.jniLibs.srcDirs = ['libs']

    在 tess-two 中注释此定义导致 libtess.soliblept.so 仅被复制到 apk 一次。

    如果有人了解此解决方案,请发表评论或回答。

    编辑:

    与此同时,我找到了一个更好的解决方案: 我将以下代码添加到我的主要应用程序 gradle.build 文件中:

    packagingOptions { // otherwise libtess.so and liblept.so are copied to apk twice resulting in an error
        pickFirst('lib/*/liblept.so')
        pickFirst('lib/*/libtess.so')
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 2014-10-18
      • 2015-08-02
      • 1970-01-01
      • 2015-05-02
      • 2015-12-11
      • 2014-01-07
      相关资源
      最近更新 更多