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

相关文章

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

win10安装及配置Gradle全过程

《win10安装及配置Gradle全过程》本文详细介绍了Gradle的下载、安装、环境变量配置以及如何修改本地仓库位置,通过这些步骤,用户可以成功安装并配置Gradle,以便进行项目构建... 目录一、Gradle下载1.1、Gradle下载地址1.2、Gradle下载步骤二、Gradle安装步骤2.1、安

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node