OpenHarmony系统是怎么知道应用是Ark应用的

系统 OpenHarmony
本人手中的开发板是Hi3516,所以去productdefine目录下面查看了一下Hi3516DV300.json文件,确认是否Ark子系统是否参与了编译。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

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

背景

自从OpenHarmony系统3.0-LTS版本发布之后,OpenHarmony系统对JS应用增加了Ark方舟运行时,但之前的QuickJS运行时却有没有移除,就产生了两个好奇的问题。

OpenHarmony系统中存在两个JS运行时,那开发的JS应用到底是运行在哪个运行时中的?

OpenHarmony系统又是怎么识别Hap包是Ark JS应用的?

探究

第一步,确定系统是否真的存在Ark方舟运行时。

OpenHarmony系统源码中,虽然提供了Ark方舟运行时代码,但开发板编译的系统不一定会编译Ark方舟运行时。本人手中的开发板是Hi3516,所以去productdefine目录下面查看了一下Hi3516DV300.json文件,确认是否Ark子系统是否参与了编译。

从上图可以看出,Ark子系统参与了系统编译,那就去开发板系统下确认一下。通过hdc工具查看,hdc shell进入系统中,在system/lib 目录下搜索ark字样,结果显示确实有Ark JS运行时libark_jsruntime.so。

从上图结果中,还可以看出ace JS UI框架部分的so库也有ark版本的。

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

继续在hdc shell下搜索ace相关的so库信息。

从上图的信息中,Ace是同时支持Ark和QuickJS的。既然如此,那就去查看OpenHarmony的源码吧,系统究竟是怎么进行识别Hap应用的类型的。

第三步,确认系统SO库的选择方式。

多年的程序开发经验,让我立马就猜测,系统可能会有so库的选择过程,比如 libace_engine_ark.z.so 和 libace_engine_qjs.z.so 两个的选择。于是我就在OpenHarmony源码下的foundation目录下进行了 find 查找。

find 的结果真的印证我的猜测,真有相关代码信息。那就去ace_container.cpp这个文件代码的第54行去看看吧。

一看代码,把我高兴坏了,这不就是我猜测的结果么。通过函数的入参 isArkApp 进行选择的。那就继续找isArkApp 这个参数怎么来的吧。

第四步,确定 isArkApp 参数来源。

继续发挥 find 命令的强大,搜索函数在哪里调用的。

结果是在同一个文件类调用的,查看源码,发现还是AceContainer类里面一个 isArkApp_ 自由布尔变量。

再次在源码里面找,发现是在AceContainer类构造函数中初始化的。

那就在使用 find 命令继续搜索哪里有调用AceContainer类这个构造函数吧。结果有点失望,没有搜到有调用的地方。没有那就认真看看代码吧,发现是AceContainer类内部一个 CreateContainer 的静态函数构造的AceContainer实例,isArkApp 这个参数也是从 CreateContainer 函数传进来的。

有了突破口,那就又继续 find 吧(真的很强大啊)。

结果显示在ace_ability.cpp文件的第256行代码有调用。

查看源码,找到了 isArkApp 参数的来源,是 GetIsArkFromConfig 这个函数的返回值。

第五步,查看GetIsArkFromConfig函数的代码。

GetIsArkFromConfig 这个函数在 utils.h 文件中,实现如下所示,展示了关键代码:

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文件中的内容,通过module/distro结构中的 virtualMachine 字段的值中是否包含有 ark 字符串来判断的。至此,我们就找了OpenHarmony是怎么识别ARK应用的依据了。

第六步,解析Hap包确认config.json文件内容。

自己使用DevEco Studio开发了一个Demo应用,并打包成Hap包,再直接使用解压工具解压Hap文件,查看其中的config.json文件内容,内容如下:

distro对象中确实存在一个 virtualMachine 字段,而且内容为 ark0.0.0.2。但是实际上,写代码的时候config.json文件中的distro并没有添加 virtualMachine 字段。如下所示:

所以可以得出,virtualMachine 这个字段是 DevEco Studio 开发工具编译打包期间,自动添加进去的。

总结

当前 DevEco Studio 开发工具开发的OpenHarmony应用程序,已经默认编译打包成了 Ark 应用。不需要开发人员手动设置。

疑问:DevEco Studio 开发工具已经默认OpenHarmony应用程序为Ark应用,那系统中的QuickJS还有用处吗?

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

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

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2023-03-01 14:55:09

2022-03-02 16:08:31

Harmony应用开发鸿蒙

2013-07-19 15:31:20

移动应用僵尸

2011-11-25 10:47:32

大数据企业创新

2012-02-01 16:32:32

2023-04-17 16:14:55

静态订阅鸿蒙

2013-06-04 21:50:42

云计算应用

2022-11-25 16:27:07

应用开发鸿蒙

2013-08-09 14:23:09

Android应用Android退出按钮Android开发设计

2022-04-29 14:56:40

通话应用源码剖析

2022-11-04 14:58:59

应用开发鸿蒙

2022-02-21 14:49:26

OpenHarmon操作系统鸿蒙

2022-09-21 14:58:11

OH应用签名鸿蒙

2013-06-27 09:42:00

2012-04-08 14:34:10

Android

2021-08-24 00:16:05

Windows 11Windows微软

2021-11-18 10:28:03

鸿蒙HarmonyOS应用

2023-06-27 15:02:47

2024-03-26 15:25:55

应用接口文件转换工具鸿蒙

2013-01-08 10:31:08

惠普SaaS公共云
点赞
收藏

51CTO技术栈公众号