Net在华为鸿蒙系统上的支持情况续

程序员有二十年 2024-10-30 11:01:20

请先阅读前置条件:.NET既然是开源的那么可不可以把它移植到鸿蒙操作系统上?

第一篇文章主要想给.Net正名,因为太多人一直在问.Net什么时候适配鸿蒙,在.net的开源仓库都看到好几个问题了,所以先写一篇文章告诉大家鸿蒙现在的技术栈.Net是完全支持的。

这篇文章主要想写一些在鸿蒙上使用.Net的一些坑,顺便寻求一些帮助。

问题1:跨平台编译

目前我主要尝试使用NativeAot开发鸿蒙应用,众.Net开发者周知.Net的NativeAot不支持跨平台编译,所以在windows上无法将.Net编译成arm64架构的so,这对开发者是一个极大的阻碍。

尽管社区有“PublishAotCross”这样的项目,但是这个项目不支持-ld,即压缩相关的api都会有问题。

PublishAotCross项目地址:

MichalStrehovsky/PublishAotCross: NuGet package to help you cross-compile Native AOT to different OSes/architecturesgithub.com/MichalStrehovsky/PublishAotCross

他改过的原版链接不了lz的问题,借助zig的工具链,还是可以在win下aot到linux下的https://github.com/xljiulang/PublishAotCross。

另外一种思路是使用WSL2配置交叉编译环境,但是交叉环境配置较麻烦,需要给系统配置arm64架构的包源,安装arm64平台的开发环境,如果遇到问题,跨平台编译的资料也不是很好查,微软官方的跨平台文档:

Cross-compilation - .NETlearn.microsoft.com/en-us/dotnet/core/deploying/native-aot/cross-compile#linux

所以,目前缺少一个上手简单的编译环境。

问题2:ICU和OpenSSL

NativeAot编译后的二进制不是完全不依赖第三方库,可能出于开源协议的原因,这两个库默认是静态链接的,在linux桌面系统上很容易就可以安装这两个库,但是在鸿蒙系统上,貌似需要自己编译,然后会遇到交叉编译等问题,ICU可以开启<InvariantGlobalization>true</InvariantGlobalization>选项避开,但是OpenSSL没有办法。

不过微软提供了静态链接选项,文档如下,经过我的测试OpenSSL可以静态链接,ICU会链接失败:

runtime/src/coreclr/nativeaot/docs/compiling.md at main · dotnet/runtimegithub.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/docs/compiling.md

最佳方案是自己附带这两个动态库,但是从哪里下载这两个库呢?看起来还是得配置交叉编译环境,自行编译。

问题3:第三方依赖

在尝试移植Avalonia时(大概率会弃坑),发现SkiaSharp依赖libfontconfig.so.1,网上查了一下,解决方案又是用包管理工具下载依赖,在鸿蒙上使用,还是需要自行编译,有没有大佬知道在哪里能指定libc和指令集下载依赖的地方。

总结

其实说来说去,只是一个问题交叉编译环境比较麻烦,特别是是鸿蒙使用musl,在arm64和musl双重debuff下,如果遇到问题,在网上很难搜到有效的资料参考。

另外分享一下关于鸿蒙的两个仓库,希望得到有能力的朋友的帮助:

鸿蒙Native SDK,这个基本是把NDK的头文件抄成P/Invoke,目前计划不对api做包装,只提供unsafe接口,另外更新了一个opengl的例子。https://github.com/CeSun/OpenHarmony.Net

Avalonia移植仓库,我的打算是写一个引子,给有兴趣的朋友提供一点参考

https://github.com/CeSun/OpenHarmony.Avalonia

0 阅读:0
程序员有二十年

程序员有二十年

感谢大家的关注