0

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

 2 years ago
source link: https://os.51cto.com/article/703903.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
OpenHarmony系统是怎么知道应用是Ark应用的-51CTO.COM
OpenHarmony系统是怎么知道应用是Ark应用的
作者:拓维信息Abin 2022-03-14 15:26:59
本人手中的开发板是Hi3516,所以去productdefine目录下面查看了一下Hi3516DV300.json文件,确认是否Ark子系统是否参与了编译。

a55bf2188a596ad8f835526b2438189537e943.png

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

​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子系统是否参与了编译。

9370c3288e80ba65dca2309a3c77e1e15d8351.png

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

f2d4cd63288f691cc1768086e140045c9a3d1f.png

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

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

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

b23cbf50118c4ca14bb2337ccbdfd3bebd835b.png

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

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

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

c46f7fa06aaf659718e77524eec2f19d67b4bd.png

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

79960c727eb611153fe034ab7d24094560bb1d.png

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

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

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

e79f5265237dff509d36188dc7f202d4481f93.png

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

b3c58c0194da04fd76061181ac9625ee8205af.png

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

371ac92818224fbf5585261e25c6ae8431a345.png

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

86470140250942396056407de9ea6680d2c84b.png

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

35c997d145bc0ba1fa34021c6948760b94f5bd.png

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

283cc0b381c99b4c630239bf5cee5e3e35b9f0.png

查看源码,找到了 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文件内容,内容如下:

c9b8ea8751dcabbf6cf99028476875c9766f70.png

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

275ad4e03cf8f34e50c68873cd065d62e214f3.png

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

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

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

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

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

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

c6402dc85b85f6fe186249fe8814d865827245.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK