偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

OpenHarmony系統(tǒng)是怎么知道應用是Ark應用的

系統(tǒng) OpenHarmony
本人手中的開發(fā)板是Hi3516,所以去productdefine目錄下面查看了一下Hi3516DV300.json文件,確認是否Ark子系統(tǒng)是否參與了編譯。

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??

背景

自從OpenHarmony系統(tǒng)3.0-LTS版本發(fā)布之后,OpenHarmony系統(tǒng)對JS應用增加了Ark方舟運行時,但之前的QuickJS運行時卻有沒有移除,就產(chǎn)生了兩個好奇的問題。

OpenHarmony系統(tǒng)中存在兩個JS運行時,那開發(fā)的JS應用到底是運行在哪個運行時中的?

OpenHarmony系統(tǒng)又是怎么識別Hap包是Ark JS應用的?

探究

第一步,確定系統(tǒng)是否真的存在Ark方舟運行時。

OpenHarmony系統(tǒng)源碼中,雖然提供了Ark方舟運行時代碼,但開發(fā)板編譯的系統(tǒng)不一定會編譯Ark方舟運行時。本人手中的開發(fā)板是Hi3516,所以去productdefine目錄下面查看了一下Hi3516DV300.json文件,確認是否Ark子系統(tǒng)是否參與了編譯。

從上圖可以看出,Ark子系統(tǒng)參與了系統(tǒng)編譯,那就去開發(fā)板系統(tǒng)下確認一下。通過hdc工具查看,hdc shell進入系統(tǒng)中,在system/lib 目錄下搜索ark字樣,結(jié)果顯示確實有Ark JS運行時libark_jsruntime.so。

從上圖結(jié)果中,還可以看出ace JS UI框架部分的so庫也有ark版本的。

第二步,確定Ace JS UI框架是否存在Ark和QuickJS同時支持。

繼續(xù)在hdc shell下搜索ace相關(guān)的so庫信息。

從上圖的信息中,Ace是同時支持Ark和QuickJS的。既然如此,那就去查看OpenHarmony的源碼吧,系統(tǒng)究竟是怎么進行識別Hap應用的類型的。

第三步,確認系統(tǒng)SO庫的選擇方式。

多年的程序開發(fā)經(jīng)驗,讓我立馬就猜測,系統(tǒng)可能會有so庫的選擇過程,比如 libace_engine_ark.z.so 和 libace_engine_qjs.z.so 兩個的選擇。于是我就在OpenHarmony源碼下的foundation目錄下進行了 find 查找。

find 的結(jié)果真的印證我的猜測,真有相關(guān)代碼信息。那就去ace_container.cpp這個文件代碼的第54行去看看吧。

一看代碼,把我高興壞了,這不就是我猜測的結(jié)果么。通過函數(shù)的入?yún)?isArkApp 進行選擇的。那就繼續(xù)找isArkApp 這個參數(shù)怎么來的吧。

第四步,確定 isArkApp 參數(shù)來源。

繼續(xù)發(fā)揮 find 命令的強大,搜索函數(shù)在哪里調(diào)用的。

結(jié)果是在同一個文件類調(diào)用的,查看源碼,發(fā)現(xiàn)還是AceContainer類里面一個 isArkApp_ 自由布爾變量。

再次在源碼里面找,發(fā)現(xiàn)是在AceContainer類構(gòu)造函數(shù)中初始化的。

那就在使用 find 命令繼續(xù)搜索哪里有調(diào)用AceContainer類這個構(gòu)造函數(shù)吧。結(jié)果有點失望,沒有搜到有調(diào)用的地方。沒有那就認真看看代碼吧,發(fā)現(xiàn)是AceContainer類內(nèi)部一個 CreateContainer 的靜態(tài)函數(shù)構(gòu)造的AceContainer實例,isArkApp 這個參數(shù)也是從 CreateContainer 函數(shù)傳進來的。

有了突破口,那就又繼續(xù) find 吧(真的很強大啊)。

結(jié)果顯示在ace_ability.cpp文件的第256行代碼有調(diào)用。

查看源碼,找到了 isArkApp 參數(shù)的來源,是 GetIsArkFromConfig 這個函數(shù)的返回值。

第五步,查看GetIsArkFromConfig函數(shù)的代碼。

GetIsArkFromConfig 這個函數(shù)在 utils.h 文件中,實現(xiàn)如下所示,展示了關(guān)鍵代碼:

inline bool GetIsArkFromConfig(const std::string& packagePathStr)
{
auto configPath = packagePathStr + std::string("config.json");
//·····此處省略100字·····
std::string jsonString(jsonStream.get(), jsonStream.get() + size);
auto rootJson = JsonUtil::ParseJsonString(jsonString);
auto module = rootJson->GetValue("module");
auto distro = module->GetValue("distro");
std::string virtualMachine = distro->GetString("virtualMachine");
return virtualMachine.find("ark") != std::string::npos;
}

從上述代碼中可以看出,是解析的hap中的config.json文件中的內(nèi)容,通過module/distro結(jié)構(gòu)中的 virtualMachine 字段的值中是否包含有 ark 字符串來判斷的。至此,我們就找了OpenHarmony是怎么識別ARK應用的依據(jù)了。

第六步,解析Hap包確認config.json文件內(nèi)容。

自己使用DevEco Studio開發(fā)了一個Demo應用,并打包成Hap包,再直接使用解壓工具解壓Hap文件,查看其中的config.json文件內(nèi)容,內(nèi)容如下:

distro對象中確實存在一個 virtualMachine 字段,而且內(nèi)容為 ark0.0.0.2。但是實際上,寫代碼的時候config.json文件中的distro并沒有添加 virtualMachine 字段。如下所示:

所以可以得出,virtualMachine 這個字段是 DevEco Studio 開發(fā)工具編譯打包期間,自動添加進去的。

總結(jié)

當前 DevEco Studio 開發(fā)工具開發(fā)的OpenHarmony應用程序,已經(jīng)默認編譯打包成了 Ark 應用。不需要開發(fā)人員手動設(shè)置。

疑問:DevEco Studio 開發(fā)工具已經(jīng)默認OpenHarmony應用程序為Ark應用,那系統(tǒng)中的QuickJS還有用處嗎?

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2023-03-01 14:55:09

2013-07-19 15:31:20

移動應用僵尸

2022-03-02 16:08:31

Harmony應用開發(fā)鴻蒙

2023-04-17 16:14:55

靜態(tài)訂閱鴻蒙

2011-11-25 10:47:32

大數(shù)據(jù)企業(yè)創(chuàng)新

2022-04-29 14:56:40

通話應用源碼剖析

2022-11-04 14:58:59

應用開發(fā)鴻蒙

2012-02-01 16:32:32

2022-11-25 16:27:07

應用開發(fā)鴻蒙

2013-06-04 21:50:42

云計算應用

2013-08-09 14:23:09

Android應用Android退出按鈕Android開發(fā)設(shè)計

2023-06-27 15:02:47

2021-11-18 10:28:03

鴻蒙HarmonyOS應用

2024-03-04 14:59:51

鴻蒙CPU信息C++

2022-02-21 14:49:26

OpenHarmon操作系統(tǒng)鴻蒙

2022-09-21 14:58:11

OH應用簽名鴻蒙

2013-01-08 10:31:08

惠普SaaS公共云

2012-04-08 14:34:10

Android

2013-06-27 09:42:00

2021-08-24 00:16:05

Windows 11Windows微軟
點贊
收藏

51CTO技術(shù)棧公眾號