You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:25:32