第一步,确定系统是否真的存在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函数的代码。
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 开发工具编译打包期间,自动添加进去的。