Android Gradle Plugin7.4.0下AAR中Jar内SO无法打包进APK求助
问题描述
- 将Flutter模块打包为AAR文件,AAR的
lib目录包含若干Jar包,这些Jar包内部嵌套了SO库 - 在Android Gradle Plugin(AGP)7.4.0版本的APK项目中引入该AAR后,构建生成的APK未包含Jar包内的SO库
- 相同操作在使用AGP 3.5.3的旧项目中可正常将SO库打包进APK
解决方案及相关说明
1. 问题根源
AGP 7.x版本对AAR中嵌套资源的处理逻辑进行了变更,默认不再自动提取Jar包内的SO文件并打包进APK,而旧版本AGP会自动处理这类嵌套的原生库资源。
2. 可行解决方法
方法一:调整Flutter模块打包AAR的配置,避免SO嵌套在Jar中
在Flutter模块的Android端模块级build.gradle文件中,配置将SO库直接放置到AAR的jniLibs目录,而非嵌套进Jar:
android { // 保留原有其他配置 sourceSets { main { // 根据实际SO库的架构目录调整路径,比如armeabi-v7a、arm64-v8a等 jniLibs.srcDirs = ['libs/armeabi-v7a', 'libs/arm64-v8a', 'libs/x86', 'libs/x86_64'] } } }
重新打包Flutter模块为AAR后,SO库会被AGP 7.x正确识别,引入到APK项目时可正常打包进最终APK。
方法二:在引入AAR的APK项目中添加SO提取任务
如果无法修改Flutter模块的打包逻辑,可在APK项目的模块级build.gradle中添加Gradle任务,手动提取AAR内Jar包中的SO库:
android { // 保留原有其他配置 applicationVariants.all { variant -> variant.preBuild.doLast { // 指向存放AAR的目录,根据实际路径调整 def aarDir = file("${project.rootDir}/libs") def aarFiles = fileTree(dir: aarDir, include: '*.aar') aarFiles.each { aarFile -> def unpackDir = new File("$buildDir/tmp/aar_unpack/${aarFile.name.replace('.aar', '')}") unpackDir.mkdirs() // 解压AAR到临时目录 copy { from zipTree(aarFile) into unpackDir } // 遍历AAR内的Jar包,提取SO到项目jniLibs def jarFiles = fileTree(dir: "${unpackDir}/lib", include: '*.jar') jarFiles.each { jarFile -> copy { from zipTree(jarFile) include '**/*.so' into "${projectDir}/src/main/jniLibs" // 自动创建对应架构目录 eachFile { file -> def archDir = file.path.split('/').find { it in ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'] } if (archDir) { file.path = "${archDir}/${file.name}" } } } } } } } }
执行APK构建前,该任务会自动将所有引入AAR中Jar包内的SO库提取到项目的jniLibs目录,确保被打包进最终APK。
方法三:配置AGP的packagingOptions辅助处理
在APK项目的模块级build.gradle中添加如下配置,强制AGP包含SO文件(建议结合方法二使用):
android { packagingOptions { pickFirst '**/*.so' doNotStrip '**/*.so' } }
该配置可避免SO文件被重复打包或剥离,但对嵌套Jar内的SO识别效果有限,仅作为辅助手段。
3. 社区反馈情况
该问题在Stack Overflow、Google Android Issue Tracker等开发者社区均有大量反馈,属于AGP 7.x版本的兼容性变更问题,核心是新版本AGP收紧了资源打包规则,默认不再处理嵌套在Jar中的原生库。
内容的提问来源于stack exchange,提问作者ourCHK
相关产品推荐
相关产品推荐

