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
已经将日志附带在下方,大佬们帮忙看看可能是什么原因导致的?
更多关于HarmonyOS鸿蒙Next中flutter适配报错:Signal:SIGABRT(SI_TKILL)@0x01317b4b0000f986 from:63878:20020043的实战教程也可以访问 https://www.itying.com/category-92-b0.html
【背景知识】
- 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系统层之间的兼容性问题引起的。建议检查以下方面:
-
Flutter引擎版本兼容性:确认使用的Flutter SDK版本是否与HarmonyOS 3.22.0完全兼容。某些Flutter引擎的底层调用可能在HarmonyOS Next上存在未适配的接口。
-
Native代码冲突:检查Flutter插件或依赖的Native代码(如C++层)是否与HarmonyOS的系统库冲突。错误码20020043可能指向权限或资源访问异常。
-
资源或内存问题:在真机测试通过但发布环境失败时,可能是资源压缩或内存分配差异导致。尝试在
flutter build hap
时添加--no-shrink
参数禁用代码优化,排除混淆带来的影响。 -
系统API调用:排查是否使用了HarmonyOS禁用的API或权限,尤其是在登录环节涉及网络或安全模块时。查看测试环境与开发环境的系统权限配置是否一致。
建议提供更详细的日志(如堆栈跟踪或Flutter异常输出),以便进一步定位问题。