OpenHarmony4.x升级系统简介
简介
升级包安装组件运行在updater分区,其功能主要包括读取misc分区信息获取升级包状态,对升级包进行校验,确保升级包合法有效;然后从升级包中解析出升级的可执行程序,创建子进程并启动升级程序。具体升级的动作由升级脚本控制。本文将介绍如何针对OpenHarmony L2场景适配updater模式。
升级方式
从OTA包的升级方式来说分为本地升级和网络OTA升级。
本地升级:将制作好的OTA包放入设备指定升级路径,在软件相关界面下执行升级或直接输入升级命令进行本地升级。
OTA升级:设备通过升级应用从OTA服务器下载升级包至本地设备,下载完成后再执行升级。
可以看出本地升级是网络OTA升级的一个环节,通常为了调试方便,验证设备OTA升级可行性,工程师会先进行本地OTA包升级验证。
基本概念
-
全量升级包:将所有目标版本的镜像均通过全量镜像的方式打包获得的升级包。
-
差分升级包:对源版本和目标版本差分,获得两个版本镜像之间的差异,以这种方式打包制作的升级包。
-
变分区升级:设备分区进行了调整之后制作的全量升级包,支撑变分区全量升级包升级的一种升级方式。
-
AB分区升级:是一种升级场景,原理是设备有一套备份的B系统,在A系统运行时,可以在正常使用的状态下,静默更新B系统,升级成功后,重启切换新系统,实现版本更新的机制。
升级服务组件
升级服务组件是一个SA(System Ability), 由OHOS 的init 进程负责启动。
升级服务器引擎主要功能包括:
1、查找可用的升级包
2、下载升级包
3、设置/获取升级策略
4、触发升级
代码目录
base/update/updateservice # 升级服务代码仓目录 ├── interfaces # 升级客户端接口目录 │ ├── kits # 对外接口封装目录 │ │ └── js # 提供给升级客户端应用的JS 接口目录 │ └── inner_api # SA 接口定义和封装目录 ├── frameworks # 部件无独立进程的实现 │ └── js # JS API的实现 │ └── napi # napi代码实现 │ └── client # 升级客户端napi 接口目录 ├── services # 独立进程的实现 │ ├── callback # 提供给升级客户端应用的callback接口目录 │ └── engine # 升级客户端引擎服务目录 │ ├── etc # 升级客户端引擎rc配置文件目录 │ ├── include # 升级客户端引擎头文件目录 │ ├── sa_profile # SA 配置文件目录 │ └── src # 升级客户端引擎源码目录 │ ├── core # 核心能力目录,设备相关接口、数据库 (4.x新增) │ ├── firmware # 升级流程功能实现目录(4.x新增) │ ├── service # 通用头文件目录error、log(4.x新增) │ ├── startup # 启动自动升级及策略相关(4.x新增) │ ├── utils # 基础功能目录,网络状态、计时器(4.x新增) ├── test # 测试代码目录 │ ├── unittest # 升级客户端UT代码目录 │ └── fuzztest # 升级客户端FT代码目录 ├── BUILD.gn # 编译入口 └── bundle.json # 部件描述文件
JS接口说明
接口 | 说明 |
---|---|
checkNewVersion | 检查是否有可用的升级包版本 |
download() | 下载升级包 |
upgrade() | 将升级命令写入到misc分区,最终调用reboot命令,进入到updater 子系统中。 |
getNewVersionInfo() | 升级完成后,获取升级后的版本信息 |
setUpgradePolicy | 设置升级策略 |
getUpgradePolicy | 获取升级策略 |
使用说明
1,导入updateclient lib
import client from 'libupdateclient.z.so'
2,获取update对象
let updater = client.getUpdater('OTA');
3,获取新版本信息
updater.getNewVersionInfo(info => { info "新版本信息" });
4,检查新版本
updater.checkNewVersion(info => { info "新版本信息" });
5,下载新版本,并监听下载进程
updater.download(); updater.on("downloadProgress", progress => { progress "下载进度信息" });
6,启动升级
updater.upgrade(); updater.on("upgradeProgress", progress => { progress "升级进度信息" });
7,设置升级策略
updater.setUpgradePolicy(result => { result "设置升级策略结果" });
8,查看升级策略
updater.getUpgradePolicy(policy => { policy "升级策略" });
参考update子系统目录下的update_app升级应用。
升级包安装组件
升级包安装组件运行在updater分区,其功能主要包括读取misc分区信息获取升级包状态,对升级包进行校验,确保升级包合法有效;然后从升级包中解析出升级的可执行程序,创建子进程并启动升级程序。
图 1 升级子系统架构图
代码目录
base/update/updater/ ├── resources # 升级子系统用户界面图片资源目录 ├── services # 组件服务层代码目录 │ ├── applypatch # 升级包数据更新代码目录 │ ├── diffpatch # 差分还原代码目录 │ ├── etc # 启动相关配置文件目录 │ ├── flashd # flashd模式镜像写入和升级功代码目录 │ ├── fs_manager # 文件系统和分区管理代码目录 │ ├── hdi # 硬件相关接口定义 │ ├── include # 升级子系统头文件目录 │ ├── log # 升级子系统日志模块目录 │ ├── package # 升级包管理模块目录 │ ├── ptable_parse # 分区表解析代码目录 │ ├── script # 升级脚本管理目录 │ ├── ui # 升级ui界面代码目录 │ └── updater_binary # 升级可执行程序目录 ├── interfaces │ └── kits # 对外模块接口定义 └── utils # 升级子系统通用代码目录 └── include # 升级子系统通用函数头文件目录
升级包安装是升级子系统的核心功能,主要包括:
1.从misc分区获取升级命令,根据不同的命令执行不同的任务。
2.对升级包进行解压和合法性效验。
3.启动升级进程,并解析出升级脚本。
4.根据升级脚本安装各个组件包。
5.完成升级后,进行后处理。如清理升级包,记录升级状态等。
更多推荐
所有评论(0)