OTA升级操作说明 原创 精华
@toc
Guide
这是一篇讲解如何对OTA正确操作的文档,让初入门的开发者对OTA有初步的认识,并学会简单操作。
一、什么是 OTA
OTA(Over the Air)提供对设备远程升级的能力,可以让您的设备,轻松支持远程升级能力。目前仅支持全量包升级,暂不支持差分包升级。全量包升级是将新系统全部内容做成升级包,进行升级;差分包升级是将新老系统的差异内容做成升级包,进行升级。
关于OTA目前支持以下三种方式,方式1和3均验证完毕,方式2还在调测中,此处暂不做介绍:
1、OTA(Over the Air)–ota在线升级;
2、通过USB从主机进程更新 – reboot flashd;
3、通过外部存储器进行升级 --SD卡/U盘升级;
二、操作说明
1.制作升级包
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文件中;
1.2 制作升级包
1.2.1 创建目标文件夹
关于目标文件夹的命名可以自定义,这里将文件夹命名为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
1、关于BOARD.list,内容如下:
osm@ubuntu:~/ota_package/updater_config$ cat BOARD.list
HI3516
HI3518
HI3559
osm@ubuntu:~/ota_package/updater_config$
2、关于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”为小版本号。
3、关于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$
1.2.2 执行升级包制作命令(全量升级包)
这里以鸿蒙的代码路径为例:
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
如果制作SD卡升级包需要加上-sc选项,即:python3.8 openharmony/base/update/packaging_tools/build_update.py ota_package ota_output -pk rsa_private_key2048.pem -sc
执行完之后,在ota_output下可以看到升级包:hi3516_ota_xxxxxx.zip,将其重命名为updater.zip,如果是在线升级需要将升级包放在服务器上,如果是SD卡升级需要将升级包放在SD卡的updater目录。
2、升级
2.1 OTA升级(还在调测中,敬请期待)
2.2 OTA升级(跳过下载)
将升级包通过SD卡/U盘/hdc_std等工具放到设备的/data下面的自定义目录,这里将升级包updater.zip放在/data/updater/updater目录下
2.2.1 方式一、在主分区命令行执行:
reboot updater:–update_package=/data/updater/updater/updater.zip
2.2.2 方式二、在主分区命令行设置系统参数:
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分区获取该参数。
成功触发后,开始校验,界面如下:
校验通过后开始升级,界面如下:
升级成功后板子会自动重启,至此操作完毕。
2.3 SD卡升级
OTA升级优先级高于SD卡升级:updater进程先去misc分区获取–update_package参数,成功获取到则进入ota在线升级。否则进入SD卡升级界面,进行SD卡升级等操作。
2.3.1 切换分区
这里将包含升级包的SD卡插入设备,并在主分区命令行执行reboot updater,不传递–update_package参数,可以直接切换到recovery分区,界面如下:
2.3.2 选择升级
2.3.3 开始校验
如果升级包制作没有问题,板子开始验证升级包,显示如下:
“Don’t remove SD Card!”
“Verify package…” //持续时间比较久,大概一二十分钟
2.3.4 开始升级
验证通过之后,开始升级,升级成功后板子会自动重启,至此操作完毕。
3、调测
在升级的过程中会产生log文件/data/updater/log/updater_log, 包含程序运行各个阶段添加的打印信息可供调试使用。
差分升级包制作没有问题 ,但是总是报错sha_check 检查失败 麻烦问一下 这是什么问题导致的
2013-01-18 00:10:42 [INFO]UPDATER_BINARY pkg_pkgfile.cpp 70 : ExtractFile Verse-script.us
2013-01-18 00:10:42 [INFO]UPDATER_BINARY pkg_zipfile.cpp 516 : packedSize: 1040 unpackedSize: 2595 offset header: 0 data: 45
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_interpreter.cpp 31 : ExecuteScript Verse-script.us
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_statement.cpp 266 : [INTERPRETER 1-2]"UScriptStatementList::Execute "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_expression.cpp 126 : [INTERPRETER 1-2]"BinaryExpression::Execute "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_expression.cpp 126 : [INTERPRETER 1-2]"BinaryExpression::Execute "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_expression.cpp 126 : [INTERPRETER 1-2]"BinaryExpression::Execute "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_expression.cpp 152 : [INTERPRETER 1-2]"FunctionCallExpression::Execute sha_check "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY script_interpreter.cpp 171 : [INTERPRETER 1-2]"ExecuteNativeFunc::Execute sha_check "
2013-01-18 00:10:42 [INFO]UPDATER_BINARY update_image_block.cpp 390 : UScriptInstructionShaCheck::dev path : /dev/block/platform/fe330000.sdhci/by-name/system
2013-01-18 00:10:43 [ERROR]UPDATER_BINARY update_image_block.cpp 420 : Different sha256, cannot continue
2013-01-18 00:10:43 [INFO]UPDATER_BINARY script_interpreter.cpp 202 : [INTERPRETER 1-2]"ExecuteNativeFunc::Execute sha_check result: 508"
2013-01-18 00:10:43 [INFO]UPDATER_BINARY script_expression.cpp 143 : [INTERPRETER 1-2]"BinaryExpression::Execute left:type: Error 508 != right:type: Integer 0 result:null"
2013-01-18 00:10:43 [ERROR]UPDATER updater.cpp 322 : Updater process exit with status: 0
2013-01-18 00:10:43 [ERROR]UPDATER updater.cpp 182 : Install package failed.
2013-01-18 00:10:47 [INFO]UPDATER updater_main.cpp 479 : [uploadLog]WriteCfgItemValue enter
2013-01-18 00:10:47 [INFO]UPDATER updater_main.cpp 481 : [uploadLog]GetUpdateResultConfToJsonObj ok
2013-01-18 00:10:47 [INFO]UPDATER updater_main.cpp 401 : [uploadLog]status RESULT_FAILURE.
2013-01-18 00:10:47 [INFO]UPDATER updater_main.cpp 484 : [uploadLog]WriteJsonToFile ok
2013-01-18 00:10:47 [INFO]UPDATER mount.cpp 128 : /data already mounted
我也遇到了相同的错误,请问一下楼主这边有解决了吗?