自从 OpenHarmony 系统 3.0-LTS 版本发布之后,OpenHarmony 系统对 JS 应用增加了 Ark 方舟运行时。
但之前的 QuickJS 运行时却有没有移除,于是我就产生了两个好奇的问题:
OpenHarmony 系统中存在两个 JS 运行时,那开发的 JS 应用到底是运行在哪个运行时中的?
OpenHarmony 系统又是怎么识别 Hap 包是 Ark JS 应用的?
探究
本人手中的开发板是 Hi3516,所以去 productdefine 目录下面查看了一下 Hi3516DV300.json 文件,确认是否 Ark 子系统是否参与了编译。
从上图可以看出,Ark 子系统参与了系统编译,那就去开发板系统下确认一下。通过 hdc 工具查看,hdc shell 进入系统中,在 system/lib 目录下搜索 ark 字样,结果显示确实有 Ark JS 运行时 libark_jsruntime.so。
继续在 hdc shell 下搜索 ace 相关的 so 库信息。
于是我就在 OpenHarmony 源码下的 foundation 目录下进行了 find 查找。
find 的结果真的印证我的猜测,真有相关代码信息。那就去 ace_container.cpp 这个文件代码的第 54 行去看看吧。
继续发挥 find 命令的强大,搜索函数在哪里调用的。
结果是在同一个文件类调用的,查看源码,发现还是 AceContainer 类里面一个 isArkApp_ 自由布尔变量。
再次在源码里面找,发现是在 AceContainer 类构造函数中初始化的。
没有那就认真看看代码吧,发现是 AceContainer 类内部一个 CreateContainer 的静态函数构造的 AceContainer 实例,isArkApp 这个参数也是从 CreateContainer 函数传进来的。
有了突破口,那就又继续 find 吧(真的很强大啊)。
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;
}
自己使用 DevEco Studio 开发了一个 Demo 应用,并打包成 Hap 包,再直接使用解压工具解压 Hap 文件,查看其中的 config.json 文件内容,内容如下:
如下所示:
总结
点击预约今晚的视频号直播
联系客服