HarmonyOS鸿蒙Next中Flutter应用本地运行正常但是打包成app启动失败
HarmonyOS鸿蒙Next中Flutter应用本地运行正常但是打包成app启动失败 根据文章 <flutter应用,本地运行正常但是打包成app启动失败-华为开发者问答> 的建议,使用构建命令进行构建,仍然启动失败:
flutter build app --release --flavor release
在代码中加上打印日志,云调试日志中没有任何sqlite日志(本地真机调试有),初步怀疑可能是数据库相关插件导致,项目中使用sqlite相关的插件包有:
- drift: 2.22.0
- sqlite3:
- git:
- url: https://github.com/SageMik/sqlite3-ohos.dart.git
- path: “sqlite3”
- ref: sqlite3-2.4.7-ohos
- git:
- sqlite3_flutter_libs:
- git:
- url: https://github.com/SageMik/sqlite3-ohos.dart.git
- path: “sqlite3_flutter_libs”
- ref: sqlite3_flutter_libs-0.5.25-ohos
- git:
build-profile.json5中有相关配置:
{
...
"products": [
...
{
"name": "release",
"signingConfig": "release",
"compatibleSdkVersion": "5.0.0(12)",
"runtimeOS": "HarmonyOS",
"targetSdkVersion": "6.0.0(20)",
"buildOption": {
"strictMode": {
"useNormalizedOHMUrl": true
}
}
}
],
...
}
在云调试真机运行报错的日志:
Signal:SIGABRT(SI_TKILL)@0x01317b51000082d1 from:33489:20020049
LastFatalMessage:../../flutter/third_party/dart/runtime/vm/virtual_memory_posix.cc: 611: error: mprotect failed: 22 (Invalid argument) Thread name:DartWorker #00 pc 00000000001b05ec /system/lib/ld-musl-aarch64.so.1(raise+216)(2fe6af71a2e582bd4bf6248a945a311e) #01 pc 000000000015c568 /system/lib/ld-musl-aarch64.so.1(abort+24)(2fe6af71a2e582bd4bf6248a945a311e) #02 pc 0000000000ab7094 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #03 pc 0000000000b72ba0 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #04 pc 0000000000b72544 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #05 pc 0000000000ae5de0 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #06 pc 0000000000ae621c /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #07 pc 0000000000ac36dc /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #08 pc 0000000000b00dd4 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #09 pc 0000000000b010b4 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #10 pc 000000000088cd18 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #11 pc 0000000000ae0ef8 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #12 pc 0000000000ae1674 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #13 pc 0000000000ae0624 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #14 pc 0000000000adf684 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #15 pc 0000000000adf25c /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #16 pc 000000000103fac8 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #17 pc 000000000103f728 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #18 pc 000000000103d84c /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #19 pc 00000000011a5e38 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #20 pc 00000000008a3860 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #21 pc 00000000008a36f8 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #22 pc 00000000008a0bf0 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #23 pc 00000000008a1bcc /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #24 pc 00000000008c5f8c /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #25 pc 0000000000890700 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #26 pc 00000000008905fc /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #27 pc 00000000008905c0 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #28 pc 00000000008db9c0 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #29 pc 00000000008db964 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #30 pc 000000000088ca20 /data/storage/el1/bundle/libs/arm64/libapp.so(301f7881511673cb729d2007be67e03e) #31 pc 0000000000ae0e58 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #32 pc 0000000000ae261c /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #33 pc 0000000000aec4e0 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #34 pc 0000000000af266c /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #35 pc 0000000000af2998 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #36 pc 0000000000b6e0e0 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #37 pc 0000000000b6e298 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #38 pc 0000000000b4f430 /data/storage/el1/bundle/libs/arm64/libflutter.so(871c4d87ae3c3eed1c87d88ad301ba539b8c398b) #39 pc 00000000001d06b8 /system/lib/ld-musl-aarch64.so.1(start+240)(2fe6af71a2e582bd4bf6248a945a311e)
更多关于HarmonyOS鸿蒙Next中Flutter应用本地运行正常但是打包成app启动失败的实战教程也可以访问 https://www.itying.com/category-92-b0.html
【问题定位】
分析崩溃日志,发生在栈顶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());
}
【背景知识】
- SIGABRT为CppCrash中的系统处理的崩溃信号,解释为进程终止,处罚原因为进程异常终止,通常为进程自身调用标准函数库的abort()函数。
- Dart FFI(外部函数接口)是Dart语言提供的一种机制,允许开发者在Dart代码中调用本地C/C++代码,实现跨语言交互。核心功能:
- 跨语言调用:通过FFI,Dart可以直接调用本地C/C++函数,无需额外桥接代码,适用于需要高性能计算或底层系统功能支持的场景。
- 类型映射:支持将Dart类型(如int、float)映射为C/C++对应类型(如int32、float),并处理指针、结构体等复杂数据结构。
- 动态库加载:可通过DynamicLibrary加载本地动态库文件(如.so或.dll),并查找特定函数符号。
- 匿名内存执行权限管控策略变更说明:为了维护生态的纯净,防止恶意应用向匿名内存注入指令,实现任意代码执行,以绕过代码签名管控,达到变脸或攻击系统的目的,系统要限制应用内设置匿名内存为可执行的行为。
开发者你好,如果上诉的方案不能解决您的问题,请提供一下您的版本信息(flutter、开发工具以及手机系统版本信息)
更多关于HarmonyOS鸿蒙Next中Flutter应用本地运行正常但是打包成app启动失败的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
这种方式无法对已经编译好的.so文件进行修改, 能否从底层对 Pointer.fromFunction,NativeCallable.isolateLocal进行兼容?,
开发者你好,还有一点,从报错日志中识别出别出关键词,SI_TKILL、raise+216、abort+24等,这些都是断言日志,表示flutter.har是使用的debug版本,正式发布的包应该使用release编译,日志中不应该出现断言,开发者请尝试下使用release编译看下是否还会出现该错误:
进入工程ohos目录,执行flutter build hap --release构建release hap;
进入工程根目录,执行flutter build app --release构建release app;,
鸿蒙Next中Flutter应用打包后启动失败,可能原因包括:Flutter引擎与鸿蒙Next系统API不兼容、Flutter插件未适配鸿蒙、资源文件未正确打包、或构建配置有误。需检查Flutter SDK版本是否支持鸿蒙Next,并确保所有依赖插件已适配鸿蒙。
根据你提供的日志,问题核心在于 mprotect failed: 22 (Invalid argument) 错误。这是一个内存权限设置失败的系统级错误,通常与Flutter引擎在HarmonyOS Next上的内存映射或JIT(即时编译)行为有关。
根本原因分析:
- HarmonyOS Next的安全限制:HarmonyOS Next对应用可执行内存区域(如JIT代码缓存)的权限(如
PROT_EXEC)有更严格的管控。Flutter引擎在特定模式下(尤其是Release模式下的某些优化)尝试设置内存权限时,可能违反了系统的安全策略。 - SQLite插件的影响:你怀疑的SQLite插件(
sqlite3-ohos)本身是为HarmonyOS适配的,但问题可能不在于插件功能,而在于插件或其依赖的原生库(.so文件)的加载方式或内存属性,可能与Flutter引擎的内存管理产生冲突,从而触发了系统的保护机制。
解决方案: 此问题通常需要通过修改Flutter引擎的构建配置或应用的启动参数来解决。
步骤1:禁用Dart JIT(最可能有效的方案) 在HarmonyOS Next上,为规避内存权限问题,最直接的方法是强制Flutter以AOT(预先编译)模式运行,完全禁用JIT。这需要在构建或运行时指定参数。
-
修改构建命令:在打包时,通过环境变量强制指定运行模式。
flutter build app --release --flavor release --dart-define=FLUTTER_BUILD_MODE=release --dart-define=FLUTTER_BUILD_AOT=true或者,更直接地,确保你的构建配置(如
build-profile.json5)没有启用任何调试或JIT相关的选项。检查并确保"buildOption"中没有类似于"enableDebug"或"jsHeapSize"等可能影响运行时的设置。 -
在代码中验证运行模式:在你的Dart入口文件(如
main.dart)的最开始,添加以下代码以确认运行模式:import 'dart:developer' as developer; void main() { developer.debugger(); print('Flutter build mode: ${const String.fromEnvironment('FLUTTER_BUILD_MODE', defaultValue: 'unknown')}'); print('Is in debug mode: ${assert(() { print('Debug mode'); return true; }(), false)}'); runApp(MyApp()); }在Release包中,
assert语句内的代码不应执行。如果执行了,说明构建模式可能不对。
步骤2:检查并配置HarmonyOS应用权限
确保你的应用在module.json5文件中声明了必要的权限。虽然此错误是内存操作失败,但某些系统权限的缺失可能间接导致问题。
- 检查是否声明了
ohos.permission.INTERNET(如果应用有网络请求)等基本权限。 - 对于涉及本地存储(SQLite数据库文件读写)的操作,确保正确配置了文件访问权限,例如在
module.json5的"abilities"或"extensionAbilities"中,对需要访问的目录进行声明(如"storage")。
步骤3:验证SQLite插件与HarmonyOS Next的兼容性
- 确认你使用的
sqlite3-ohos仓库的ref指向的版本(sqlite3-2.4.7-ohos和sqlite3_flutter_libs-0.5.25-ohos)是明确支持HarmonyOS Next(API 12+)的。查看该Git仓库的README或Issues,确认是否有针对Next的已知问题或特定配置。 - 尝试在
pubspec.yaml中暂时注释掉drift和sqlite3相关依赖,构建一个极简的Release包,看是否仍崩溃。如果不再崩溃,则问题可基本定位到SQLite插件链。此时,需要等待插件作者更新或寻找替代的、已适配Next的SQLite插件。
步骤4:分析完整的崩溃堆栈 你提供的日志主要是系统库和Flutter引擎的堆栈。要精确定位到Dart代码层,需要获取更详细的Dart层崩溃信息。
- 在应用入口处使用
FlutterError.onError全局捕获并打印错误。 - 如果条件允许,尝试在真机上通过
hdc(HarmonyOS调试工具)连接设备,使用hilog命令抓取更详细的应用日志,过滤关键字Dart、flutter或你的应用包名。
总结:
优先执行步骤1,通过构建参数强制使用AOT模式,这是解决此类mprotect错误的最常见方法。同时,结合步骤3进行依赖验证。由于HarmonyOS Next是一个较新的系统,Flutter生态的插件适配可能存在滞后,需要密切关注插件仓库的更新。

