请先阅读前置条件:.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和OpenSSLNativeAot编译后的二进制不是完全不依赖第三方库,可能出于开源协议的原因,这两个库默认是静态链接的,在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