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字段的命令,获取升级包的路径,单板进入升级流程,直至升级成功重启。

  1. 进入设备:hdc shell

  2. 切换到 data 文件夹:cd data

  3. 新建 updater 目录:mkdir updater

  4. 退出设备:exit

  5. 将升级包推送到设备中:hdc file send 本地升级包路径 /data/update/ota_package/updater.zip

  6. 进入设备:hdc shell

  7. 输入指令:

    write_updater updater /data/update/ota_package/updater.zip #将升级包信息写入misc分区

  8. 触发升级:

    reboot update

     

升级日志文件:

升级日志文件在升级模式下保存在tmp目录,正常模式在data/updater/log目录

  1. 升级过程日志文件: data/updater/log/updater_log

  2. 升级结果标志文件:data/updater/log/updter_result

     

 

 

Logo

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

更多推荐