如何将包含SO库的Android模块库引入另一Android模块库并打包进其AAR文件
解决Android Library模块依赖中Native库打包进AAR的问题
我之前也碰到过一模一样的问题——Android Gradle Plugin(AGP)默认情况下,只会把Library模块自身jniLibs目录下的SO库打包进AAR,依赖模块的SO库并不会自动被包含进去,哪怕类文件已经正确打包了。针对你的场景,这里有几种可靠的解决方案:
方案一:通过配置JniLibs源目录包含libB的SO输出
我们可以让libA把libB编译生成的SO库目录当作自己的JniLibs来源之一,这样AGP在打包libA的AAR时,就会把这些SO库一起打包进去。
在libA/build.gradle中添加以下配置:
apply plugin: 'com.android.library' android { // 你的其他配置... // 遍历所有Library变体,动态添加libB的SO输出目录 libraryVariants.all { variant -> // 获取当前变体的构建类型(debug/release) def buildType = variant.buildType.name // 指向libB编译生成SO的目录(AGP 4.x版本的默认路径) def libBSourceDir = "${project(':libB').buildDir}/intermediates/cmake/${buildType}/obj" // 将该目录添加到libA的JniLibs源目录集合中 variant.sourceSets.main.jniLibs.srcDirs += libBSourceDir } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // 保持对libB的依赖,用api或implementation都可以,这里类已经正常打包了 implementation project(path: ':libB') }
方案二:通过复制任务手动同步SO库
如果方案一的路径匹配有问题,你也可以创建一个Gradle任务,在构建libA之前,把libB的SO库复制到libA的jniLibs目录下:
apply plugin: 'com.android.library' android { // 你的其他配置... } // 创建复制任务,将libB的SO复制到libA的jniLibs task copyLibBSOToLibA(type: Copy) { // libB编译后的SO输出目录 from "${project(':libB').buildDir}/intermediates/cmake/debug/obj" from "${project(':libB').buildDir}/intermediates/cmake/release/obj" // 复制到libA的jniLibs目录 into "src/main/jniLibs" // 只复制SO文件 include "**/*.so" } // 让libA的预构建任务依赖这个复制任务 preBuild.dependsOn copyLibBSOToLibA dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(path: ':libB') }
验证方法
配置完成后,执行以下步骤验证:
- 执行
./gradlew :libA:assembleRelease(或Debug)构建libA模块 - 找到
libA/build/outputs/aar/libA-release.aar文件,解压它 - 查看解压后的
jni目录,应该能看到各个架构目录下同时存在libA.so和libB.so
这样当app模块依赖libA时,就能自动获取到两个SO库了。
内容的提问来源于stack exchange,提问作者Sheikh
相关产品推荐
相关产品推荐

