【求助】OTA升级功能验证过程中,出现升级包异常导致升级失败。
·
问题描述
在验证OTA
功能过程中,通过升级包制作脚本制作了升级包并部署在下载服务器,OTA
应用在下载了全量升级包后,重启进入updater
模式进行升级,显示升级失败,升级失败时升级进度条进度没有前进。
验证版本
OpenHarmony 4.0 Beta2
预置条件
- 开发板烧录项目最新版本代码
- 开发板连接能够访问下载服务器的网络
- 开发板上运行搜包程序
测试步骤
- 解锁开发板进入桌面
- 点击桌面的软件更新应用
- 在检查到更新版本后点击下载新版本
- 下载完成后点击现在安装
问题分析
-
根据重启开发板后
/data/updater/log/updater_log
文件中的日志,定位到首次出错位置为memcmp failed
。10-13 03:16:26.153 Updater 241 D callback_manager.cpp 81 : register OnLabelResetEvt for pageId: menu comId: FactoryRst_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnLabelResetEvt for pageId: menu comId: FactoryRstNormal_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnRebootEvt for pageId: menu comId: Reboot_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnRebootEvt for pageId: menu comId: RebootDevice_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnMenuShutdownEvt for pageId: menu:normal comId: Shutdown_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnLabelCancelEvt for pageId: confirm comId: Cancel_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnLabelSDCardNoDelayEvt for pageId: menu:normal comId: SdUpdate_Button succeed 10-13 03:16:26.154 Updater 241 D callback_manager.cpp 81 : register OnConfirmRstEvt for pageId: confirm comId: Reset_Button succeed 10-13 03:16:26.155 Updater 241 D callback_manager.cpp 81 : register OnRebootEvt for pageId: upd comId: FailReboot_Button succeed 10-13 03:16:26.155 Updater 241 D callback_manager.cpp 97 : register key action listerner succeed 10-13 03:16:27.157 Updater 241 I input_event.cpp 113 : hdf devType:0, devIndex:1 10-13 03:16:27.159 Updater 241 I input_event.cpp 113 : hdf devType:1, devIndex:2 10-13 03:16:27.160 Updater 241 I input_event.cpp 126 : add InputDevice done 10-13 03:16:27.170 Updater 241 I updater_main.cpp 315 : start to update packages, start index:0 10-13 03:16:27.171 Updater 241 I utils.cpp 577 : updater mode 10-13 03:16:27.172 Updater 241 D mount.cpp 105 : Umount for path /system 10-13 03:16:27.173 Updater 241 D mount.cpp 105 : Umount for path /eng_system 10-13 03:16:27.174 Updater 241 D mount.cpp 202 : Mount for path /oempriv 10-13 03:16:27.176 Updater 241 D mount.cpp 105 : Umount for path /vendor 10-13 03:16:27.178 Updater 241 D mount.cpp 202 : Mount for path /data 10-13 03:16:27.449 Updater 241 I updater_main.cpp 328 : deleate last upgrade file 10-13 03:16:27.449 Updater 241 I updater_main.cpp 151 : Verify packages start... 10-13 03:16:27.452 Updater 241 I updater_main.cpp 162 : Verify package:/data/update/ota_package/firmware/versions/updater_full.zip 10-13 03:16:27.466 Updater 241 E pkcs7_signed_data.cpp 284 : Pkcs7VerifyHelper in 10-13 03:16:27.469 Updater 241 I pkcs7_signed_data.cpp 111 : p7sourceData check success 10-13 03:16:31.909 Updater 241 E pkg_verify_util.cpp 145 : calculated hash: ?滅I V?A讙4卜[-P吷phI【聮繨T啤, respond hash: 鰂桥毙0Lw稒磗,誄?H0紝? 10-13 03:16:31.909 Updater 241 E pkg_verify_util.cpp 146 : Failed to memcmp data. 10-13 03:16:31.910 Updater 241 E dump.h 44 : 107 10-13 03:16:33.417 Updater 241 I pkg_zipfile.cpp 186 : LoadPackage /data/update/ota_package/firmware/versions/updater_full.zip :544065539 10-13 03:16:33.418 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 541966821 unpackedSize: 2078219008 offset header: 0 data: 60 update.bin 10-13 03:16:33.418 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 2095925 unpackedSize: 2099585 offset header: 541966881 data: 541966926 build_tools.zip 10-13 03:16:33.418 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 23 unpackedSize: 21 offset header: 544062851 data: 544062893 version_list 10-13 03:16:33.418 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 10 unpackedSize: 8 offset header: 544062916 data: 544062956 board_list 10-13 03:16:33.420 Updater 241 I pkg_pkgfile.cpp 71 : ExtractFile /data/updater/build_tools.zip.tmp 10-13 03:16:33.432 Updater 241 I pkg_zipfile.cpp 659 : packedSize: 2095925 unpackedSize: 2099585 offset header: 541966881 data: 541966926 10-13 03:16:33.432 Updater 241 I pkg_zipfile.cpp 186 : LoadPackage /data/updater/build_tools.zip.tmp :2099585 10-13 03:16:33.432 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 71 unpackedSize: 81 offset header: 0 data: 45 Verse-script.us 10-13 03:16:33.432 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 2097388 unpackedSize: 3874688 offset header: 116 data: 160 updater_binary 10-13 03:16:33.432 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 31 unpackedSize: 33 offset header: 2097548 data: 2097591 loadScript.us 10-13 03:16:33.433 Updater 241 I pkg_zipfile.cpp 720 : packedSize: 1653 unpackedSize: 2195 offset header: 2097622 data: 2097668 hash_signed_data 10-13 03:16:33.433 Updater 241 I pkg_pkgfile.cpp 71 : ExtractFile board_list 10-13 03:16:33.434 Updater 241 I pkg_zipfile.cpp 659 : packedSize: 10 unpackedSize: 8 offset header: 544062916 data: 544062956 10-13 03:16:33.435 Updater 241 E updater_main.cpp 141 : Version Check Fail! 10-13 03:16:33.435 Updater 241 E dump.h 44 : -1 10-13 03:16:33.435 Updater 241 I updater_ui_facade.cpp 230 : clear all log label's text
-
通过
log
日志定位到对应代码。函数
VerifyPackageSign
在25
行调用HashCheck
函数。int32_t PkgVerifyUtil::VerifyPackageSign(const PkgStreamPtr pkgStream) const { if (pkgStream == nullptr) { UPDATER_LAST_WORD(PKG_INVALID_PARAM); return PKG_INVALID_PARAM; } size_t signatureSize = 0; std::vector<uint8_t> signature; uint16_t commentTotalLenAll = 0; if (GetSignature(pkgStream, signatureSize, signature, commentTotalLenAll) != PKG_SUCCESS) { PKG_LOGE("get package signature fail!"); UPDATER_LAST_WORD(PKG_INVALID_SIGNATURE); return PKG_INVALID_SIGNATURE; } std::vector<uint8_t> hash; int32_t ret = Pkcs7verify(signature, hash); if (ret != PKG_SUCCESS) { PKG_LOGE("pkcs7 verify fail!"); UPDATER_LAST_WORD(ret); return ret; } size_t srcDataLen = pkgStream->GetFileLength() - commentTotalLenAll - 2; ret = HashCheck(pkgStream, srcDataLen, hash); if (ret != PKG_SUCCESS) { srcDataLen = pkgStream->GetFileLength() - signatureSize - ZIP_EOCD_FIXED_PART_LEN; ret = HashCheck(pkgStream, srcDataLen, hash); } return ret; }
HashCheck
函数在24
行执行出错。int32_t PkgVerifyUtil::HashCheck(const PkgStreamPtr srcData, const size_t dataLen, const std::vector<uint8_t> &hash) const { Updater::UPDATER_INIT_RECORD; if (srcData == nullptr || dataLen == 0) { UPDATER_LAST_WORD(PKG_INVALID_PARAM); return PKG_INVALID_PARAM; } size_t digestLen = hash.size(); if (digestLen != PKG_HASH_CONTENT_LEN) { PKG_LOGE("calc pkg sha256 digest failed."); UPDATER_LAST_WORD(PKG_INVALID_PARAM); return PKG_INVALID_PARAM; } std::vector<uint8_t> sourceDigest(digestLen); int32_t ret = CalcSha256Digest(srcData, dataLen, sourceDigest); if (ret != PKG_SUCCESS) { PKG_LOGE("calc pkg sha256 digest failed."); UPDATER_LAST_WORD(ret); return ret; } if (memcmp(hash.data(), sourceDigest.data(), digestLen) != EOK) { PKG_LOGE("calculated hash: %s, respond hash: %s", hash.data(), sourceDigest.data()); PKG_LOGE("Failed to memcmp data."); UPDATER_LAST_WORD(PKG_INVALID_DIGEST); return PKG_INVALID_DIGEST; } return PKG_SUCCESS; }
据此推测升级失败直接原因为计算出的升级包摘要值不符合程序要求。
-
确认下载到开发板内的升级包
md5
值。开发板内计算升级包摘要值。
# md5sum updater_full.zip ea09dae7b0f21b4eab61052fb9d3ee5a updater_full.zip
主机计算升级包摘要值。
PS> openssl md5 updater_full.zip MD5(.\updater_full.zip)= ea09dae7b0f21b4eab61052fb9d3ee5a
确定摘要值相同。
-
确认签名升级包的证书已经传入开发板。
PS> hdc file send signing_cert.crt /data/update/ota_package/
-
制作升级包时
updater_config
文件夹中文件的内容。BOARD.list
RK3568
updater_specified_config.xml
<?xml version="1.0"?> <package> <head name="Component header information"> <info fileVersion="01" prdID="rk3568" softVersion="4.0.9.6" date="2023-08-11" time="10:23">head info</info> </head> <group name = "Component information"> <component compAddr="uboot" compId="1" resType="05" compType="0" compVer="1.0">uboot.img</component> <component compAddr="resource" compId="3" resType="05" compType="0" compVer="1.0">resource.img</component> <component compAddr="boot_linux" compId="4" resType="05" compType="0" compVer="1.0">boot_linux.img</component> <component compAddr="ramdisk" compId="5" resType="05" compType="0" compVer="1.0">ramdisk.img</component> <component compAddr="system" compId="6" resType="05" compType="0" compVer="1.0">system.img</component> <component compAddr="vendor" compId="7" resType="05" compType="0" compVer="1.0">vendor.img</component> <component compAddr="sys-prod" compId="8" resType="05" compType="0" compVer="1.0">sys_prod.img</component> <component compAddr="chip-prod" compId="9" resType="05" compType="0" compVer="1.0">chip_prod.img</component> <component compAddr="updater" compId="10" resType="05" compType="0" compVer="1.0">updater.img</component> </group> </package>
VERSION.mbn
OpenHarmony 4.0.9.6
更多推荐
所有评论(0)