打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenHarmony是如何识别Ark应用的?

自从 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 还有用处吗?

点击预约今晚的视频号直播

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何编译OpenHarmony自带APP
ArkUI跨平台设计【坚果派】
为什么鸿蒙粉丝都喜欢用“设备信息”这个作者明显有问题的软件证明鸿蒙不是安卓改名?
hap
华为任革林总架构师等联袂推荐!《鸿蒙操作系统开发入门经典》正式上市
PHP中数组转换成json字符串程序代码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服