问题描述

在验证OTA功能过程中,通过升级包制作脚本制作了升级包并部署在下载服务器,OTA应用在下载了全量升级包后,重启进入updater模式进行升级,显示升级失败,升级失败时升级进度条进度没有前进。

验证版本

OpenHarmony 4.0 Beta2

预置条件

  1. 开发板烧录项目最新版本代码
  2. 开发板连接能够访问下载服务器的网络
  3. 开发板上运行搜包程序

测试步骤

  1. 解锁开发板进入桌面
  2. 点击桌面的软件更新应用
  3. 在检查到更新版本后点击下载新版本
  4. 下载完成后点击现在安装

问题分析

  • 根据重启开发板后/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日志定位到对应代码。

    函数VerifyPackageSign25行调用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
    
相关文件下载
updater_log.txt
38.56 KB
下载
Logo

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

更多推荐