OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析

2024-03-17 07:59

本文主要是介绍OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

石磊

随着社会的不断发展,人们逐渐注重更加高效、舒适、便捷、有趣的生活和工作体验。

OpenAtom OpenHarmony(以下简称“OpenHarmony”)作为面向下一代的分布式操作系统,具有全场景、多设备、自然交互、便捷精准的技术特点,为行业数字化转型的高速发展提供领先的技术基础,为用户体验的创新满足提供了新思路。

为了让大家深入了解 OpenHarmony 的技术特点,本期对 OpenHarmony HAP 包安装实现进行剖析。

一、HAP包介绍


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

  • entry:应用的主模块,作为 OpenHarmony 应用的入口,提供了应用的基础功能。
  • feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备的类型进行选择性安装。


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

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

二、HAP包的安装流程简介


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

图1 HAP包安装流程

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

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

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

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

三、HAP包安装实现详解


1)HAP包文件合法性校验

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

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

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

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


2)HAP包签名信息校验

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

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

3)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 文件中的配置信息一致,则继续接下来的安装。若不一致,则终止安装。

4)安装HAP包

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

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

具体操作如图 2 所示:

图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,代表目录创建或者删除操作成功

4. 包管理服务将 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提供的死亡监听机制将会告知安装设备,包管理服务已经死亡。等待数秒,包管理服务会自动重启,用户只需要重新安装。

这篇关于OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818315

相关文章

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代