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

相关文章

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装