.NET 在鴻蒙系統(HarmonyOS Next)上的適配探索與實踐

目錄

1. 前言

2. 項目狀態

3. 運行時環境選擇

4. NativeAOT 適配原理

4.1 底層兼容性

4.2 技術實現方案

5. 已知問題及解決方案

5.1 syscall 限制(已解決)

5.2 mmap 申請虛擬內存過大(已解決)

5.3 第三方庫缺失問題(已解決)

5.4 ICU 初始化失敗(已解決)

5.5 NativeAOT 跨平臺編譯(Windows平臺已解決)

5.6 Marshal.GetDelegateForFunctionPointer 限制(已解決)

6. NativeAOT 源碼修改指南

7. 相關資源


1. 前言

在當前國產化操作系統發展浪潮下,適配鴻蒙系統已成為中國軟件開發的重要趨勢。作為微軟推出的跨平臺開發框架,.NET 憑借其卓越的性能和豐富的功能庫,一直被視為最優秀的客戶端開發語言之一。特別是對于 Avalonia 這樣的跨平臺 UI 框架,能夠幫助開發者快速構建高質量的桌面應用程序。在去年的 .NET Conf China 大會上,我分享了關于將 Avalonia 移植到鴻蒙系統的初步探索。經過近一年的持續努力,項目又取得了一些突破性進展。本文將系統性地整理當前遇到的所有技術問題及解決方案,希望能為正在關注 .NET 鴻蒙適配的開發者提供有價值的參考。

2. 項目狀態

目前,我們已經成功實現了 .NET 在 HarmonyOS Next 系統上的基礎運行能力。具體而言:

  • 基礎運行時環境:已完成 .NET NativeAOT 運行時的適配工作
  • 框架適配:Avalonia UI 框架可以在 HarmonyOS Next 真機上流暢運行
  • 性能表現:經過優化后,應用程序啟動速度和運行效率已達到可用水平

本文將重點探討 .NET 運行時適配鴻蒙系統的關鍵技術細節,包括架構設計、問題定位和解決方案等。

3. 運行時環境選擇

鴻蒙系統從 5.0.0(12) 版本開始引入了嚴格的安全限制:

  1. 內存執行限制:禁止匿名內存申請可執行權限
  2. JIT 限制:除系統內置的 JavaScript 引擎外,其他虛擬機均不能使用 JIT 編譯功能

這些限制給 .NET 運行時的適配帶來了巨大挑戰:

  • CoreCLR 不可用:由于依賴 JIT 編譯,無法接入鴻蒙系統
  • Mono 方案被棄用:雖然最新版 Mono 支持解釋執行,但性能問題使其不適合生產環境
  • 最終選擇:NativeAOT 運行時成為唯一可行的方案,通過提前編譯(AOT)生成原生代碼

4. NativeAOT 適配原理

NativeAOT 能夠在鴻蒙系統上運行的關鍵在于鴻蒙的底層兼容性設計:

4.1 底層兼容性

  • libc 兼容:鴻蒙系統兼容 musl libc 的 Linux 動態庫(.so)
  • RID 支持:.NET 原生支持 linux-musl-arm64/linux-musl-x64 運行時標識符(RID)

4.2 技術實現方案

  1. .NET 程序編譯

    • 將 .NET 代碼編譯為原生 Linux 動態庫(.so)
    • 導出必要的入口函數供鴻蒙調用
  2. 鴻蒙原生集成

    // 加載 .NET 生成的動態庫
    void* handle = dlopen("libdotnetapp.so", RTLD_LAZY);// 獲取入口函數
    typedef int (*EntryPoint)(int argc, char** argv);
    EntryPoint entry = (EntryPoint)dlsym(handle, "DotNetMain");// 調用 .NET 入口函數
    entry(argc, argv);
    

  3. 雙向交互機制

    • .NET 調用鴻蒙 API
      • 通過 P/Invoke 調用鴻蒙 NDK 提供的原生接口
      • 對于 ArkUI 的 TypeScript API,通過 NDK 中的 napi 機制進行橋接
  4. 實際項目參考

    • Avalonia 移植項目:OpenHarmony.Avalonia
    • 該項目完整展示了如何將復雜的 UI 框架適配到鴻蒙系統

5. 已知問題及解決方案

5.1 syscall 限制(已解決)

問題描述

  • 鴻蒙使用 seccomp 嚴格限制系統調用
  • .NET 運行時初始化時會檢查 NUMA 支持,調用 __NR_get_mempolicy 系統調用
  • 該調用不在鴻蒙的 seccomp 白名單中,導致進程直接被終止

技術細節

  • 鴻蒙 seccomp 白名單:app.seccomp.policy
  • 類似限制在 Android 也存在,但 .NET 對 Android 有特殊處理

解決方案: 修改 NativeAOT 源代碼,將 NUMA 相關函數替換為空實現:

// 修改 numa.c
void numa_init() { /* 空實現 */ }
int numa_available() { return -1; } // 表示不支持

5.2 mmap 申請虛擬內存過大(已解決)

問題現象

  • GC 初始化時嘗試申請 256GB 虛擬內存
  • 超出鴻蒙系統限制,導致 mmap 返回 Out Of Memory 錯誤

解決方案

方案1:環境變量控制

export DOTNET_GCHeapHardLimit=180000000000 # 限制堆大小為約180GB

方案2:源碼級修改

  • 在構建配置中禁用 USE_REGIONS
  • 修改 gcenv.h 文件:
#define USE_REGIONS 0

5.3 第三方庫缺失問題(已解決)

問題范圍

  • ICU(國際化組件)
  • OpenSSL(加密庫)
  • 其他基礎依賴庫

解決方案

方案1:從 Alpine Linux 移植

  • Alpine 使用 musl libc,與鴻蒙兼容
  • 阿里云鏡像地址:
    • ARM64: https://mirrors.aliyun.com/alpine/edge/main/aarch64/
    • x86_64: https://mirrors.aliyun.com/alpine/edge/main/x86_64/

方案2:源碼編譯 對于有 CMake 支持的項目,使用鴻蒙工具鏈交叉編譯:

cmake -DCMAKE_TOOLCHAIN_FILE=OHOS_TOOLCHAIN.cmake ..
make

5.4 ICU 初始化失敗(已解決)

問題原因

  • 鴻蒙系統的 ICU 數據文件路徑特殊
  • 庫版本不匹配

解決方案

? ? 1.設置環境變量:

setenv("ICU_DATA", "/system/usr/ohos_icu", 1);

? ? 2.確保使用 libICU 72 版本:

ldd libicuuc.so.72

如果該庫有cmake項目,則可以通過鴻蒙的CMake工具鏈編譯。
?

5.5 NativeAOT 跨平臺編譯(Windows平臺已解決)

問題描述

  • NativeAOT 默認不支持跨平臺編譯
  • 開發效率受限于必須在 Linux 環境下構建

解決方案: 集成 PublishAotCross 項目:

  1. 在 Windows 上編寫代碼
  2. 通過自動化工具鏈完成 Linux 環境下的交叉編譯
  3. 獲取最終的可執行文件

5.6 Marshal.GetDelegateForFunctionPointer 限制(已解決)

問題本質

  • 該函數依賴動態生成匯編代碼
  • 違反鴻蒙的 JIT 限制

替代方案: 使用 C# 9.0 引入的函數指針特性:

delegate* unmanaged<int, void> funcPtr = ...;
funcPtr(123);

6. NativeAOT 源碼修改指南

若要修改 NativeAOT 源代碼并重新構建,請按以下步驟操作:

  1. 獲取源碼

    git clone https://github.com/dotnet/runtime.git
    

  2. 應用補丁

    • 修改 numa.cgcenv.h 等相關文件
  3. 構建命令

    ./build.sh --subset clr.aot --configuration Release -arch arm64 --cross
    

  4. 替換 NuGet 包

    • 構建產物位于 runtime/artifacts/bin/coreclr/linux.arm64.Release/aotsdk
    • 復制到 NuGet 緩存目錄,如:
      C:\Users\<用戶名>\.nuget\packages\runtime.linux-musl-arm64.microsoft.dotnet.ilcompiler\<版本>\sdk
      

7. 相關資源

  1. GitHub Issues 跟蹤:

    • Runtime #110074
    • Runtime #111649
  2. 項目倉庫:

    • OpenHarmony-NET 組織
    • Avalonia 適配項目

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93350.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖像處理--圖像模板匹配NCC算法-->Fast NCC算法的解讀

目錄 前言 一、基礎知識 二、NCC基本公式以及解決問題 1. NCC基本公式 2. 基本公式解讀 三、簡化分母 fuv 1. 要簡化的分母 2. 積分圖 3. 分母拆開化簡 四、簡化分子 1. 要簡化的分子 2. 模板函數的近似 3. 基函數簡單解釋 五、Fast NCC歸一化互相關值 1. 最終公…

短劇小程序系統開發:賦能創作者,推動短劇藝術創新發展

短劇作為一種新興的藝術形式&#xff0c;具有獨特的魅力和發展潛力。然而&#xff0c;在傳統的發展模式下&#xff0c;短劇創作者面臨著諸多限制和挑戰。短劇小程序系統的開發&#xff0c;為創作者提供了強大的賦能&#xff0c;推動了短劇藝術的創新發展。創作工具豐富&#xf…

Redis知識點+項目+面試八股

基礎篇&#xff1a;講解Redis常用數據結構實戰篇&#xff1a;黑馬點評實戰高級篇&#xff1a;Redis高級知識點原理篇&#xff1a;Redis原理面試篇&#xff1a;Redis八股??第一章&#xff1a;基礎篇??1. Redis介紹Redis是一個key-value的數據庫&#xff0c;key一般是String類…

WPS文字和Word文檔如何選擇多個不連續的行、段

要選擇Word或WPS文字中不連續的多行、多段&#xff0c;使用鼠標加鍵盤即可快速搞定。Word和WPS文字中選擇多行的操作一樣&#xff0c;選擇多段的方法略有不同。選中以后&#xff0c;可以對這些內容進行刪除、復制、剪切、查找、替換、設置格式等操作。一、在Word和WPS文字中選擇…

嵌入式C/C++面試大全

基礎語法 1.在main執?之前和之后執?的代碼可能是什么&#xff1f; main函數執?之前&#xff0c;主要就是初始化系統相關資源&#xff1a; 設置棧指針&#xff0c;其中棧存放的局部變量、函數參數、函數調用的返回地址初始化靜態 static 變量和 global 全局變量&#xff0c;即…

Java應用架構實戰指南:主流模式解析與Spring落地實踐

在Java開發的世界里,選對應用架構不是紙上談兵,而是項目成敗的關鍵。 今天,我想和大家聊聊四種主流架構模式——分層、微服務、事件驅動和六邊形架構。這些模式在實戰中各有千秋,我會結合代碼示例和架構圖,帶大家看清它們的內核。無論你是新手還是老手,這篇文章都能幫你…

重學JS-002 --- JavaScript算法與數據結構(二)JavaScript 基礎知識

文章目錄加入jsjs 的位置控制臺變量關鍵字DOMbutton注釋CSS轉義函數參數對象屬性屬性訪問數組Math加入js 首先創建一個 script 元素。 此元素用于將 JavaScript 加載到 HTML 文件中。 <script src"./script.js"></script>js 的位置 script 標簽位于 HTML…

計算機視覺--opencv(代碼詳細教程)(二)

一、圖片的邊界填充在 OpenCV 中&#xff0c;cv2.copyMakeBorder()是用于給圖像添加邊框&#xff08;邊緣&#xff09;的核心 API&#xff0c;其完整語法和參數說明如下&#xff1a;函數完整定義cv2.copyMakeBorder(src, top, bottom, left, right, borderType, valueNone)參數…

FPGA實現Aurora 64B66B視頻點對點傳輸,基于GTX高速收發器,提供4套工程源碼和技術支持

目錄 1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;為何要用你這個&#xff1f;工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 GT 高速接口解決方案本方案在Aurora 8B10B上的應用 3、工程詳細設…

【軟件安裝|1】CentOS7最新可用國內 yum 鏡像源配置和Linux版MySQL8.0安裝及其相關知識

文章目錄一.更換yum鏡像源二.安裝并配置MySQL8.0安裝配置相關知識什么是yum&#xff1f;什么是鏡像源&#xff1f;相關知識請看最后&#xff0c;首先來更換yum鏡像源 更換前需要準備好VmwareWorkstation和Finalshell&#xff0c;開啟虛擬機&#xff0c;切換到root用戶 Vmware和…

【深度學習】深度學習的四個核心步驟:從房價預測看機器學習本質

文章目錄基礎概念與原理第一步&#xff1a;準備數據 - 構建學習的基礎數據生成與特征工程&#xff08;選擇對預測有用的特征&#xff09;數據集劃分的重要性第二步&#xff1a;設計模型 - 建立數學表達線性回歸模型的數學表達損失函數的設計哲學第三步&#xff1a;訓練優化 - 自…

Java使用Apache POI讀取Excel文件

一、下載jar包 Apache POI有提供下載地址&#xff1a;Apache Archive Distribution Directory&#xff0c;直接打開鏈接并選擇所需的版本下載即可(雙擊last modified可按最新更新時間排序)&#xff0c;本文章以poi-bin-4.1.1-20191023.zip為例&#xff0c;進入官網下載鏈接后&…

VLMs開發——基于Qwen2.5-VL 實現視覺語言模型在目標檢測中的層級結構與實現方法

概述 目標檢測作為計算機視覺領域的核心任務&#xff0c;傳統方法依賴于 YOLO 等視覺模型對預定義類別進行位置預測。然而&#xff0c;此類方法受限于預訓練類別體系&#xff0c;難以實現靈活的視覺交互。視覺語言模型&#xff08;Vision-Language Models, VLMs&#xff09;的…

Spring Boot + Redis + 布隆過濾器防止緩存穿透

? 項目概述 在高并發系統中&#xff0c;緩存穿透 是一個經典問題&#xff1a;當惡意請求或業務邏輯查詢一個數據庫中不存在的 Key&#xff0c;由于緩存中也沒有&#xff0c;請求會直接打到數據庫&#xff0c;導致數據庫壓力激增&#xff0c;甚至宕機。 本項目使用 Spring Bo…

電子電路學習日記

這里的 K 表示 千歐&#xff08;kilo-ohm&#xff09;&#xff0c;而 F 在很多國產 EDA 軟件&#xff08;比如立創EDA、Altium 的一些中文封裝庫&#xff09;里用來標注精度&#xff08;公差&#xff09;&#xff0c; F 代表 1% 精度&#xff08;英文 Fine tolerance&#xff0…

oracle 怎么實現讀一致性

? Oracle 數據塊讀一致性判斷流程&#xff08;正確版&#xff09; 假設&#xff1a;Query SCN 查詢開始的 SCN&#xff08;Query SCN&#xff09; lastSubbmit SCN 行中最新的提交scn Row SCN 行最后修改的 SCN&#xff08;存儲在行頭&#xff0c;通過 ITL 推導&#xff09…

ISTA為什么要加上軟閾值激活函數?r若沒有L1 正則化也要加其他激活函數嗎?

一、加上軟閾值函數&#xff08;Soft-thresholding&#xff09;是因為 LISTA&#xff08;以及它的前身 ISTA&#xff09;本質上是在求解一個 帶 L1 正則化的稀疏優化問題&#xff1a; min?x12∥y?Ax∥22λ∥x∥1 \min_x \frac{1}{2} \|y - Ax\|_2^2 \lambda \|x\|_1 xmin?2…

線程P4 | 線程安全問題及解決方法

何為線程安全&#xff1f;要談及何為線程安全&#xff0c;總得說來&#xff0c;我們可以用一句話來概況&#xff1a;如果在多線程環境下代碼運行結果和我們預期是相符的&#xff0c;即和單線程環境下的運行結果相同&#xff0c;那么我們就稱這個程序是線程安全的&#xff0c;反…

水印消失術!JavaAI深度學習去水印技術深度剖析

一、飛算JavaAI平臺概述1.1 飛算JavaAI定位與技術特色 飛算JavaAI是國內領先的智能化Java開發平臺&#xff0c;通過AI技術賦能軟件開發全流程&#xff0c;特別針對小程序、Web應用等輕量級開發場景提供*零基礎編程→高質量交**的一站式解決方案。其核心優勢體現在&#xff1a; …

醋酸釓:醫學影像與科技創新中的重要角色

醋酸釓是一種由釓元素和醋酸根離子組成的化合物。釓是稀土金屬之一&#xff0c;常常用于醫學影像、核磁共振成像&#xff08;MRI&#xff09;以及某些工業應用。醋酸釓作為釓的鹽之一&#xff0c;具有許多獨特的性質&#xff0c;尤其在醫學和科學研究領域表現突出。一、醋酸釓的…