Openharmony4.x系统更新升级包制作
1、 升级包简介 升级包里面有两个文件,包括build_tools.zip 和update.bin。 build_tools.zip:用来辅助升级的工具,包括升级的可执行文件updater_binary和升级脚本,镜像描述 update.bin:TLV编码的文件,所有的升级内容按照TLV格式序列化存储,
1、 升级包简介
升级包里面有两个文件,包括build_tools.zip 和update.bin。
build_tools.zip:用来辅助升级的工具,包括升级的可执行文件updater_binary和升级脚本,镜像描述
update.bin:TLV编码的文件,所有的升级内容按照TLV格式序列化存储,最终生成update.bin
工具对update.bin 和最终生成的升级包(zip 压缩文件)分别进行签名。
2、升级包制作工具
升级包制作工具是使用python开发,运行在PC端用来制作升级包的工具,功能主要包括:全量升级包制作、差分升级包制作以及变分区升级包制作。它首先会打包各个升级镜像,然后对升级包进行签名,同时生成升级包执行脚本,最后制作出升级包。
-
全量升级包制作:升级包中只包括镜像全量升级相关数据,用于镜像全量升级;
-
差分升级包制作:升级包中只包括镜像差分升级相关数据,用于镜像差分升级;
-
变分区升级包:升级包中包括分区表、镜像全量数据,用于变分区处理和变分区后的镜像恢复。
代码目录
/base/update/packaging_tools ├── lib # 制作升级包工具依赖库目录 ├── blocks_manager.py # BlocksManager类定义,用于block块管理 ├── build_update.py # 差分包制作工具入口代码,入口参数定义 ├── build_pkcs7.py # 升级包签名 ├── create_update_package.py # 升级包制作 ├── gigraph_process.py # 生成Stash,重置ActionList的顺序 ├── image_class.py # 全量镜像、稀疏镜像解析处理 ├── log_exception.py # 全局log系统定义,自定义exception ├── patch_package_process.py # 差分镜像处理,Block差分获取patch差异 ├── script_generator.py # 升级脚本生成器 ├── transfers_manager.py # 创建ActionInfo对象 ├── unpack_update_package.py # 升级包反解 ├── update_package.py # 升级包格式管理、升级包写入 ├── utils.py # Options管理,其他相关功能函数定义 └── vendor_script.py # 厂商升级流程脚本扩展
约束
工具运行环境配置:
-
Ubuntu18.04或更高版本系统;
-
python3.5及以上版本;
-
python库xmltodict, 解析xml文件,需要单独安装;
使用说明
-
bsdiff可执行程序,差分计算,比较生成patch;
-
imgdiff可执行程序,差分计算,针对zip、gz、lz4类型的文件,对比生成patch;
-
e2fsdroid可执行程序,差分计算,用于生成镜像的map文件。
工具参数配置说明:
-h, --help show this help message and exit
-s SOURCE_PACKAGE, --source_package SOURCE_PACKAGE Source package file path.
-nz, --no_zip No zip mode, Output update package without zip.
-pf PARTITION_FILE, --partition_file PARTITION_FILE Variable partition mode, Partition list file path.
-sa {ECC,RSA}, --signing_algorithm {ECC,RSA} The signing algorithm supported by the tool include['ECC', 'RSA'].
-ha {sha256,sha384}, --hash_algorithm {sha256,sha384} The hash algorithm supported by the tool include ['sha256', 'sha384'].
-pk PRIVATE_KEY, --private_key PRIVATE_KEY Private key file path.
3、 升级包制作配置文件说明
1.首先在base\update\packaging_tools目录下,创建文件夹target_package和output_package,target_package目录为新的镜像目录,output_package为升级包输出目录。
2.进入 cd target_package文件夹,创建 mkdir updater_config。
3.进入 cd updater_config 文件夹,
从device\board\hisilicon\hispark_taurus\linux\updater\config路径下,拷贝BOARD.list和VERSION.mbn到base\update\packaging_tools\target_package\updater_config。
从device\board\hisilicon\hispark_taurus\linux\system下拷贝updater_specified_config.xml到base\update\packaging_tools\target_package\updater_config。
3.从out\rk3568\packages\phone\images路径所有文件拷贝至base\update\packaging_tools\target_package。
从out\rk3568\packages\phone\system\bin路径下拷贝文件updater_binary 至base\update\target_package。
4.将文件base\update\updater\test\unittest\test_data\src\rsa_private_key2048.pem拷贝至base\update\packaging_tools下。
文件说明:
BOARD.list:存放当前升级包支持的产品list。
如果product_name是rk3568,请在文件中添加rk3568。
VERSION.mbn:存放当前升级包所支持的版本范围,对应系统参数const.product.software.version。
查询当前设备软件版本,开机后,点击设置,点击关于设备->软件版本,然后添加到文件里面去。
updater_specified_config.xml:分区表文件,结构参考下图:
updater_specified_config.xml 组件配置文件节点说明
信息类别 | 节点名称 | 节点标签 | 是否必填 | 内容说明 |
---|---|---|---|---|
头信息(head节点) | head节点 | / | 必填 | 内容配置为:head info |
info节点 | fileVersion | 必填 | 默认01,4.x新增流式升级,建议填02 | |
info节点 | prdID | 必填 | 保留字段,不影响升级包生成 | |
info节点 | softVersion | 必填 | 软件版本号,即升级包版本号,版本必须在VERSION.mbn范围内 | |
info节点 | date | 必填 | 保留字段,不影响升级包生成 | |
info节点 | time | 必填 | 保留字段,不影响升级包生成 | |
组件信息(group节点) | component节点 | / | 必填 | 要打入升级包的组件/镜像文件的路径,默认为版本包根路径 |
component节点 | compAddr | 必填 | 分区名称,例如:system、vendor等。 | |
component节点 | compId | 必填 | 组件Id,不同组件Id不重复 | |
component节点 | resType | 必填 | 保留字段,不影响升级包生成 | |
component节点 | compType | 必填 | 对应镜像处理方式全量/差分,0为全量处理、1为差分处理。 | |
component节点 | compVer | 必填 | 保留字段,不影响升级包生成 |
4、 制作升级包
在base\update\packaging_tools中配置好升级配置文件,然后在终端执行升级包制作命令。
4.1 全量升级包
#制作全量升级包命令 python3 build_update.py ./target_package/ ./output_package/ -pk ./rsa_private_key2048.pem
制作成功后将在output_package中生成updater_full.zip升级包。
4.2 差分升级包
建议安装依赖环境:pip3 install xmltodict, apt-get install bsdiff, pip3 install imgdiff
制作差分升级包需要在packaging_tools下创建lib目录,将编译结果中的out/oriole/clang_x64/updater/updater/下的diff文件以及out/oriole/clang_x64/thirdparty/e2fsprogs下的 e2fsdroid、libext2_com_err.so、libext2_misc.so、libext2fs.so文件拷贝到lib目录。
创建source_package目录放置原镜像文件。
#使用原镜像制作差分升级包命令 python build_update.py ./target_package ./output_package -s ./source_package -pk ./rsa_private_key2048.pem #原镜像打包成source.zip制作差分升级包命令 python build_update.py ./target_package ./output_package -s ./source.zip -pk ./rsa_private_key2048.pem
制作成功后将在output_package中生成updater_diff.zip升级包。
注意:sd卡升级包制作命令需要加上参数 -sc
5、本地升级验证
正常模式有两个子程序用于操作misc分区。 通过hdc执行write_updater命令向misc分区的update字段写入指令,指令格式参考:write_updater updater /data/update/ota_package/updater.zip,实现代码参考:base/update/updater/utils/write_updater.cpp。 通过hdc执行reboot updater命令,向misc分区的command写入指令,单板会重新启动,重启过程中uboot读取misc分区的命令,从command命令判断当前要进入updater模式,依次加载内核和updater.img,完成从正常模式到updater模式的启动流程。 updater进程启动后读取update字段的命令,获取升级包的路径,单板进入升级流程,直至升级成功重启。
-
进入设备:hdc shell
-
切换到 data 文件夹:cd data
-
新建 updater 目录:mkdir updater
-
退出设备:exit
-
将升级包推送到设备中:hdc file send 本地升级包路径 /data/update/ota_package/updater.zip
-
进入设备:hdc shell
-
输入指令:
write_updater updater /data/update/ota_package/updater.zip #将升级包信息写入misc分区
-
触发升级:
reboot update
升级日志文件:
升级日志文件在升级模式下保存在tmp目录,正常模式在data/updater/log目录
-
升级过程日志文件: data/updater/log/updater_log
-
升级结果标志文件:data/updater/log/updter_result
更多推荐
所有评论(0)