在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙跨端實踐-JS虛擬機架構實現

京東云 ? 來源:京東科技 杜強強 ? 作者:京東科技 杜強強 ? 2024-09-30 14:42 ? 次閱讀

作者:京東科技 杜強強

前言

Roma跨端方案中,JS虛擬機是框架的核心,負責執行動態化的JS代碼。在Android平臺采用了基于V8的J2V8,iOS平臺則使用了系統自帶的JSCore,而在HarmonyOS中,由于業界無類似的框架,我們需要自行實現以確保核心基礎能力的完整。 鴻蒙虛擬機的開發經歷了從最初 ArkTs2V8JSVM + Roma新架構方案。在此過程中,我們實現了完整的鴻蒙版的“J2V8”和 基于系統JSVM的JS虛擬機框架,解決了JS引擎庫移植、多語言通信能力、多類型數據結構轉換等眾多挑戰。本文將從實現的各個階段過程出發,探討在實踐中遇到的問題及解決方案。

一、鴻蒙版 “J2V8”虛擬機實現 - ArkTs2V8

ArkTs2V8框架依賴V8引擎, 鴻蒙前期交叉編譯資料少,V8官方也未有HarmonyOS端編譯方式。因此在這過程中, 我們采取初期使用QuickJS引擎(C語言開發,代碼少,移植方便), 后期自編譯V8完成后替換QuickJS, 保證快速驗證跨端前期技術調研方案以及其他依賴項基礎能力的開展。 自編譯V8 通過學習交叉編譯相關技術,摸索式逐步解決編譯期間這種報錯,完成V8虛擬機移植。

ArkTs2V8 架構借鑒了Android J2V8(動態化-J2V8文章中講述了具體原理及實踐)的實現原理。 J2V8為針對V8的 Java實現,采用最直接的方式在Java中訪問V8原始值,因此具備較高的性能。 在HarmonyOS中,采用V8作為JS引擎, JSI作為通信層完成設計。

wKgZomb6SCqAaKbAAACBgMlQU1Y485.png

1、引入JSI

考慮到跨端框架的未來發展,雖然通過C++ 能夠直接與V8交互,但這種方式不利于虛擬機代碼的共享和擴展。因此Roma框架引入JSI,以增強代碼的可擴展性,促進更有效的代碼共享,并實現更靈活的虛擬機集成。

JSI(JavaScript Interface),輕量級,通用且同步的JavaScript接口, 通過JSI,JS代碼可以直接與C++原生代碼通信。

有了JSI層對虛擬機的封裝,Roma框架開發者無需在關心虛擬機底層能力, 同時也可以自由切換引擎,比如使用V8,QuickJS、JSVM等, 規范了數據格式,統一為JSIValue。

2、API與框架設計原理

接口設計采用和J2V8 類似的設計,支持多虛擬機實例方式。

wKgaomb6SCuAD_36AAKvXfDR4Es416.png

實現原理:

1、本地接口: 使用 napi 使用創建橋梁, 完成本地代碼調用Quick引擎函數。

2、C++數據綁定:在C++層面 ,定義虛擬機交互操作的相關函數,完成V8引擎相關API 來執行JS代碼、 處理JS對象和執行虛擬機相關的操作。

3、JSIRuntime: 在C++層面引入JSI概念,通過完成JSIRuntime - QuickJSRuntime & V8Runtime, 完成虛擬機層通信能力。

4、虛擬機對象的定義及封裝:根據JS數據類型,定義ArkTS數據結構,包括基本數據類型、JSObject、JSArray、JSFunction。ArkTS側 類型對象持有C++ JSIValue 對象指針,當執行具體能力時,通過napi 傳遞指針,完成具體功能的調用。 簡單來說,相當于ArkTS JS對象代理C++ 虛擬機數據對象。

5、內存管理: ArkTs2V8負責管理ArkTS與JSValue 之間的內存交互。其中C++側完成JSValue對象的創建、引用持有與銷毀。 ArkTS數據對象中定義對象釋放函數, 數據使用完后,由ArkTS調用釋放內存。

ArkTs2V8架構設計支持虛擬機多實例, 單個虛擬機的創建過程時由 ArkTs通過JSEngine發起創建JSRuntime虛擬機實例創建,經過napi,在C++環境創建JSRuntime引擎實例及引用, 并完成環境Context及global的初始化, 同時創建ArkTs JSRuntime對象,代理C++虛擬機對象JSRuntime(QuickJSRuntime or V8Runtime) 并綁定指針引用。

初始化過程:

wKgZomb6SC-AFyHvAASL8DdSAm0656.png

V8Runtime實現

wKgaomb6SDCAc3qVAAXsK5AwqNQ365.png

3、JS、JSI、JSRuntime 關系

wKgZomb6SDGAKce9AAAx9EXVuNo989.png

JSRuntime (QuickJSRuntime or V8Runtime) 是 JS運行時環境。一個 JSRuntime 通常包括一個或多個引擎,JSI 可以看作是連接 JS 代碼和 JSRuntime 的橋梁。通過 JSI,開發者可以更直接地與 JSRuntime 交互,實現原生功能的調用和管理。

4、部分過程剖析

ArkTs2V8實現的過程中,最基礎的兩個功能原理:JSObject對象的創建與獲取、原生方法的注入, 這兩個能力的實現可以擴展到其他大多數API功能實現上。

1、JSObject對象及獲取對象數據過程。

通過JSRuntime 發起接口的調用,通過napi,根據對象類型在C++側創建對象的JSValue對象及象指針引用, 并將引用指針綁定至ArkTS對象,完成對象的創建。

wKgaomb6SDKAAnj7AASzY6VbRIA936.png

2、 JS虛擬機注入原生方法

ArkTS方法到JS虛擬機中,主要實現原理:

將ArkTs的方法 和 目標注冊對象指針 生成MethodDescriptor方法描述對象, 通過functionID將對象存儲在當前JSContext環境中。 通過napi 發起在C++側代理函數HostFunction的創建,并綁定ArkTs的方法的引用。 進入到JSI內部,創建方法代理HostFunctionProxy 對象,綁定代理方法HostFunction及守護函數Finalizer, v8::External 將HostFunctionProxy與 JS環境對象(V8對象) 關聯起來,生成V8 Function , 此時V8函數會與HostFunctionProxy生命周期綁定。 簡單來說相當于ArkTS callback,傳遞至C++,C++創建JSI Callback并綁定ArkTS callback, JSI Callback 設置到HostFunctionProxy中,HostFunctionProxy 通過 v8::External與 JS環境綁定。

當JS觸發該該函數時,通過v8::External綁定HostFunctionProxy這層關系,HostFunctionProxy中JSI Callback會收到JS環境的響應消息,在通過綁定的ArkTs的方法 通過napi接口返回至ArkTS中,最終ArkTS收到方法響應。

這種代理函數的實現, 初次學習可能比較復雜,但整個過程實際是多個對象間引用的持久化和不同數據對象的交換, 大致過程圖如下:

wKgZomb6SDKAPD2bAAJcvMkwtzI011.png

4、問題及挑戰

1、 數據對象的內存管理

手動內存管理。 ArkTs2V8 負責管理ArkTS與V8之間的內存交互中,ArkTs發起對象的創建和銷毀。 整個內存的管理是基于手動管理,需使用方用完后及時關閉,避免內存泄露。 這種設計模式下,使用者操作不當極為容易造成內存泄露,并且使用也較為不便。

針對這問題,在后續的迭代設計中,將內存管理升級為自動內存管理的方式。 JS為單線程執行,單方法片段或一些邏輯中,如果有了調用開始時機結束調用時機, 通過開始時記錄當前時刻后開始創建的對象,在調用結束時刻對記錄的對象進行統一的內存釋放,類似于標記垃圾回收,完成內存的統一管理。借助Roma框架中對虛擬機層的封裝,做到了內存自動管理。

2、 跨語言性能問題

基于ArkTs2V8 的API實現,在原生、JS環境中,無法直接使用對方的數據類型,二者之間數據類型需要轉換。 JS到原生的過程中,ArkTs2V8中目前提供的API僅可以獲取當前層級的JS對象數據,子對象數據需要通過遞歸遍歷從JS環境中一一獲取。因此解析的過程中需要頻繁的通過C++讀取V8,當數據量較大時通常比較耗時。拿常用的網絡模塊來說,接口下發的業務接口數據至少都在幾K甚至幾十K,轉為JS對象在中端性能手機上 會有幾十ms的耗時,這對單線程模式的JS環境來說影響時巨大的。

ArkTS 、C++ 跨語言通信性能我們可以采取類似于Roma Android的通信次數壓縮策略,或者使用JSON序列化來減少跨語言交互的性能損耗, 但無論用哪種都僅是從行為上規避跨語言的性能,而無法徹底解決。

3、 線程管理問題

ArkTS基于TS語言,由于語言特性,ArkTS線程隔離,那么對于ArkTs2V8這種接口設計并不友好。 JS線程需要在ArkTS開啟獨立worker JS線程,收發JS消息,線程間的隔離,涉及再次序列化數據影響性能。

基于問題2、3 以及對框架未來的思考,Roma鴻蒙端決定采用新的方案: 框架C++化,框架邏輯實現全部放在native側, 虛擬機實現全部切C++,C++側完成線程管理,ArkTS不在承擔線程和邏輯任務。 這種既提升了解決了問題,提升框架性能,也為今后框架移植其他平臺打好基礎。

二、基于JSVM虛擬機實現 (Roma新架構)

1、鴻蒙JSVM

在V8移植上,從短期看雖然我們初步掌握了V8交叉編譯移植技術,但從穩定性、兼容性、維護成本、包大小等維度看, 采用系統內置虛擬機有巨大的長期收益。 年初Roma框架與華為專家多次溝通交流,最終HarmonyOS將V8內置到了操作系統, Q2我們實現了第三個JSRuntime - JSMVRuntime, 至此鴻蒙動態化架構修改趨于穩定。

JSVMRuntime:

wKgaomb6SDSARTk1AAcPVuz-Khg178.png

2、新架構思路 - Roma架構C++化

新架構的設計思路SDK核心邏輯整體C++側實現, 這樣在底層引擎與核心流程之間可以直接c++通信,線程間上與其他端保持相同 - 三線程模型JS線程 +UI線程 + 耗時計算線程。通過C++ PThread完成線程管理, 從而避免跨語言、ArkTS線程隔離帶來的多種性能損耗。 在數據結構設計上, JS數據采用JSI::Value, 與其他線程數據相互交互時, 統一使用folly完成。 另外將虛擬機層下沉,對外提供JSExecutor, 功能開發時框架開發者無需關心虛擬機層的實現。

虛擬機方法與對象的注入上, 通過HostObject代理對象能力的雙邊映射,原生模塊直接與JS 同步或異步交互, 從而縮短了流程鏈路。

wKgZomb6SDSAYktAAAEheBiR-PY635.png

框架大致原理:

wKgaomb6SDWActkGAADcb0PRQk0717.png

3、過程遇到的

1、JSVM字符串引用問題

JSVMRuntime實現期間,字符串無法創建對象引用。 JSI的設計中將字符串作為 pointer 自定義指針類,通過指針地址訪問, 與其相同的還有對象,方法。 在許多語言中字符串都作為一種特殊的類型(非基本數據類型), 例如在C++中,字符是一種基本數據類型,但是字符串不是,字符串由字符組成, V8引擎亦如此。 V8中通常使用v8::String來創建JS字符串, 我們可以對齊進行持久化引用。

而JSVM中 OH_JSVM_CreateReference 無法針對字符串類型創建引用, 字符串的持久化需從JSVM_Value從copy出來通過智能指針或者new內存的方式進行存儲,這種copy持久化的方式會造成字符串內存兩份(JSVM一份,自己存一份), 實際開發中大量的字符串類型轉換,這樣會造成內存占比過高。

為此, 經過與華為專家多次交流溝通,最終將字符串歸為引用類型,可通過OH_JSVM_CreateReference持久化引用,修改后的方式如下:

wKgZomb6SDaANUhGAAQOni5iYaI833.png

2、HostObject代理對象實現

HostObject 是JS對象,提供與原生直接通信的方式。 相當于 native 在 JS的代理對象,雙向映射,原生模塊直接與JS 同步或異步交互, 在一些功能實現上可以縮短流程鏈路, 在JS中可直接調用C++的對象。 在動態化中, 模塊的實現采用的就是HostObject能力, 框架層實現模塊代理對象及橋通信層面的雙向通信過程。 比如登錄模塊,在ArkTS側封裝模塊的API,通過C側的HostObject映射,可以在JS中直接調用登錄模塊的登錄,退出登錄等能力。 HostObject的實現,雖然在框架層面相比于喬通道的方式更加復雜,但對于復雜邏輯流程和交互鏈路, 基礎開發可以更注重于功能邏輯。

HostObject 實現過程較為復雜, 但我們可以將過程拆分,通過對象管理 + 代理函數的方式將過程簡化。 首先對象的管理直接JSRuntime中持久化即可,Roma中采用智能指針,那么就剩下代理函數,前面我們講了JS中注入方法里面包括了代理函數的實現原理,采用類似的思路來完成HostObject。

HarmonyOS提供的JSVM API最初僅支持代理函數的創建, 而我們需要是創建代理對象,對象中可以有任意方法,僅通過代理函數方式無法滿足任意方法的需求,為此通過在JS中注入代理對象腳本實現,通過Proxy代理的方式,將get、set等代理對象的方法通過代理函數的方式返回,這種情況下,我們的函數數量就被簡化成了get、set及一些固定的方法。 通過這些方法做代理轉接,調用到C++對象方法,借助JSI::Value的包裝,將具體結果返回。

JS代理腳本部分代碼:

wKgaomb6SDeASOeeAAJGHbpsgbY878.png

大致實現過程:

wKgZomb6SDqAdtrVAAGuilqmJkE164.png

示例 - 基于HostObject Console能力實現

wKgaomb6SDyAIMXpAAX31oJPubg888.png

三、總結

0到1實現鴻蒙版“j2v8”、“JSRuntime” 讓我們更加了解引擎實現中的各種細節和一些難點問題的解決。 一些方案的實現,也可以延展到其他(非虛擬機)場景。 Roma 框架C++, 讓Roma框架走向技術深水區, 為今后capi、未來技術做好了基礎,旨在帶來更優的性能和更好的用戶體驗。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JS
    JS
    +關注

    關注

    0

    文章

    78

    瀏覽量

    18388
  • 架構
    +關注

    關注

    1

    文章

    527

    瀏覽量

    25845
  • 虛擬機
    +關注

    關注

    1

    文章

    962

    瀏覽量

    29006
  • 鴻蒙
    +關注

    關注

    59

    文章

    2503

    瀏覽量

    43750
  • HarmonyOS
    +關注

    關注

    79

    文章

    2052

    瀏覽量

    32091
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    hyper-v共享,hyper-v共享:實現主機與虛擬機之間高效文件共享的最佳實踐

    實現主機與虛擬機之間高效文件共享的最佳實踐。 ? ?在企業級虛擬化環境中,實現主機與虛擬機之間
    的頭像 發表于 01-24 14:23 ?1155次閱讀
    hyper-v共享,hyper-v共享:<b class='flag-5'>實現</b>主機與<b class='flag-5'>虛擬機</b>之間高效文件共享的最佳<b class='flag-5'>實踐</b>

    AIGC入門及鴻蒙入門

    模型,能夠生成與給定文本描述相符的圖像。 鴻蒙系統入門 1. 基礎知識: 鴻蒙系統(HarmonyOS)是華為推出的一款分布式操作系統,旨在實現設備、
    發表于 01-13 10:32

    AKI語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    )開發框架。它極大地簡化了JS與C/C++之間的語言訪問,為開發者提供了一種邊界性編程體驗友好的解決方案。通過AKI,開發者可以使用讓代碼更易讀的語法糖,實現JS與C/C++之間的無
    發表于 01-02 17:08

    虛擬化數據恢復—XenServer虛擬機數據恢復案例

    Server操作系統虛擬機,該虛擬機有2塊虛擬磁盤(系統盤+數據盤),當作網站服務器使用。 服務器虛擬化故障: XenServer虛擬機
    的頭像 發表于 11-08 10:32 ?424次閱讀
    <b class='flag-5'>虛擬</b>化數據恢復—XenServer<b class='flag-5'>虛擬機</b>數據恢復案例

    虛擬機數據恢復—異常斷電導致XenServer虛擬機不可用的數據恢復案例

    虛擬機數據恢復環境: 某品牌服務器通過同品牌某型號的RAID卡,將4塊STAT硬盤為一組RAID10陣列。上層部署XenServer虛擬化平臺,虛擬機安裝Windows Server系統,每臺
    的頭像 發表于 10-21 14:17 ?445次閱讀
    <b class='flag-5'>虛擬機</b>數據恢復—異常斷電導致XenServer<b class='flag-5'>虛擬機</b>不可用的數據恢復案例

    虛擬桌面基礎架構(VDI)遠程連接如何實現

    今天我們來聊聊虛擬桌面基礎架構(VDI)。VDI的工作原理是將桌面虛擬化,使得用戶可以通過網絡連接訪問虛擬機,確保數據和應用保存在服務器上,提高數據的安全性。使用VDI通常涉及以下步驟
    的頭像 發表于 10-18 08:09 ?691次閱讀
    <b class='flag-5'>虛擬</b>桌面基礎<b class='flag-5'>架構</b>(VDI)遠程連接如何<b class='flag-5'>實現</b>

    鴻蒙實踐-長列表解決方案和性能優化

    平臺都非常重要。HarmonyOS和iOS類似也提供了自己的解決方案。Roma(羅碼)作為端平臺,在此基礎上進行了具體的實踐。在實踐過程中,遇到了各種問題和挑戰,經歷了ArkTS+C++架構
    的頭像 發表于 09-23 15:26 ?986次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>跨</b><b class='flag-5'>端</b><b class='flag-5'>實踐</b>-長列表解決方案和性能優化

    史無前例,移植V8虛擬機到純血鴻蒙系統

    作者:京東科技 于飛躍 一、背景 如圖所示,Roma框架是我們自主研發的動態化平臺解決方案,已支持iOS,android,web三。目前在京東金融APP已經有200+頁面,200+樂高樓
    的頭像 發表于 09-18 10:28 ?1599次閱讀
    史無前例,移植V8<b class='flag-5'>虛擬機</b>到純血<b class='flag-5'>鴻蒙</b>系統

    鴻蒙實踐-布局方案介紹

    封裝到標簽中實現,業務只需要針對標簽簡單地設置相關屬性,即可實現列表類布局,大幅提升研發效率。同時動態化也支持絕對布局以及控制視圖的顯示和隱藏等功能,使之能勝任絕大多數業務布局場景。 在京東金融App使用動態化方案適配鴻蒙系統的
    的頭像 發表于 09-18 10:26 ?1267次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>跨</b><b class='flag-5'>端</b><b class='flag-5'>實踐</b>-布局方案介紹

    虛擬化數據恢復—異常斷電導致VMware虛擬機文件丟失的數據恢復案例

    某品牌服務器(部署VMware EXSI虛擬機)+同品牌存儲(存放虛擬機文件)。
    的頭像 發表于 09-14 17:35 ?1141次閱讀
    <b class='flag-5'>虛擬</b>化數據恢復—異常斷電導致VMware<b class='flag-5'>虛擬機</b>文件丟失的數據恢復案例

    虛擬化數據恢復—EXSI虛擬機誤還原快照如何恢復數據?

    虛擬化技術原理是將硬件虛擬化供不同的虛擬機使用,一臺物理機上可以有多臺虛擬機。人為誤操作或者物理機故障會導致上層虛擬機不可用,甚至
    的頭像 發表于 09-09 11:56 ?616次閱讀
    <b class='flag-5'>虛擬</b>化數據恢復—EXSI<b class='flag-5'>虛擬機</b>誤還原快照如何恢復數據?

    什么是虛擬機?什么是虛擬化?

    在日新月異的科技世界中,虛擬化技術如同一座橋梁,連接著現實與數字的鴻溝,為我們打開了全新的計算維度。虛擬機,這一概念,自其誕生以來,就以其獨特的魅力和強大的功能,深深地影響了軟件開發、系統測試和云計算等多個領域。即使目前你還不了解它的應用,你應該也聽過
    的頭像 發表于 09-04 14:55 ?1917次閱讀

    創建ubuntu虛擬機

    英文的習慣。創建ubuntu虛擬機打開VMware軟件,點擊創建新的虛擬機。進入以下界面:選擇自定義,點擊“下一步”。選擇對應VMware版本的兼容性,版本可在幫助->關于VMware
    發表于 08-10 14:15

    虛擬機數據恢復—KVM虛擬機被誤刪除的數據恢復案例

    虛擬機數據恢復環境: Linux操作系統服務器,EXT4文件系統。服務器中有數臺KVM虛擬機虛擬機1:主數據庫服務器 虛擬磁盤:系統盤(qcow2)+數據盤(raw)
    的頭像 發表于 08-07 13:33 ?699次閱讀
    <b class='flag-5'>虛擬機</b>數據恢復—KVM<b class='flag-5'>虛擬機</b>被誤刪除的數據恢復案例

    什么是虛擬機虛擬機真的那么好用嗎?

    在日新月異的科技世界中,虛擬化技術如同一座橋梁,連接著現實與數字的鴻溝,為我們打開了全新的計算維度。虛擬機,這一概念,自其誕生以來,就以其獨特的魅力和強大的功能,深深地影響了軟件開發、系統測試和云
    的頭像 發表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機</b>?<b class='flag-5'>虛擬機</b>真的那么好用嗎?
    主站蜘蛛池模板: 韩国最新三级网站在线播放 | 亚洲аv电影天堂网 | 天天干天天干天天干天天干天天干 | 日本免费在线 | 久久久久久夜精品精品免费 | 97影院午夜午夜伦不卡 | 经典三级第一页 | 午夜视频免费在线观看 | 国产在线精彩视频二区 | 久久婷婷影院 | 狼人久久尹人香蕉尹人 | 国产主播在线看 | 亚洲第一网站 | 超人碰碰碰人人成碰人 | 爱我免费视频观看在线www | 天天干在线免费视频 | 夜夜春宵翁熄性放纵30 | 狠狠色狠狠色综合婷婷tag | 一个色综合网站 | 综合网天天 | 视频亚洲一区 | 天天亚洲综合 | 天天色踪合合 | 日韩欧美国产电影 | 日韩一级在线播放免费观看 | good韩国理论在线三级 | 国产精品久久久久久久免费大片 | 三级网站在线 | 免费人成在线观看视频色 | 黄色a网| fenfencao在线观看免费视频 | 欧美成人看片一区二区三区 | 免费一日本一级裸片在线观看 | 超级乱淫小黄文小说 | 天天拍夜夜添久久精品中文 | 日本精品视频 | 久青草国产免费观看 | 中文字幕佐山爱一区二区免费 | 色www视频永久免费 色www视频永久免费软件 | aaaa级日本片免费视频 | 色网站观看 |