<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NET適配HarmonyOS進展

      1. 前言

      目前國產化系統浪潮下,適配鴻蒙是中國軟件大勢所趨,.NET作為最適合開發客戶端語言之一,適配鴻蒙系統(HarmonyOS Next)是目前.NET開發者最關心的事情。我目前業余時間正在移植Avalonia到HarmonyOS,去年在.NET Conf 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/OpenHarmony-NET/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/OpenHarmony-NET/PublishAotCross

      5.6 無法調用Marshal.GetDelegateForFunctionPointer相關函數

      Marshal.GetDelegateForFunctionPointer的實現依賴動態生成匯編,而HarmonyOS不支持動態生成匯編代碼執行(Jit),使用該函數會導致崩潰。

      解決方案: 使用函數指針直接調用。

      6. 如何修改NativeAOT代碼

      前文中提到部分問題的解決方案是修改源碼,具體操作步驟如下:
      修改完代碼,執行以下命令進行編譯(linux平臺下,需要有編譯環境):

      ./build.sh --subset clr.aot --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

      posted @ 2025-02-09 22:15  布布(CeSun)  閱讀(8738)  評論(27)    收藏  舉報
      主站蜘蛛池模板: 欧美熟妇乱子伦XX视频| 天天澡日日澡狠狠欧美老妇| 国产地址二永久伊甸园| 亚洲精品欧美综合二区| 亚洲码和欧洲码一二三四| 国产高颜值极品嫩模视频| 东方四虎在线观看av| 日本视频一两二两三区| 国产精品美女久久久久久麻豆| 国产中年熟女高潮大集合| 亚洲精品亚洲人成人网| 网友自拍视频一区二区三区 | 中文字幕日韩视频欧美一区| 国内不卡不区二区三区| 国产在线啪| 手机看片AV永久免费| 育儿| 网友自拍视频一区二区三区| 亚洲av成人一区在线| 国产毛a片啊久久久久久保和丸| 国产内射xxxxx在线| 国产免费一区二区不卡| 狠狠躁夜夜躁人人爽天天5| 欧美乱大交aaaa片if| 高潮精品熟妇一区二区三区| 国产精品一区二区三区黄| 日本一区二区三区专线| 国产亚洲精品久久77777| 亚洲免费成人av一区| 四虎成人在线观看免费| 黑人巨大亚洲一区二区久| 中文字幕精品久久久久人妻红杏1 人妻少妇精品中文字幕 | 精品人妻系列无码人妻漫画| 亚洲人成电影网站色mp4| 国产成人无码区免费内射一片色欲 | 日韩精品一区二区三区激情视频| 午夜免费国产体验区免费的| 亚洲精品一区二区美女| 久久精品一偷一偷国产| 欧美颜射内射中出口爆在线| 国产一区在线播放av|