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

主App与Library配置不同ndk.abiFilters编译不符合预期问题

配置不生效的核心原因

你在Library模块单独配置的ndk { abiFilters "arm64-v8a" } 被忽略是Gradle处理Native依赖的默认规则:所有依赖库的ABI过滤规则优先级低于宿主App模块的同项配置,编译Library时会直接沿用App模块声明的全量ABI集合生成对应架构的.so文件,最终打包阶段才会做全量过滤,因此Library模块内单独配置的abiFilters不会在编译Library阶段生效,才会出现额外生成armeabi-v7a架构.so占用包体积的问题。

靠模块单独配置abiFilters无法实现「不同CPU架构仅打包对应所需库文件」的效果,可根据你的发布场景选择以下方案解决:


方案1:AAB格式发布(最推荐,零额外配置成本)

如果你的应用上架支持按ABI动态分发的应用市场,优先选择Android App Bundle格式发布,不需要调整模块依赖关系:

  • 删除Library模块内所有ndk { abiFilters ... } 配置,避免干扰构建逻辑
  • 主App模块保留ABI声明,手动开启ABI拆分开关(默认开启,手动配置避免被其他规则覆盖),配置示例如下:
    // 主App模块 build.gradle
    android {
        defaultConfig {
            ndk {
                abiFilters "armeabi-v7a", "arm64-v8a"
            }
        }
        bundle {
            abi {
                enableSplit = true
            }
        }
    }
    
  • 打包输出AAB格式上传应用市场即可,市场会自动根据用户设备的CPU架构下发对应内容:
    • armeabi-v7a设备的安装包仅包含v7a架构的所有.so文件,不会携带arm64-v8a架构的冗余内容
    • arm64-v8a设备的安装包仅包含arm64架构的所有.so文件,不会携带armeabi-v7a架构的冗余内容
      该方案下你提到的20MB冗余.so不会被下发到用户设备。

方案2:分架构APK输出(适用于线下分发、不支持AAB的渠道)

如果需要直接输出单架构APK,通过ABI拆分+按构建变体按需依赖的方式实现,可彻底避免冗余.so编译和打包:

  • 同样先删除Library模块内所有ndk { abiFilters ... } 配置
  • 在主App模块开启ABI拆分,关闭通用包生成:
    // 主App模块 build.gradle
    android {
        defaultConfig {
            // *必须删除defaultConfig内的ndk abiFilters配置*,避免和splits规则冲突
        }
        splits {
            abi {
                enable true
                reset()
                include "armeabi-v7a", "arm64-v8a" // 声明需要支持的目标架构
                universalApk false // 关闭包含全架构的通用APK生成,避免额外包体积
            }
        }
    }
    
  • 调整依赖引入规则:不要全局用implementation project(':你的Library模块名') 引入仅支持arm64-v8a的Library,改为仅在arm64-v8a构建变体中引入该依赖,armeabi-v7a变体不引入该依赖。配置完成后编译v7a版本时根本不会触发该Library的编译,自然不会生成冗余的v7a架构.so。

验证方法

配置完成后可通过Android Studio的Build > Analyze APK功能检查APK内容,满足以下两点即为配置生效:

  • 对应架构APK的lib目录下仅存在目标架构的.so文件,无其他架构的冗余内容
  • armeabi-v7a版本APK中不存在仅支持arm64的Library的相关文件

注意:不推荐用packagingOptions 写exclude规则过滤冗余.so,该方式仅会在打包阶段删除文件,编译阶段仍会生成全架构.so,既拖慢编译速度,也容易因为规则漏写导致冗余文件被打包。

内容的提问来源于stack exchange,提问作者Tomek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:17