HarmonyOS鸿蒙Next中我想加载的包外 .so 是从网盘下载的, 但 dlopen 无法加载
HarmonyOS鸿蒙Next中我想加载的包外 .so 是从网盘下载的, 但 dlopen 无法加载 我想求助的问题就是, 怎么在鸿蒙应用中 C++ 侧加载包外的 .so?
路径这一步可能没问题, 因为我可以用 std::ifstream 读到包外的 .so, 调用 dlopen 后不能加载, dlerror 提示找不到文件. 我想试试启用 AllowNativeCycleSharedLibs, 参考文档里找不到怎么操作? 另外官方的 AI 说这个选项和包外 so 签名权限无关, 咋回事?
我想加载的包外 .so 是从网盘下载的, 保存的路径是 /dataorage/el2/base/haps/entry/files, ABI 是 Tablet 模拟器一致的 x86_64, 使用 std::istream 可读到下载 .so 的文件大小, 因此认为文件有正确下载, 但 dlopen 无法加载
更多关于HarmonyOS鸿蒙Next中我想加载的包外 .so 是从网盘下载的, 但 dlopen 无法加载的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,可以采取以下方式解决:
【解决方案】
- so存储路径:为保障用户隐私安全,dlopen具有命名空间隔离能力,应用可以加载的动态库受到命名空间的限制。一般应用只能够加载应用安装包目录/data/storage/el1/bundle下的动态库,以及系统内置对外开放的动态库,若加载自定义路径动态库会报错,具体引用步骤参考通过调用dlopen的方式引用。
- ABI配置:不同ABI对应的开发设备不同,其中arm64适用于现代移动设备和嵌入式系统,如智能手机、平板电脑、物联网设备等,参考arm64,armv7,x86_64 三种架构的适用范围。
- 热修复:若您的场景是在应用内下载so并进行加载,做类似于热修复的操作,该功能是不支持的。但考虑到应用紧急故障快速修复的诉求,HarmonyOS应用市场提供快速上架方案,如果应用出现紧急修复情况,华为可以快速审核,通过快速审核+应用端内弹框加快应用更新速度。审核加急详情可参考:配置审核加急。
更多关于HarmonyOS鸿蒙Next中我想加载的包外 .so 是从网盘下载的, 但 dlopen 无法加载的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
依我看这是鸿蒙的安全性决定的。。。随随便便加载so就不安全了啊。。。热更新听说过吧,这条路不好走哦
在HarmonyOS Next中,包外.so文件无法通过dlopen直接加载,因为系统强化了安全策略。鸿蒙应用沙箱机制限制了应用只能访问自身数据目录内的动态库。若需加载外部.so,需通过鸿蒙的共享文件库机制,将.so文件预置在应用的libs目录下,或使用鸿蒙的动态共享包(HSP)方案。网络下载的.so文件需先移至应用沙箱路径,但系统仍可能因签名校验或路径权限拒绝加载。


