Guide
这是一篇讲解如何对OTA正确操作的文档,让初入门的开发者对OTA有初步的认识,并学会简单操作。
一、什么是 OTA
OTA(Over the Air)提供对设备远程升级的能力,可以让您的设备,轻松支持远程升级能力。目前仅支持全量包升级,暂不支持差分包升级。全量包升级是将新系统全部内容做成升级包,进行升级;差分包升级是将新老系统的差异内容做成升级包,进行升级。
关于OTA目前支持以下三种方式,方式1和3均验证完毕,方式2还在调测中,此处暂不做介绍:
- OTA(Over the Air)–ota在线升级。
- 通过USB从主机进程更新 – reboot flashd。
- 通过外部存储器进行升级 --SD卡/U盘升级。
二、操作说明
1、制作升级包
(1) 生成公私钥对
鸿蒙基线源码里默认有一对公私钥可以直接使用,见目录:openharmony/device/board/hisilicon/hispark_taurus/linux/updater/config 私钥:rsa_private_key2048.pem 公钥:signing_cert.crt。
rk3566中控屏代码仓里默认的公私钥对见目录:device/rockchip/rk3566/build/updater_config 私钥:rsa_private_key2048.pem 公钥:signing_cert.crt。
也可以用Openssl工具自行生成自己的公私钥对,关于私钥文件请妥善保管,在升级包制作过程中将私钥文件作为制作命令的参数带入,用于升级包签名。公钥用于升级时对升级包进行签名校验,鸿蒙标准系统需要将生成的公钥放在 openharmony/device/board/hisilicon/hispark_taurus/linux/updater/config/signing_cert.crt 这个文件中;如果是开鸿的3566中控屏代码仓请放在device/rockchip/rk3566/build/updater_config/signing_cert.crt文件中。
(2) 制作升级包
创建目标文件夹
关于目标文件夹的命名可以自定义,这里将文件夹命名为ota_package,操作如下:
osm@ubuntu:~$mkdir ota_package
osm@ubuntu:~$cd ota_package
osm@ubuntu:~/ota_package$ tree -a
.
├── system.img // 待升级的组件1
├── updater_binary // 升级相关的可执行文件
├── updater_config // 固定格式,子文件夹管理组件配置文件
│ ├── BOARD.list // 当前升级包支持的产品list
│ ├── updater_specified_config.xml // 组件配置文件
│ └── VERSION.mbn // 当前升级包所支持的版本范围
├── userdata.img // 待升级的组件2
└── vendor.img // 待升级的组件3
关于BOARD.list,内容如下:
osm@ubuntu:~/ota_package/updater_config$ cat BOARD.list
HI3516
HI3518
HI3559
osm@ubuntu:~/ota_package/updater_config$
关于VERSION.mbn,内容如下:
osm@ubuntu:~/ota_package/updater_config$ cat VERSION.mbn
Hi3516DV300-eng 10 QP1A.190711.020
Hi3516DV300-eng 10 QP1A.190711.022
osm@ubuntu:~/ota_package/updater_config$
版本名称格式:Hi3516DV300-eng 10 QP1A.XXXXXX.{大版本号(6位)}.XXX{小版本号(3位)}。
例如:Hi3516DV300-eng 10 QP1A.190711.020。名称中“190711”为大版本号,“020”为小版本号。
关于updater_specified_config.xml,内容如下:
osm@ubuntu:~/ota_package/updater_config$cat updater_specified_config.xml。
<?xml version="1.0"?>
<package>
<head name="Component header information">
<info fileVersion="01" prdID="123456" softVersion="Hi3516DV300-eng 10 QP1A.190711.020" date="2021-03-11" time="12:30">head info</info>
</head>
<group name = "Component information">
<component compAddr="vendor" compId="18" resType="05" compType="0" compVer="0o00">./vendor.img</component>
<component compAddr="system" compId="18" resType="05" compType="0" compVer="0o00">./system.img</component>
</group>
</package>
osm@ubuntu:~/ota_package/updater_config$
执行升级包制作命令(全量升级包)。
这里以鸿蒙的代码路径为例:
如果制作SD卡升级包需要加上-sc选项,即:python3.8 openharmony/base/update/packaging_tools/build_update.py ota_package ota_output -pk rsa_private_key2048.pem -sc。
osm@ubuntu:~$mkdir ota_output
osm@ubuntu:~$python3.8 openharmony/base/update/packaging_tools/build_update.py ota_package ota_output -pk rsa_private_key2048.pem
执行完之后,在ota_output下可以看到升级包:hi3516_ota_xxxxxx.zip,将其重命名为updater.zip,如果是在线升级需要将升级包放在服务器上,如果是SD卡升级需要将升级包放在SD卡的updater目录。
2、升级
(1) OTA升级(还在调测中,敬请期待)
(2) OTA升级(跳过下载)
将升级包通过SD卡/U盘/hdc_std等工具放到设备的/data下面的自定义目录,这里将升级包updater.zip放在/data/updater/updater目录下。
方式一、在主分区命令行执行:
reboot updater:–update_package=/data/updater/updater/updater.zip
方式二、在主分区命令行设置系统参数:
param set ohos.startup.powerctrl
reboot,updater:–update_package=/data/updater/updater/updater.zip
(或调用接口 bool RebootAndInstallUpgradePackage(const std::string &miscFile,
const std::string &packageName) )
以上两种方式原理相同,均是把参数–update_package=/data/updater/updater/updater.zip写入misc分区,后面updater进程会去misc分区获取该参数。
成功触发后,开始校验,界面如下:
校验通过后开始升级,界面如下:
升级成功后板子会自动重启,至此操作完毕。
(3) SD卡升级
OTA升级优先级高于SD卡升级:updater进程先去misc分区获取–update_package参数,成功获取到则进入ota在线升级。否则进入SD卡升级界面,进行SD卡升级等操作。
切换分区。
这里将包含升级包的SD卡插入设备,并在主分区命令行执行reboot updater,不传递–update_package参数,可以直接切换到recovery分区,界面如下:
选择升级。
开始校验。
如果升级包制作没有问题,板子开始验证升级包,显示如下:
“Don’t remove SD Card!”
“Verify package…” //持续时间比较久,大概一二十分钟
开始升级。
验证通过之后,开始升级,升级成功后板子会自动重启,至此操作完毕。
3、调测
在升级的过程中会产生log文件/data/updater/log/updater_log, 包含程序运行各个阶段添加的打印信息可供调试使用。