(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)

随着社会的不断发展,人们逐渐注重更加高效、舒适、便捷、有趣的生活和工作体验。OpenAtom OpenHarmony(以下简称“OpenHarmony”)作为面向下一代的分布式操作系统,具有全场景、多设备、自然交互、便捷精准的技术特点,为行业数字化转型的高速发展提供领先的技术基础,为用户体验的创新满足提供了新思路。为了让大家深入了解 OpenHarmony 的技术特点,本期对 OpenHarmony HAP 包安装实现进行剖析。

HAP 包介绍

HAP 包是由代码、资源、第三方库以及应用配置文件打包生成的模块包,主要分为两种类型:entry 和 feature。

entry:应用的主模块,作为 OpenHarmony 应用的入口,提供了应用的基础功能。

feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备的类型进行选择性安装。

OpenHarmony 用户应用程序包可以只包含一个基础的 entry 包,也可以包含一个基础的 entry 包和一个或多个功能型的 feature 包。

HAP 包的类型你 get 了吗?接下来咱们对 HAP 包的安装实现进行深度剖析。

HAP包的安装流程简介

首先我们来看看在正常场景下,HAP 包的安装流程。如图 1:

image

图1 HAP包安装流程

  1. 端侧设备(如平板、大屏、车机、PC、手表和手机等)从 CDN( Content Delivery Network)云端服务器下载需要安装的 HAP 包。

  2. 由设备上的包管理服务来对 HAP 包进行校验,包括 HAP 包文件合法性校验、HAP 包签名信息校验和 HAP 包配置信息校验。

  3. 安装 HAP 包,包括创建 HAP 包的安装目录、将 HAP 包解压并拷贝到安装目录和将应用信息数据存入数据库和缓存。

以上是 HAP 包从下载到安装的整个流程,接下来对 HAP 包安装实现进行详解!

HAP 包安装实现详解

HAP 包文件合法性校验

当端侧设备完成从各种渠道下载 HAP 包文件之后,launcher (桌面应用)会获得该HAP文件的存储路径,随后 launcher 将该路径传递给包管理服务。

包管理服务获取了所有要安装的 HAP 包文件路径之后,开始对 HAP 包文件合法性进行校验。

校验的内容主要包括以下几项:

  • HAP 包文件是否存在
  • HAP 包文件名的合法性,要求文件名的长度不能超过 256 个字节
  • HAP 包文件类型的合法性,要求文件必须以 .hap 作为后缀
  • HAP 包文件路径的类型
  • HAP 包文件的大小,要求单个 HAP 文件的大小不能超过 4GB
  • 磁盘是否有足够的空间来安装 HAP 包文件

HAP 包签名信息校验

为了确保应用的发布者来自于同一个组织或个人,防止应用的信息被他人恶意篡改,因此需要在 HAP 包的安装或升级过程中对 HAP 包签名信息进行校验。安装过程中需要保证同一应用不同 HAP 包签名信息一致,升级过程中需要保证同一应用中待安装的 HAP 包和已安装的 HAP 包签名信息一致。

签名信息校验时,包管理服务调用安全子系统的接口,获取 HAP 包的签名信息,校验签名信息中的 appId 字符串(该字符串经过哈希算法的处理,可以保证一个应用对应唯一的一个 appId 字符串)。通过判断同一应用不同 HAP 包签名信息中 appId 字符串是否一致来判断 HAP 包的签名信息的一致性。

HAP 包配置信息校验

在安装过程中需要校验所有的 HAP 包中 config.json 文件中 APP 对象内部的配置信息是否一致。

config.json 文件中 APP 对象内部配置信息示例如下:

"app": {
  "bundleName": "com.example.13jsdemo",
  "vendor": "huawei",
  "version": {
    "code": 1000000, 
    "name": "1.0.0"
  },
  "apiVersion": {
    "compatible": 4, 
    "releaseType": "Release",
    "target": 5
  }
},

通过 config.json 文件配置信息实例可以看出 HAP 包配置信息具体包括如下几项:

  • 应用的包名
  • 供应商
  • 版本号
  • 发布方式
  • 适用的设备类型
  • 兼容的 API 的版本信息

若同一应用的多个 HAP 包的 config.json 文件中的配置信息一致,则继续接下来的安装。若不一致,则终止安装。

安装 HAP 包

包管理服务通过创建 HAP 包的安装目录、解压 HAP 包文件及应用信息数据存入数据库和缓存三个步骤完成 HAP 包的安装。

由于系统文件的管控导致包管理服务并没有权限来创建目录,也不能将从 HAP 包中解压出来的文件拷贝到指定的目录,因此借助系统的常驻进程——installd 进程来创建文件目录,及完成目录下文件的 IO 操作(input/output 缩写,指代读写操作)。

具体操作如图 2 所示:

image

图2 安装HAP包

  1. 包管理服务通过 IPC(Inter-Process Communication)跨进程通信,通知 installd 进程。

  2. Installd 进程先通过调用内核的接口 mkdir 来创建目录,再通过文件操作(将文件转换成字节流的操作)将文件写到目录下。

  3. Installd 进程将创建成功与否的结果以错误码的形式返回给包管理服务。返回的错误码包括:

  • ERR_APPEXECFWK_INSTALLD_CREATE_DIR_FAILED,代表创建目录失败

  • ERR_APPEXECFWK_INSTALLD_REMOVE_DIR_FAILED,代表移除目录失败

  • ERR_OK,代表目录创建或者删除操作成功

  1. 包管理服务将 HAP 包信息保存在服务缓存中,同时为了防止包信息的丢失,将这部分的内容写入到数据库。

说明:

虽然 installd 进程拥有创建和删除目录的权限,但是 installd 的权限也是有限的,它只有在应用目录的上级目录下创建和删除的权限。

经过对 HAP 包文件合法性校验、HAP 包签名信息校验、HAP 包配置信息校验和安装 HAP 包的层层剖析之后,是不是对 HAP 包整个安装过程了然于胸了,接下来咱们一起来探究下 HAP 包的升级安装策略吧。

升级安装策略

升级安装时需要考虑已经安装的 HAP 包和待安装的 HAP 包的版本兼容性。如果开发者在新版本的 HAP 包中迭代了某些新功能和特性,这些变化对于低版本的 HAP 包可能是不能兼容的。如果一个应用的部分 HAP 包升级到更高的版本之后还依然保留着部分低版本的 HAP 包,将造成低版本的 HAP 包无法正常使用。因此,制定合理的升级策略是保证应用正常运行的基础。

HAP 包的升级策略总结为以下几点:

  • 不允许安装比已安装应用版本号更低的 HAP 包。

  • 在安装了 entry 类型的 HAP 包的前提下,安装的 feature 类型 HAP 包必须和 entry 类型 HAP 包的版本号一致。当升级安装更高版本的 entry 类型 HAP 包,需要将已安装的低版本 feature 类型 HAP 包在升级结束之后卸载,再重新安装高版本 feature 类型 HAP 包。

  • 在未安装 entry 类型 HAP 包的前提下,可以升级安装更高版本的 feature 类型 HAP 包,但是需要保证在升级结束之后,低版本的 HAP 包被卸载。

安装异常处理

按部就班完成以上操作之后仍然安装失败怎么办?当前提供了如下常见问题供开发者进行查询。

问题现象1

当已经完成部分HAP包的安装时,其中某个HAP包创建目录失败导致该HAP包安装失败。

解决措施:

在安装流程结束之前,系统卸载安装好的HAP包,删除已创建的安装目录和数据目录,同时删除包管理服务和数据库中的包信息,再重新安装。

问题现象2

在HAP包安装的过程中,设备突然重启,导致HAP包安装中断。

解决措施:

在设备重启后,首先包管理服务检查应用的安装状态,若状态正常则系统将数据库中信息恢复到包管理服务的缓存中。若状态异常则系统将删除包信息、残留的包文件、安装目录和数据目录,再重新安装。

问题现象3

在HAP包升级安装过程中,设备重启。

解决措施:

在设备重启后,包管理服务删除已创建的临时安装目录。

问题现象4

在安装过程中,包管理服务突然重启。

解决措施:

包管理服务突然重启,且不会返回任何结果。此时IPC提供的死亡监听机制将会告知安装设备,包管理服务已经死亡。等待数秒,包管理服务会自动重启,用户只需要重新安装。