HarmonyOS鸿蒙Next中使用Flutter开发的上架包发生CppCrash

HarmonyOS鸿蒙Next中使用Flutter开发的上架包发生CppCrash 1、使用DevEcoStudio运行app可以正常使用app; 将代码通过DevEco Studio的Build --> Build App,打包出来的app上架到应用市场,审核提示启动崩溃。 2、在哪个步骤出现了问题:app启动 3、希望得到什么结果:release包可以正常运行 4、您实际得到什么结果:release包启动崩溃 5、依赖如下: flutter_boost版本:4.6.5 https://gitee.com/alibaba/flutter_boost#/alibaba/flutter_boost/blob/main/Frequently Asked Question.md flutter_flutter分支:oh-3.27.4-dev,dart sdk 3.6.2 https://gitcode.com/openharmony-tpc/flutter_flutter

给华为提工单,回复如下: 在API12后,匿名内存执行权限管控策略发生变更:匿名内存执行权限管控策略变更说明。手机应用被禁止申请匿名内存。 在使用Dart FFI时,应避免使用Pointer.fromFunction,NativeCallable.isolateLocal等会申请匿名内存函数。可使用Dart_PostCObject代替。 经排查,我们写的代码没有使用Pointer.fromFunction,NativeCallable.isolateLocal等会申请匿名内存函数,是依赖的Dart SDK、Dart Packages、ffi.dart文件在使用,请问这种情况怎么处理呢?

部分日志: Device info:nova 14 Build info:TLR-AL00 6.0.0.110(SP8C00E110R3P5) Fingerprint:03d9924fe8f082b4e6bf473a917434a3c84fb196ae12abf0eddc2255cec6dd6d Module name:cn.com.ethank.hmos.app Version:1.0.0 VersionCode:1 PreInstalled:No Foreground:Yes Timestamp:2025-11-18 16:21:38.816 Pid:15858 Uid:20020193 Process name:cn.com.ethank.hmos.app Process life time:8s Process Memory(kB): 387289(Rss) Device Memory(kB): Total 11910476, Free 878560, Available 3827712 Reason:Signal:SIGABRT(SI_TKILL)@0x01317be100003df2 from:15858:20020193 LastFatalMessage:…/…/flutter/third_party/dart/runtime/vm/virtual_memory_posix.cc: 74: error: mmap failed: 22 (Invalid argument) Fault thread info: Tid:15858, Name:ethank.hmos.app #00 pc 00000000001b0958 /system/lib/ld-musl-aarch64.so.1(raise+216)(52299a28d60f0bb4073bd788bc023a3a) #01 pc 000000000015c8d8 /system/lib/ld-musl-aarch64.so.1(abort+24)(52299a28d60f0bb4073bd788bc023a3a)


更多关于HarmonyOS鸿蒙Next中使用Flutter开发的上架包发生CppCrash的实战教程也可以访问 https://www.itying.com/category-92-b0.html

4 回复

开发者您好,请先检查审核包中flutter.har使用的是否是release版本?使用debug版本的flutter.har会导致闪退,发布的正式包需要使用release编译,编译命令:flutter build hap --release,如不能解决您的问题,请及时反馈。

更多关于HarmonyOS鸿蒙Next中使用Flutter开发的上架包发生CppCrash的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


试试在ffi.dart或相关模块中,强制替换底层内存申请方式:

// 替换NativeCallable.isolateLocal为Dart_PostCObject方案
void _setupNativeCallHandler() {
  Dart_PostCObject_Type postCObjectType = ... // 根据业务逻辑定义
  Dart_NewNativePort("native_handler", postCObjectType, true);
}

鸿蒙Next中Flutter应用发生CppCrash,通常由Flutter引擎的C++层异常导致。可能原因包括:Flutter SDK与鸿蒙Next版本不兼容、Flutter引擎与鸿蒙底层交互的适配问题、或Flutter插件中的原生C++代码存在内存访问错误。排查需检查Flutter SDK版本、相关插件(特别是涉及原生代码的插件)的兼容性,并分析崩溃日志中的堆栈信息定位具体模块。

根据你提供的日志和华为工单回复,问题核心在于HarmonyOS Next API 12对匿名内存执行权限的管控升级。你的release包在启动时发生的CppCrash,其直接原因是底层Dart虚拟机(VM)在尝试申请可执行的匿名内存(mmap)时被系统拒绝(错误码22: Invalid argument)。

问题分析:

  1. 根本原因:如工单所述,API 12及以上版本禁止应用申请可执行的匿名内存。这是系统级的安全策略变更。
  2. 问题定位:虽然你自查的代码没有直接使用 Pointer.fromFunctionNativeCallable.isolateLocal,但崩溃日志指向了Dart运行时的内存分配代码(virtual_memory_posix.cc)。这表明问题出在你项目所依赖的Dart SDK或Flutter引擎(oh分支)以及通过FFI调用的原生代码(可能是Flutter Boost或其他插件),它们在底层可能使用了被禁止的内存操作方式。
  3. 调试与发布包差异:DevEco Studio直接运行使用的是调试模式,其内存分配策略或引擎行为可能与release包不同,导致问题在release包上才暴露。

解决思路:

由于问题根源在依赖的底层库,你需要自上而下进行排查和升级:

  1. 升级Flutter引擎(oh分支):确保你使用的 flutter_flutter oh分支是最新版本,并且明确支持HarmonyOS Next API 12。开发团队可能已经针对此内存策略变更进行了适配。你使用的 oh-3.27.4-dev 分支需要确认其兼容性。
  2. 升级Flutter Boost:将 flutter_boost 升级到其官方为HarmonyOS Next准备的最新兼容版本。检查其更新日志或源码提交,看是否已修复API 12的匿名内存问题。
  3. 排查其他FFI插件:检查项目中所有涉及FFI(C/C++交互)的插件或自定义代码。即使你没有直接调用,但这些插件内部可能使用了 Pointer.fromFunction 等函数。需要确保所有此类插件都已适配HarmonyOS Next的内存策略。
  4. 构建配置检查:在DevEco Studio中,检查release模式的构建配置(build-profile.jsonoh-package.json 中的 release 配置)。确保没有引入过时或不兼容的编译选项。
  5. 获取详细原生日志:仅靠崩溃堆栈可能不够。尝试在真机上通过 hdc shell hilog 命令捕获更详细的系统日志和应用的native层日志,过滤你的包名,寻找在 mmap 调用失败前后更具体的错误信息,这有助于定位是哪个具体的库或操作触发了限制。

总结:

当前问题的解决依赖于你整个Flutter技术栈(Dart SDK/引擎、flutter_boost、其他FFI插件)对HarmonyOS Next API 12内存安全策略的适配程度。你需要优先更新这些依赖到已知兼容的版本。如果更新后问题依旧,则需要根据更详细的日志,深入分析特定插件或引擎代码,或者等待相关依赖发布官方修复。

回到顶部