如何通过Gradle将Library中的Assets文件复制到jniLibs目录?
解决方案:将Android Library的Assets文件复制到应用的jniLibs目录
针对com.android.library类型的SDK,确实无法像应用模块那样自动处理jniLibs的复制,但可以通过自定义Gradle任务或者调整sourceSets配置实现需求,以下是两种可行方案:
方案一:直接复制到应用模块的jniLibs目录(适合本地开发调试)
在Library模块的build.gradle(Groovy语法)中添加以下配置:
android { // 保留原有配置... libraryVariants.all { variant -> def variantName = variant.name.capitalize() // 创建对应变体的复制任务 task "copyAssetsToJniLibs${variantName}"(type: Copy) { // 替换为你Library中目标assets文件的实际路径 from "${project.rootDir}/your-library-module/src/main/assets" // 替换为应用模块的jniLibs目录路径 into "${project.rootDir}/your-app-module/src/main/jniLibs" // 按需添加文件过滤规则,比如只复制.so文件 // include "**/*.so" } // 绑定任务到Library的构建流程,确保构建时自动执行复制 variant.assembleProvider.get().dependsOn "copyAssetsToJniLibs${variantName}" } }
如果使用Kotlin DSL(build.gradle.kts),配置如下:
android { // 保留原有配置... libraryVariants.all { val variantName = name.replaceFirstChar { it.uppercase() } val copyTask = tasks.register("copyAssetsToJniLibs$variantName", Copy::class) { from("${project.rootDir}/your-library-module/src/main/assets") into("${project.rootDir}/your-app-module/src/main/jniLibs") // include("**/*.so") // 按需启用过滤 } assembleProvider.get().dependsOn(copyTask) } }
注意事项:
- 替换
your-library-module和your-app-module为你项目中实际的模块名称 - 如果assets内的文件已经按CPU架构(如
arm64-v8a、armeabi-v7a)分目录,可以调整into路径为${project.rootDir}/your-app-module/src/main/jniLibs/${架构目录},实现对应架构的文件复制
方案二:将Assets文件打包到AAR的jniLibs目录(适合SDK分发)
如果你的SDK需要打包成AAR供其他应用依赖,更推荐这种方式——直接将Assets中的文件映射为Library的jniLibs源目录,这样打包后的AAR会包含这些文件,应用依赖时会自动合并到自身的jniLibs目录。
在Library模块的build.gradle(Groovy)中添加:
android { sourceSets { main { // 替换为你Assets中存放目标文件的子目录路径 jniLibs.srcDirs += "${project.rootDir}/your-library-module/src/main/assets/so-files" } } }
Kotlin DSL版本:
android { sourceSets { main { jniLibs.srcDirs("${project.rootDir}/your-library-module/src/main/assets/so-files") } } }
这种方式无需操作应用模块的目录,更符合SDK的分发规范,避免依赖外部模块的路径配置。
内容的提问来源于stack exchange,提问作者Víctor Martín
相关产品推荐
相关产品推荐

