HarmonyOS鸿蒙Next中打包hap/app能过滤so只保留特定abi吗?
HarmonyOS鸿蒙Next中打包hap/app能过滤so只保留特定abi吗? 就是像安卓那样简单指定debug保留arm64/x86_64, 指定release保留arm64, 不管具体用到什么库以及库产出了那些abi,不要的全部过滤掉,
abiFilters好像只在cmake编译阶段生效,打包没找到合适的配置,
总之结论就是无法仅保留特定abi,只能是仅排除特定abi,得结合最终拆包hap看实际有哪些abi打包进来了, 不要的排除掉,
顺便cmake模块默认只打包armv8一个abi,得手动指定所有需要的abi,
背景知识:
可以在 entry 下面的 build-profile.json5 文件中配置nativelib的filter选项来过滤so文件,只保留特定的ABI架构。
问题解决:
配置参数:
{
"apiType": "stageModel",
"buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "",
"cppFlags": "",
"abiFilters": ["arm64-v8a", "x86_64"] // debug模式包含两种架构
},
"nativelib": {
"filter": {
"excludes": ["**/armeabi-v7a/*.so"]
}
}
},
"buildOptionSet": [
{
"name": "release",
"buildOption": {
"externalNativeOptions": {
"abiFilters": ["arm64-v8a"] // release模式只保留arm64-v8a
},
"nativelib": {
"filter": {
"excludes": ["**/x86_64/*.so", "**/armeabi-v7a/*.so"]
}
}
}
}
]
}
可以,但要分清两个配置:externalNativeOptions.abiFilters 只影响本模块 CMake 编译哪些 ABI;最终打包已有 .so 要用 buildOption.nativeLib.filter。你这种“无论库从哪里来,最终只保留指定 ABI”的场景,建议在不同 buildOptionSet 里配置 nativeLib.filter.excludes,例如 release 排除 **/x86_64/*.so,只保留 arm64-v8a。三方 HAR/HSP/ohpm 包自带的 so 不一定受 abiFilters 影响,打包后最好解压 HAP 看 libs 目录确认。
在 entry/build-profile.json5 里面配置
这是官网样例
"buildOption": {
"nativeLib": {
"filter": {
"excludes": [
"**/armeabi-v7a/*.so", //排除所有armeabi-v7a架构的so文件
"**/x86_64/*.so"//排除所有x86_64架构的so文件
]
}
}
},
可以。在HarmonyOS NEXT中,通过配置模块的 build-profile.json5 中的 abiFilters 字段(如 ["arm64-v8a"])即可打包时仅保留指定ABI的so文件。需确保HAP/APP包体积符合要求。该设置仅作用于native库,不影响其他资源。
在 HarmonyOS Next 中,可以通过以下两种方式过滤 SO,仅保留特定 ABI:
1. 编译期 + 打包期过滤(推荐)
在模块的 build-profile.json5 中直接设置 buildOption.externalNativeOptions.abiFilters,该配置会同时限制编译和最终 HAP 中携带的 ABI:
{
"buildOption": {
"externalNativeOptions": {
"abiFilters": ["arm64-v8a", "x86-64"] // debug
}
}
}
对应 release 只需改为 ["arm64-v8a"]。可通过不同的 buildMode 或自定义 build-profile 分别配置。
2. 仅打包期过滤
若 SO 已经编译出多个 ABI,仅需在打包时剔除,则使用 packOptions.exclude 排除目录:
{
"packOptions": {
"exclude": ["**/armeabi-v7a/**", "**/x86/**"]
}
}
此配置会将 lib/ 下所有不想要的 ABI 目录排除,最终 hap 中只保留指定架构。
两种方式可组合使用,灵活满足 debug/release 不同需求。



