HarmonyOS鸿蒙Next中flutter适配报错:Signal:SIGABRT(SI_TKILL)@0x01317b4b0000f986 from:63878:20020043

HarmonyOS鸿蒙Next中flutter适配报错:Signal:SIGABRT(SI_TKILL)@0x01317b4b0000f986 from:63878:20020043 我们的应用是flutter开发的,现在用的鸿蒙3.22.0版flutter做的适配。目前开发环境真机测试没问题,上架到测试环境后就出现登录闪退的情况。

已经尝试过一下的几种方式,但是都没有解决问题:

1、关闭DevEco的代码混淆
2、清理当前项目的缓存,重新依赖:flutter clean 和 Clean project
3、使用flutter进行打包,执行命令:flutter build hap --release

cke_6673.png

已经将日志附带在下方,大佬们帮忙看看可能是什么原因导致的?


更多关于HarmonyOS鸿蒙Next中flutter适配报错:Signal:SIGABRT(SI_TKILL)@0x01317b4b0000f986 from:63878:20020043的实战教程也可以访问 https://www.itying.com/category-92-b0.html

3 回复

【背景知识】

  • SIGABRT为CppCrash中的系统处理的崩溃信号,解释为进程终止,处罚原因为进程异常终止,通常为进程自身调用标准函数库的abort()函数。
  • Dart FFI(外部函数接口)是Dart语言提供的一种机制,允许开发者在Dart代码中调用本地C/C++代码,实现跨语言交互。核心功能:
    • 跨语言调用‌:通过FFI,Dart可以直接调用本地C/C++函数,无需额外桥接代码,适用于需要高性能计算或底层系统功能支持的场景。
    • 类型映射‌:支持将Dart类型(如int、float)映射为C/C++对应类型(如int32、float),并处理指针、结构体等复杂数据结构。
    • 动态库加载‌:可通过DynamicLibrary加载本地动态库文件(如.so或.dll),并查找特定函数符号。
  • 匿名内存执行权限管控策略变更说明:为了维护生态的纯净,防止恶意应用向匿名内存注入指令,实现任意代码执行,以绕过代码签名管控,达到变脸或攻击系统的目的,系统要限制应用内设置匿名内存为可执行的行为。

【问题定位】 分析崩溃日志,发生在栈顶libflutter.so。报错信息为mprotect failed,通常由权限不足、内存页锁定或系统资源限制导致。

【分析结论】 应用使用Flutter框架进行开发,使用Dart FFI调用C++代码时申请了匿名内存,Flutter利用mprotect动态修改内存的可读写性,被系统拒绝导致Crash。

【修改建议】 在API12后,匿名内存执行权限管控策略发生变更:匿名内存执行权限管控策略变更说明。手机应用被禁止申请匿名内存。 在使用Dart FFI时,应避免使用Pointer.fromFunction,NativeCallable.isolateLocal等会申请匿名内存函数。可使用Dart_PostCObject代替,可参照以下示例:

#include <thread>
#include <string>

#include "dart_api/dart_api.h"
#include "dart_api/dart_native_api.h"
#include "dart_api/dart_api_dl.h"

// 1.声明线程执行函数
void thread_func(Dart_Port sendPort, char *name);

// 2.初始化 Dart Native API
DART_EXPORT intptr_t InitDartApiDL(void* data) {
  return Dart_InitializeApiDL(data);
}

// 3.开启线程
DART_EXPORT void NativeAsyncExecute(Dart_Port sendPort, char *name) {
    std::thread thread1(thread_func, sendPort, name);
    thread1.detach();
}

// 4.线程实际操作
void thread_func(Dart_Port sendPort, char *name) {
    printf("thread is running, arg=%s", name);

     //等待一段时间
    std::this_thread::sleep_for(std::chrono::seconds(3));

    std::string greeting("Hello, ");
    greeting += std::string(name);

    //创建一个Dart对象,然后发给给Dart
    Dart_CObject dart_object;
    dart_object.type = Dart_CObject_kString;	//Dart对象的类型
    dart_object.value.as_string = (char*) greeting.c_str();	//Dart对象的值
    Dart_PostCObject_DL(sendPort, &dart_object);	//发送给Dart

    free(name); //释放内存

    printf("thread is over, return=%s", greeting.c_str());
}

更多关于HarmonyOS鸿蒙Next中flutter适配报错:Signal:SIGABRT(SI_TKILL)@0x01317b4b0000f986 from:63878:20020043的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


该错误通常由Flutter引擎与鸿蒙Next系统不兼容引起。SIGABRT表示异常终止,可能涉及资源冲突或系统调用失败。建议检查Flutter for HarmonyOS的特定版本兼容性,确认NDK配置是否符合鸿蒙Next要求,并验证插件与系统API的交互逻辑。需使用鸿蒙专用Flutter工具链重新编译。

从日志中的SIGABRT信号和错误码20020043来看,这通常是由Flutter引擎与HarmonyOS Next系统层之间的兼容性问题引起的。建议检查以下方面:

  1. Flutter引擎版本兼容性:确认使用的Flutter SDK版本是否与HarmonyOS 3.22.0完全兼容。某些Flutter引擎的底层调用可能在HarmonyOS Next上存在未适配的接口。

  2. Native代码冲突:检查Flutter插件或依赖的Native代码(如C++层)是否与HarmonyOS的系统库冲突。错误码20020043可能指向权限或资源访问异常。

  3. 资源或内存问题:在真机测试通过但发布环境失败时,可能是资源压缩或内存分配差异导致。尝试在flutter build hap时添加--no-shrink参数禁用代码优化,排除混淆带来的影响。

  4. 系统API调用:排查是否使用了HarmonyOS禁用的API或权限,尤其是在登录环节涉及网络或安全模块时。查看测试环境与开发环境的系统权限配置是否一致。

建议提供更详细的日志(如堆栈跟踪或Flutter异常输出),以便进一步定位问题。

回到顶部