当前位置: 首页 > 科技观察

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

时间:2023-03-11 20:31:25 科技观察

OpenHarmony系统如何知道应用是方舟应用背景自OpenHarmony系统3.0-LTS版本发布以来,OpenHarmony系统在JS应用中加入了方舟Ark运行时,但之前的QuickJS运行时并没有被移除,并且有两个奇怪的问题出现了。OpenHarmony系统中有两个JS运行时,那么开发出来的JS应用运行在哪个运行时呢?OpenHarmony系统如何识别Hap包是方舟JS应用?第一步是判断系统是否真的存在方舟运行时。在OpenHarmony系统的源码中,虽然提供了方舟Ark运行时代码,但是开发板编译的系统并不一定编译Ark方舟运行时。我手上的开发板是Hi3516,于是查看了productdefine目录下的Hi3516DV300.json文件,确认方舟子系统是否参与了编译。从上图可以看出,方舟子系统已经参与了系统编译,所以去开发板系统确认一下。通过hdc工具查看,hdcshell进入系统,在system/lib目录下搜索ark,结果显示ArkJS运行时确实有libark_jsruntime.so。从上图的结果也可以看出,aceJSUI框架部分的so库也有方舟版本。第二步,判断AceJSUI框架是否同时支持Ark和QuickJS。继续在hdcshell下搜索ace相关的so库信息。从以上信息来看,Ace同时支持方舟和QuickJS。既然如此,那我们就查看一下OpenHarmony的源码,看看系统是如何识别Hap应用类型的。第三步,确认系统SO库的选择方法。多年的程序开发经验让我立刻猜到系统可能对so库有一个选择过程,比如libace_engine_ark.z.so和libace_engine_qjs.z.so。于是在OpenHarmony源码下的foundation目录下找了找。find的结果果然证实了我的猜测,确实有相关的代码信息。然后到ace_container.cpp文件代码的第54行看一下。看着代码,心里乐开了花,这不就是我猜的结果吗。它由函数isArkApp的输入参数选择。然后继续查找参数isArkApp是怎么来的。第四步,判断isArkApp参数的来源。继续使用find命令的强大功能来搜索调用函数的位置。结果是在同一个文件类中被调用。查看源码,发现AceContainer类中还有一个isArkApp_free布尔变量。再次查看源码,发现是在AceContainer类的构造函数中初始化的。然后使用find命令继续查找调用AceContainer类的构造函数的地方。结果有点失望,找不到可以打电话的地方。如果不是,再仔细看代码,发现是AceContainer类内部CreateContainer的静态函数构造的AceContainer实例。参数isArkApp也是从CreateContainer函数传入的。有了突破,再继续找(真厉害)。结果显示在ace_ability.cpp文件的256行有一个调用。查看源码,找到isArkApp参数的来源,即GetIsArkFromConfig函数的返回值。第五步,查看GetIsArkFromConfig函数的代码。GetIsArkFromConfig该函数在utils.h文件中实现如下,关键代码如下:inlineboolGetIsArkFromConfig(conststd::string&packagePathStr){autoconfigPath=packagePathStr+std::string("config.json");//·····此处省略100个字符·····std::stringjsonString(jsonStream.get(),jsonStream.get()+size);autorootJson=JsonUtil::ParseJsonString(jsonString);自动模块=rootJson->GetValue("模块");autodistro=module->GetValue("distro");std::stringvirtualMachine=distro->GetString("virtualMachine");返回virtualMachine.find("方舟")!=std::string::npos;}从上面的代码可以看出,是解析出来的hap中config.json文件中的内容,module/distro结构体中virtualMachine字段的值是否包含方舟弦来判断。至此,我们已经找到了OpenHarmony如何识别ARK应用的依据。第六步,分析Hap包,确认config.json文件内容。我使用DevEcoStudio开发了一个Demo应用,并打包成Hap包,然后直接使用解压工具解压Hap文件,查看config.json文件内容。内容如下:distro对象中确实有一个virtualMachine字段,内容是ark0.0.0.2。但实际上config.json文件中的distro在写代码的时候并没有添加virtualMachine字段。如下图:因此可以断定,virtualMachine字段是在DevEcoStudio开发工具编译打包时自动添加的。综上所述,目前使用DevEcoStudio开发工具开发的OpenHarmony应用已经默认编译打包成方舟应用。无需开发人员手动设置。问:DevEcoStudio开发工具已经默认OpenHarmony应用为方舟应用,QuickJS在系统中还有用吗?更多信息请访问:与华为共建的鸿蒙科技社区https://ost.51cto.com