gpt4 book ai didi

android - 如何在多项目 Android 构建中排除重复的 C 共享库 (.so)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:38:25 26 4
gpt4 key购买 nike

我在使用两个库模块构建父项目时遇到“重复文件”冲突,这两个库模块使用相同的 libc++_shared.so 共享库。

(注意:请不要认为这是一个“重复的问题”。我已经阅读了几篇相关的文章,这些文章帮助我走到了这一步。但是,没有一篇文章提供了适用于我的案例涉及 NDK Artifact 。)

当我只有 1 个这样的库模块时,构建工作正常。第二个库模块的添加现在造成了冲突。

考虑以下项目结构:1 个父项目,2 个“子”项目 - 但每个项目都位于同一目录级别(即不嵌套层次结构)

ProjectA/   (Parent)
LibraryModuleA1/
build/exploded-aar/com.package.name/
LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
build.gradle (bgA1)
Test_APK_Module A1T/
build.gradle (bgA1T)
build.gradle (bgPA)

ProjectB/
LibraryModuleB1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgB1)
build.gradle (bgPB)

ProjectC/
LibraryModuleC1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgC1)
build.gradle (bgPC)

库模块 A1 依赖于库模块 B1 和 C1。
A1 -> B1
A1 -> C1

项目 B 和 C 都具有基于 NDK 的代码并正确构建/测试。两者都依赖于 libc++_shared.so 共享库。

但是,在构建项目 A 时,我在 :LibraryModuleA1:packageDebugTest 任务期间遇到以下错误:

Error: duplicate files during packaging of APK   /ProjectA/LibraryModuleA1/build/apk/LibraryModuleA1-debug-test-unaligned.apk
Path in archive: lib/armeabi-v7a/libc++_shared.so
Origin 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
Origin 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
You can ignore those files in your build.gradle:
android {
packagingOptions {
exclude 'lib/armeabi-v7a/libc++_shared.so'
}
}

* What went wrong:
Execution failed for task ':LibraryModuleA1:packageDebugTest'.
> Duplicate files copied in APK lib/armeabi-v7a/libc++_shared.so
File 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
File 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so

:LibraryModuleA1:packageDebugTest FAILED

到目前为止我尝试了什么

  1. 我试图将建议的闭包添加到我的 build.gradle 文件,但是我应该将它添加到哪个 build.gradle 文件?我已将闭包添加到 bgA1bgB1bgC1(一次一个),但没有成功。
  2. 建议的闭包表示使用 exclude 'lib/armeabi-v7a/libc++_shared.so'。每个“子”库模块在 build/lib 路径下构建 libc++_shared.so 文件。但是,我注意到父库模块在 中复制了 jni/armeabi-v7a/libc++_shared.so 下的 libc++_shared.so 文件build/exploded-aar 目录结构。 (见上文)闭包是否应该改为读取 exclude 'jni/armeabi-v7a/libc++_shared.so(即 jnilib )?
  3. 因为我使用的是 Gradle 插件 0.9.1,所以我尝试使用 pickFirst 代替 exclude,但这也没有成功。

有人可以帮助确定我应该如何为我的给定案例配置“packagingOptions”闭包吗?

感谢您的帮助!

最佳答案

我遇到了同样的问题,但没有成功排除或 pickFirst。所以我使用了一个有点难看的解决方法。这个想法是在主项目的构建目录中创建一个“native-libs”文件夹,从那里复制 ndk 库项目中所有必需的 *.so 文件,然后告诉构建系统将这些库打包到 apk 中。

在我的主项目(应用程序项目)中,我明确定义了包含我所依赖的 ndk 代码的模块列表

// Ndk stuff. We have to explicitely manage our NDK dependencies
ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')]
apply from: '../depend_ndk.gradle'

然后,'depend_ndk.gradle' 是一个包含

// Build helper for projects that depends on a native library with a NDK part
// Define the list of ndk library you depend on in project main file :
// ext.jniProjects = [project(':ndklib1')]
// apply from : 'depend_ndk.gradle'
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
import com.android.build.gradle.tasks.PackageApplication

// As a workaround, we create a new 'native-libs' folder in the current project and
// copy all the .so we depend on into it
def ndkLibsDir = new File(buildDir, 'native-libs')
ndkLibsDir.mkdir()

task copyDependingNativeLibs(type: Copy) {
// Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html
println 'jniProjects ' + jniProjects
jniProjects.each {
from(new File(it.buildDir, 'native-libs')) {
include '**/*.so'
}
}
into ndkLibsDir
}

tasks.withType(PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(ndkLibsDir)
pkgTask.dependsOn copyDependingNativeLibs
}

关于android - 如何在多项目 Android 构建中排除重复的 C 共享库 (.so)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com