.NET适配HarmonyOS进展

news/2025/2/11 21:23:12/文章来源:https://www.cnblogs.com/CeSun/p/18706813

1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Config CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2. 项目状态

目前.NET可以成功在HarmonyOS Next上运行

Avalonia移植项目在部分大内存真机上初步可以运行,本文主要探讨.NET适配相关工作。

3. 运行时

自HarmonyOS 5.0.0(12)起,禁止匿名内存申请可执行权限,除系统内置的JavaScript引擎外,其他虚拟机不能使用Jit功能,所以无法将CoreCLR接入到鸿蒙系统中,而最新版的Mono虽然支持解释执行,但是由于性能问题也不会接入Mono到鸿蒙系统,最终只能选择接入NativeAOT运行时

4. NativeAOT

支撑鸿蒙可以接入NativeAOT的原理是鸿蒙系统兼容libc是musl的Linux系统的动态库(.so)。而.NET的RID支持linux-musl-arm64/linux-musl-x64,所以理论上可以将.NET程序编译为原生的Linux动态库(.so),然后在鸿蒙的原生项目中,通过dlopen以及dlsym等函数调用C#中的入口函数。

而C#调用鸿蒙api则通过P/Invoke调用鸿蒙的NDK,而ArkUI的TypeScript api则通过NDK中的napi调用。

具体做法可以参考我正在做的Avalonia移植项目: https://github.com/CeSun/OpenHarmony.Avalonia

5. 已知问题

5.1 syscall限制 (已解决)

鸿蒙系统使用了seccomp限制危险的syscall调用。标准posix下,如果系统不支持某个syscall则返回错误码,而seccomp非常激进,如果调用了非法的sycall则直接杀掉进程。.NET的运行时初始化时,会调用__NR_get_mempolicy系统调用对numa支持进行检查,而这个系统调用不在鸿蒙的seccomp白名单中,所以导致直接宕机。

鸿蒙系统中seccomp的系统调用白名单如下:https://gitee.com/openharmony/startup_init/blob/master/services/modules/seccomp/seccomp_policy/app.seccomp.policy

其实安卓中也有类似的限制,.NET的NativeAOT之所以能在安卓平台下运行是因为.NET中对安卓进行了特殊处理,而在鸿蒙平台我们使用的是Linux平台的代码,所以没有对这些系统调用进行处理。

解决办法则是自行修改代码,将numa的函数全部修改为空函数

5.2 mmap申请虚拟内存过大(已解决)

解决上个问题后,.NET运行时初始化依然不能成功,导致程序崩溃,经过排查发现是GC初始化时会申请256G左右的虚拟内存,导致mmap返回Out Of Memory错误。

解决办法1:设置环境变量“DOTNET_GCHeapHardLimit”,将虚拟内存申请控制在约180G以下即可。

解决办法2:修改源代码,将USE_REGIONS宏关掉。

5.3 ICU,OpenSSL等第三方库缺失(已解决)

解决方案1:从Alpine上偷包 ,因为Alpine的libc是musl,所以理论上Alpine的库在鸿蒙上大部分都能使用。

阿里云Alpine软件包镜像地址:
arm64架构:https://mirrors.aliyun.com/alpine/edge/main/aarch64/
amd64架构:https://mirrors.aliyun.com/alpine/edge/main/x86_64/

解决方案2:如果该库有cmake项目,则可以通过鸿蒙的CMake工具链编译。

5.4 ICU初始化失败(已解决)

鸿蒙的ICU配置文件路径与默认路径不同,需要调用修改环境变量API,将ICU_DATA修改为/system/usr/ohos_icu
且鸿蒙平台上libICU的大版本是72,要使用这个版本的库。

5.5 NativeAOT如何跨平台编译 (Windows平台已解决)

NativeAOT众所周知不支持跨平台编译,而我的方案需要发布到linux-musl平台,所以无法在Windows上发布,影响开发效率。

解决方案:在项目中引入项目https://github.com/CeSun/PublishAotCross

6. 如何修改NativeAOT代码

前文中提到部分问题的解决方案是修改源码,具体操作步骤如下:
修改完代码,执行以下命令进行编译(linux平台下,需要有编译环境):

./build.sh --subset mono+libs --configuration Release -arch arm64 --cross

编译成功后,打开目录 运行时/artifacts/bin/coreclr/linux.arm64.Release/aotsdk,将这里所有的替换到自己电脑nuget的缓存目录, 例如C:\Users\用户名\.nuget\packages\runtime.linux-musl-arm64.microsoft.dotnet.ilcompiler\dotnet版本\sdk

7.相关链接

https://github.com/dotnet/runtime/issues/110074
https://github.com/dotnet/runtime/issues/111649

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881428.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云大数据在低空经济中的应用:三维激光雷达技术探索

随着科技的飞速发展,低空经济正逐渐成为推动社会经济发展的新引擎。其中,三维激光雷达技术以其高精度、高效率的特点,在低空经济中扮演着越来越重要的角色。本文将深入探讨三维激光雷达在点云大数据领域的核心技术,以及其在多元应用中的探索与实践。一、三维激光雷达技术概…

deepseek本地部署

deepseek本地部署 下载并部署大模型(这里使用Ollama)下载并安装Ollama打开浏览器搜索ollama,访问官网。 点击右上角Download按钮,选择对应系统版本的安装包下载。 双击安装包,按提示完成安装。 验证安装:在终端输入ollama -v,出现版本号即表示安装成功。指定模型下载位置…

部署离线版DeepSeek

2025年春节前DeepSeek着实火了一把,记得刚看完美国总统特朗普召集孙正义,让他投资5000亿美金资助美国的“星际之门”计划。两天后DeepSeek出圈,轰动全球AI界。它只花费了500万美金就训练出了媲美OpenAI大模型的推理模型,关键还是开源免费的,太强了。过年前的几天瞬间在网络…

App Uploader 提交苹果应用商店 Bundle ID 故障解除

通过App Uploader提交ipa文件的时候反复提示Bundle ID错误,有点蒙。反复检查发现是uniapp里面编译ipa文件的时候写的Bundle ID和appstoreconnect里的没有对应上。以下3个位置的Bundle ID 要保持统一,不然就反复提交无法通过。保持统一后,问题解除。顺利提交ipa到苹果商店。查…

集训5 20240209

集训5 20240209 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A: 题目大意:给出一个整数和一个操作符,生成两个能组成这个数的因子 #include<bits/stdc++.h> #define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace…

2024.2.9 鲜花

超级入门的单位根反演?推歌 《壹雫空》 もしこの雨が上がっても 就算这场大雨就此停止 忘れずに歩いてくよ 我也将永不忘怀向前行 最初のひとしずくに 顔上げた今日の僕を 那抬头仰望最初一滴雨滴的今天的我 透明な傘で作る ひとり分だけの世界 透明的伞创造出的一人份…

2.9 实现安卓界面跳转

通过今天的学习实现了安卓程序界面的跳转web端出现的问题已经基本解决 今天学习了button的使用和@string字符串文本的使用

The Journey of Hailiang Winter Camp 2025

【洛谷专栏】。 前言 THUWC 2025 游记。 胸牌也是牌,倒一也是一,能去就是赢。 正文 2025.1 1.15 大晚上被叫到教练房间去训话,得知了一些非常重要的信息。 这次我们学校五个人仅有两个银,理论上勉强还看的过去,但是我们成了打的最差的一届。 @Cczzyy20150005 的分数差已知…

并发编程 - 线程同步(六)之锁lock

lock是C#中的线程同步互斥锁,使用时需避免锁定this、公共对象、字符串和非readonly对象,小心锁定静态对象。锁定不当易导致同步问题,示例代码和源码在代码库。通过前面对Interlocked类的学习,相信大家对线程同步机制有了更深的理解,今天我们将继续需要另一种同步机制——锁…

解读 DeepSeek-R1 论文 - 通俗易懂版

引言:让 AI 学会"思考"的新突破 在近年来的人工智能浪潮中,大型语言模型(LLM)如 ChatGPT 已经能回答各种问题,但它们在复杂推理方面仍有不足。所谓复杂推理,比如解决奥数难题、编写复杂代码或进行多步逻辑推导,这些都相当于让 AI "动脑筋"思考多步。…

2025多校冲刺省选模拟赛10

过于困难,直接放弃2025多校冲刺省选模拟赛10\(T1\) A. 电车 \(5pts\)直接化简成质因数分解的形式,因质因数分解是唯一的,故可以只考虑下标为质数处的值交换。容易发现 \(2p_{1},2p_{2}>n\) 的质数 \(p_{1},p_{2}\) 交换后不会影响合法性,考虑进一步扩展。对着指数确定范…

DESTRUCTION OI(退役前要做的 100 件事)

【洛谷专栏】。 这几天会慢慢更新的,致我即将结束的 OI 旅程。 每一个事应该都会图文并茂展开写,也算是作为我回忆录的一部分(?这也给了我另外一个思路。 更新进度 -> 100。给自己起个 ID ✓cjh20090318/Chen_Jinhui,这两个应该是我最常用的 ID。微信:cjh20090318 QQ:…