简介

升级包安装组件运行在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.完成升级后,进行后处理。如清理升级包,记录升级状态等。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐