OpenHarmony4.0 OTA升级Demo

文章目录

  • 一、环境配置
  • 二、前言
  • 三、准备update.zip
    • [3.1 准备初始系统版本](#3.1 准备初始系统版本)
    • [3.2 待升级系统版本添加差异](#3.2 待升级系统版本添加差异)
    • [3.3 制作全量update.zip包](#3.3 制作全量update.zip包)
    • [3.4 手动验证update.zip](#3.4 手动验证update.zip)
    • [3.5 回退初始系统版本,并确认TAG](#3.5 回退初始系统版本,并确认TAG)
  • 四、需求实现
    • [4.1 设计思路](#4.1 设计思路)
    • [4.2 升级应用Demo开发](#4.2 升级应用Demo开发)
    • [4.3 系统代码修改](#4.3 系统代码修改)
      • [4.3.1 沙箱配置](#4.3.1 沙箱配置)
      • [4.3.2 修改SELinux模式](#4.3.2 修改SELinux模式)
      • [4.3.3 /data分区默认权限修改](#4.3.3 /data分区默认权限修改)
      • [4.3.4 修改localUpdater.applyNewVersion()接口默认升级模式](#4.3.4 修改localUpdater.applyNewVersion()接口默认升级模式)
    • [4.4 验证](#4.4 验证)
      • 4.4.1修改权限隐私弹框TAG信息到初始状态
      • [4.4.2 编译源码并烧录](#4.4.2 编译源码并烧录)
      • [4.4.3 确认系统状态信息](#4.4.3 确认系统状态信息)
      • [4.4.4 安装升级Demo](#4.4.4 安装升级Demo)
      • [4.4.5 拷贝OTA全量包至Demo沙箱路径](#4.4.5 拷贝OTA全量包至Demo沙箱路径)
      • [4.4.6 启动升级](#4.4.6 启动升级)
      • [4.4.7 确认升级结果](#4.4.7 确认升级结果)
    • [4.5 可能遇到的问题及解决方案](#4.5 可能遇到的问题及解决方案)
  • 五、效果展示
  • 六、总结

一、环境配置

  • 系统版本:OpenHarmony 4.0 Release(4.0.10.13)
  • 平台设备:DAYU200 RK3568

二、前言

通过OTA功能实现远程对设备软件升级更新,极大的提高的设备软件的稳定性、可维护性和扩展性。OTA升级功能大体可分为两步:

  • Step1:设备向服务器发起升级请求、版本校验等,从服务器下载升级包(如update.zip)到设备本地
  • Step2:设备使用update.zip进行本地升级,通过为recovery升级或AB升级。由于4.0 暂不支持AB升级,默认使用recovery升级模式。
    本文侧重实现Step2,即开发Demo应用将update.zip包进行本地全量升级

三、准备update.zip

3.1 准备初始系统版本

为了验证update.zip升级生效,需添加差异,方便对比验证。

修改权限隐私弹框TAG信息applications\standard\permission_manager\permissionmanager\src\main\ets\ServiceExtAbility\ServiceExtAbility.ts:

复制代码
# 基础软件预埋差异
-const TAG = 'PermissionManager_Log: ';
+const TAG = 'PermissionManager_Log: Base ';
const BG_COLOR = '#00000000';

源码全编译,更新rk3568镜像并做备份(防止编译被覆盖)

复制代码
./build.sh -p rk3568

打开音乐APP,出现弹框时,可见下列打印:

(ps:源码编译参考OpenHarmony 4.0 Release源码下载、编译及烧录)

复制代码
> hdc shell
$ hilog | grep "PermissionManager_Log"
#打开桌面音乐APP,弹出用户授权弹框
A03d00/JSAPP: PermissionManager_Log: Base ServiceExtensionAbility onCreate, ability name is com.ohos.permissionmanager.GrantAbility
A03d00/JSAPP: PermissionManager_Log: Base ServiceExtensionAbility onRequest. start id is 1
...

备份初始版本镜像至本地out/rk3568/packages/phone/images,便于回退到初始版本状态

3.2 待升级系统版本添加差异

接下来为带升级系统版本添加差异:

同样修改权限隐私弹框TAG信息applications\standard\permission_manager\permissionmanager\src\main\ets\ServiceExtAbility\ServiceExtAbility.ts:

复制代码
# 待升级软件预埋差异
-const TAG = 'PermissionManager_Log: ';
+const TAG = 'PermissionManager_Log: Updated ';
const BG_COLOR = '#00000000';

全量编译更新镜像文件

复制代码
./build.sh -p rk3568

3.3 制作全量update.zip包

更多有关OpenHarmony OTA升级资讯可参考:OpenHarmony 4.0 本地OTA升级

  • 安装必要的工具包

    sudo apt update sudo apt upgrade
    sudo apt install bsdiff sudo pip install xmltodict asn1crypto imgdiff cryptography e2fsdroid

  • 拷贝生成的1镜像文件out/rk3568/packages/phone/images、2私钥rsa_private_key2048.pem、3二进制升级文件updater_binary至base/update/packaging_tools/target_package

    #进入 源码base/update/packaging_tools/升级包制作目录
    OpenHarmony_4.0_release$ cd base/update/packaging_tools/

    #1.拷贝生成的镜像文件至target_package
    packaging_tools$ cp -rf ../../../out/rk3568/packages/phone/images ./target_package

    #2.拷贝rsa_private_key2048.pem至target_package
    packaging_tools$ cp -rf ../../../base/update/updater/test/unittest/test_data/src/rsa_private_key2048.pem ./target_package

    #3.拷贝updater_binary至target_package
    packaging_tools$ cp -rf ../../../out/rk3568/packages/phone/system/bin/updater_binary ./target_package

  • 拷贝1升级包支持的产品列表BOARD.list、2升级包所支持的版本范围VERSION.mbn和3升级组件配置文件updater_specified_config.xml至target_package/updater_config文件夹

    #创建target_package/updater_config文件夹
    packaging_tools$ mkdir ./target_package/updater_config

    #1.拷贝BOARD.list至target_package/updater_config文件夹
    packaging_tools$ cp -rf ../../../device/board/hisilicon/hispark_taurus/linux/updater/config/BOARD.list ./target_package/updater_config

    #2.拷贝VERSION.mbn至target_package/updater_config文件夹
    packaging_tools$ cp -rf ../../../device/board/hisilicon/hispark_taurus/linux/updater/config/VERSION.mbn ./target_package/updater_config

    #3.拷贝updater_specified_config.xml至target_package/updater_config文件夹
    packaging_tools$ cp -rf ../../../device/board/hisilicon/hispark_taurus/linux/system/updater_specified_config.xml ./target_package/updater_config

  • 拷贝公钥signing_cert.crt至sign_cert文件夹至base/update/packaging_tools/sign_cert

    #创建证书文件夹
    packaging_tools$ mkdir sign_cert

    #拷贝证书文件
    packaging_tools$ cp -rf ../../../base/update/updater/test/unittest/test_data/src/signing_cert.crt ./sign_cert/

  • 创建output_package文件夹用于保存生成的全量包update.zip

    packaging_tools$ mkdir output_package

即packaging_tools下准备好目录和文件

复制代码
packaging_tools$ tree
.
├── ...
├── output_package
├── sign_cert
│   └── signing_cert.crt
├── target_package
│   ├── boot_linux.img
│   ├── chip_prod.img
│   ├── config.cfg
│   ├── eng_system.img
│   ├── MiniLoaderAll.bin
│   ├── parameter.txt
│   ├── ramdisk.img
│   ├── resource.img
│   ├── rsa_private_key2048.pem
│   ├── sys_prod.img
│   ├── system.img
│   ├── uboot.img
│   ├── updater
│   ├── updater_binary
│   ├── updater_config
│   │   ├── BOARD.list
│   │   ├── updater_specified_config.xml
│   │   └── VERSION.mbn
│   ├── updater.img
│   ├── userdata.img
│   └── vendor.img
├── ...
  • 修改updater_config、BOARD.list和VERSION.mbn

    #修改BOARD.list,添加一行"RK3568",内容如下:
    HI3516
    HI3518
    HI3559
    RK3568

    #修改updater_specified_config.xml:1、修改fileVersion为2;2、softVersion改为当前软件版本;3、compType改为0,表示全量(1 表示增量);4、修改compVer为1.0;5、修改img打包路径,/vendor.img 和./system.img,具体内容如下

    <?xml version="1.0"?> <package> <head name="Component header information"> <info fileVersion="02" prdID="123456" softVersion="OpenHarmony 4.0.10.13" date="2021-03-11" time="12:30">head info</info> </head> <group name = "Component information"> <component compAddr="vendor" compId="12" resType="05" compType="0" compVer="1.0">./vendor.img</component> <component compAddr="system" compId="18" resType="05" compType="0" compVer="1.0">./system.img</component> </group> </package>

    #修改VERSION.mbn与系统设置应用的软件版本保持一致内容如下
    OpenHarmony 4.0.10.13

  • 制作OTA全量包update.zip

    packaging_tools$ python3 build_update.py ./target_package/ ./output_package/ -pk ./target_package/rsa_private_key2048.pem
    2025-09-25 17:38:42 INFO : VERSION.mbn file parsing complete! path: ./target_package/updater_config/VERSION.mbn
    2025-09-25 17:38:42 INFO : BOARD.list file parsing complete! path: ./target_package/updater_config/BOARD.list
    2025-09-25 17:38:42 INFO : XML file parsing completed!
    2025-09-25 17:38:42 INFO : []
    2025-09-25 17:38:43 INFO : Image vendor full processing completed
    2025-09-25 17:38:46 INFO : Image system full processing completed
    2025-09-25 17:38:46 INFO : All full image processing completed! image count: 2
    2025-09-25 17:38:46 INFO : Get hash content success! path: ./target_package/updater_config/VERSION.mbn
    2025-09-25 17:38:46 INFO : Get hash content success! path: ./target_package/updater_config/BOARD.list
    2025-09-25 17:38:47 INFO : Get hash content success! path: /home/xxx/OpenHarmony_4.0_release/base/update/packaging_tools/target_package/full_imagevendorgxd312je
    2025-09-25 17:38:55 INFO : Get hash content success! path: /home/xxx/OpenHarmony_4.0_release/base/update/packaging_tools/target_package/full_imagesystemjidiuzg0
    2025-09-25 17:38:55 INFO : Write package header complete
    2025-09-25 17:38:55 INFO : Add component b'/version_list'
    2025-09-25 17:38:55 INFO : component information StartOffset:180
    2025-09-25 17:38:55 INFO : Add component b'/board_list'
    2025-09-25 17:38:55 INFO : component information StartOffset:267
    2025-09-25 17:38:55 INFO : Add component b'/vendor'
    2025-09-25 17:38:55 INFO : component information StartOffset:354
    2025-09-25 17:38:55 INFO : Add component b'/system'
    2025-09-25 17:38:55 INFO : component information StartOffset:441
    2025-09-25 17:38:55 INFO : Write hashdata sign tlv complete
    2025-09-25 17:38:55 INFO : .bin package header signing success! SignOffset: 806
    2025-09-25 17:38:55 INFO : Add component to package StartOffset:806
    2025-09-25 17:38:55 INFO : Write component complete ComponentSize:21
    2025-09-25 17:38:55 INFO : Add component to package StartOffset:827
    2025-09-25 17:38:55 INFO : Write component complete ComponentSize:30
    2025-09-25 17:38:55 INFO : Add component to package StartOffset:857
    2025-09-25 17:38:56 INFO : Write component complete ComponentSize:268431360
    2025-09-25 17:38:56 INFO : Add component to package StartOffset:268432217
    2025-09-25 17:38:58 INFO : Write component complete ComponentSize:1610608640
    2025-09-25 17:38:58 INFO : Write update package complete
    2025-09-25 17:38:58 INFO : Create update package .bin complete! path: /home/xxx/OpenHarmony_4.0_release/base/update/packaging_tools/output_package/update_bin-6xzakjrf
    2025-09-25 17:38:58 INFO : Verse-script.us generation complete!
    2025-09-25 17:38:58 INFO : loadScript.us generation complete!
    2025-09-25 17:38:58 INFO : []
    2025-09-25 17:39:42 INFO : []
    2025-09-25 17:39:44 INFO : Resource cleaning completed!

得到全量包:base/update/packaging_tools/output_package/updater_full.zip

3.4 手动验证update.zip

为了确保后续APP升级顺利,有必要手动验证update.zip包的是否能升级正常。

将制作好的全量包updater_full.zip放入设备,并设置reboot模式

复制代码
> hdc file send xxx\OHOS\OpenHarmony_v4.0_Release\OTA_Package\output_package\updater_full.zip /data/updater/updater.zip
FileTransfer finish, Size:315251542, File count = 1, time:35248ms rate:8943.81kB/s

> hdc shell
# write_updater updater /data/updater/updater.zip 
# reboot updater

升级完成自动重启后,检查预埋TAG是否已更新 PermissionManager_Log: Updated

复制代码
> hdc shell "hilog | grep PermissionManager_Log"
#打开桌面音乐APP,弹出用户授权弹框
A03d00/JSAPP: PermissionManager_Log: Updated ServiceExtensionAbility onCreate, ability name is com.ohos.permissionmanager.GrantAbility
A03d00/JSAPP: PermissionManager_Log: Updated ServiceExtensionAbility onRequest. start id is 1
...

注意:若升级失败,1.根据以上步骤详细检查OTA全量包制作流程 2.导出/data/updater/log/updater_log并分析报错原因

3.5 回退初始系统版本,并确认TAG

OTA全量包升级验证完后,仍需要重复验证,需使用RKDevTool烧录回退到初始系统版本

回退后确认TAG是否与初始版本一致 PermissionManager_Log: Base

复制代码
> hdc shell
$ hilog | grep "PermissionManager_Log"
#打开桌面音乐APP,弹出用户授权弹框
A03d00/JSAPP: PermissionManager_Log: Base ServiceExtensionAbility onCreate, ability name is com.ohos.permissionmanager.GrantAbility
A03d00/JSAPP: PermissionManager_Log: Base ServiceExtensionAbility onRequest. start id is 1
...

四、需求实现

在手动确认OTA包能正常升级后,可以开始升级应用Demo开发

4.1 设计思路

  • 手动将OTA拷贝至应用沙箱路径,以模拟应用完成OTA包下载业务 (沙箱目录资料参考:应用沙箱目录)
  • Demo应用将OTA包从沙箱目录拷贝至公共OTA升级目录/data/updater
  • Demo应用调用升级接口,启动OTA全量升级
  • 但由于系统沙箱机制、升级机制原因,需要对系统配置和代码进行相关修改,Demo应用才能顺利完成OTA升级

4.2 升级应用Demo开发

OTA升级Demo应用详细设计思路:

  • 检测OTA包源文件是否存在
  • 检测OTA目标路径是否有效
  • OTA全量包从源路径拷贝至目标路径
  • 伪升级进度显示
  • 启动升级

完整Demo源码和hap:myOtaDemo

关键源码解析
entry/src/main/utils/Util.ts

复制代码
//fs.access()检测文件或目录是否存在
public static async isFileExist(filePath: string): Promise<boolean> {
   ...
    let result: boolean = false
    //检查文件是否存在
    await fs.access(filePath).then((res: boolean) => {
      result = res
     ...
    }).catch((err: BusinessError) => {
      console.error("access failed with error message: " + err.message + ", error code: " + err.code)
    });
    console.info("isFileExist result:" + result)
    return result
  }

entry/src/main/ets/pages/Index.ets

复制代码
			...
			//fs.copyFileSync()从应用沙箱拷贝OTA全量升级包至/data/updater/
              try {
                fs.copyFileSync(SRC_PATH, DES_PATH, 0);
                console.info("copy ota package to " + DES_PATH + " successfully")
                ...
              } catch (err) {
                console.error("copy ota package [" + SRC_PATH + "] to [" + DES_PATH + "] failed:" + err)
                ...
              }
  
  //开始OTA升级,localUpdater.applyNewVersion()进行升级
  async startOtaUpgrade() {
    console.info("startOtaUpgrade is called, path:" + DES_PATH)
    let armUpgradeConfig: otaUpdate.UpgradeFile = {
      fileType: otaUpdate.ComponentType.OTA, // OTA包
      filePath: DES_PATH // 本地升级包路径
    };

    let armUpgradeConfigArr: Array<otaUpdate.UpgradeFile> = [ armUpgradeConfig ]
    try {
      let localUpdater: otaUpdate.LocalUpdater = otaUpdate.getLocalUpdater()
      await localUpdater.applyNewVersion(armUpgradeConfigArr).then(() => {
        console.info(`arm upgrade success`); 
      }).catch((err: BusinessError) => {
        console.error(`applyNewVersion error ${JSON.stringify(err)}`)
      })
    } catch(error) {
      console.error(`Fail to get localUpdater error: ${error}`)
    };
  }

应用权限配置

  • Demo应用最好设为系统应用
    sdk\10\toolchains\lib\UnsgnedReleasedProfileTemplate.json
    修改apl为system_core,修改app-feature为hos_system_app,并重新签名应用
    (关于UnsgnedReleasedProfileTemplate.json配置可参考:签名配置模板)

    "bundle-info":{
    ...
    "bundle-name":"com.example.myotademo",
    "apl":"system_core",
    "app-feature":"hos_system_app"
    },

  • 配置module.json5,请求ohos.permission.UPDATE_SYSTEM权限
    localUpdater.applyNewVersion()接口需要ohos.permission.UPDATE_SYSTEM权限,因此需要配置module.json5

    复制代码
      "abilities": [
        ...
      ],
      "requestPermissions": [
        {
          "name": 'ohos.permission.UPDATE_SYSTEM'
        }
      ]

到这里应用的开发告一段落,但还无法进行OTA升级,由于系统沙箱机制、SELinux机制能原因,无法访问data分区。还需要进行下文4.3系统代码修改和调试

4.3 系统代码修改

由于系统沙箱及linux权限等机制的限制,需要修改有关OpenHamrony源码

4.3.1 沙箱配置

调试修改,可直接修改copy设备appdata-sandbox.json文件至本地,修改后替换设备appdata-sandbox.json

(appdata-sandbox.json源码路径:base/startup/appspawn/appdata-sandbox.json)

关于appdata-sandbox.json配置可参考:沙盒配置appdata-sandbox.json

  • 临时调试方法如下:

    #导出设备沙箱配置文件至本地桌面
    hdc shell mount -o remount,rw / ; hdc file recv /system/etc/sandbox/appdata-sandbox.json C:\Users\Desktop\

    #appdata-sandbox.json添加Demo升级应用配置
    #在individual下复制com.huawei.ohos.hiviewx配置,并修改包名、src-path、sandbox-path和check-action-status
    "individual": [
    {
    "com.huawei.ohos.hiviewx": [
    {
    ...
    ],
    "com.example.myotademo": [
    {
    "sandbox-switch": "ON",
    "sandbox-root": "/mnt/sandbox/<PackageName>",
    "mount-paths": [
    {
    "src-path": "/data/updater",
    "sandbox-path": "/data/updater",
    "sandbox-flags": [
    "bind",
    "rec"
    ],
    "check-action-status": "false"
    }
    ],
    "symbol-links": []
    }
    ],
    ...
    }

    #替换设备/system/etc/sandbox/appdata-sandbox.json,重启生效
    hdc shell mount -o remount,rw / ; hdc file send C:\Users\xxx\Desktop\appdata-sandbox.json /system/etc/sandbox/appdata-sandbox.json
    hdc shell reboot

4.3.2 修改SELinux模式

OpenHarmony 4.0 Release默认SELinux模式为Enforcing(1),需修改为Permissive(0),否则应用无法将沙箱路径升级包拷贝至/data目录

复制代码
# 查看SELinux模式
hdc shell getenforce
Enforcing
#临时设置SELinux模式为Permissive,重启复位
hdc shell setenforce 0

源码修改:base/security/selinux_adapter/selinux.gni

复制代码
...
declare_args() {
-  selinux_enforce = true
+  selinux_enforce = false
}

4.3.3 /data分区默认权限修改

需要修改/data分区权限,否则Demo应用无法访问/data目录

复制代码
#临时修改
hdc shell mount -o remount,rw / 
hdc shell
chmod -R 777 /data/updater

源码修改:base/update/sys_installer/frameworks/ipc_server/etc/sys_installer_sa.cfg

复制代码
            "cmds" : [
                ...
-               "mkdir /data/updater 0775 update update",
+               "mkdir /data/updater 0777 update update",
                "chown update update /data/updater",
-               "chmod 0775 /data/updater",
+               "chmod 0777 /data/updater",
                ...
            ]

4.3.4 修改localUpdater.applyNewVersion()接口默认升级模式

(laval社区issue:修改localUpdater.applyNewVersion()接口默认升级模式)

localUpdater.applyNewVersion()默认走RebootAndInstallSdcardPackage(),即SD卡本地升级模式,因此不会用到/data/updater/update.zip

修改原因:localUpdater.applyNewVersion()默认走RebootAndInstallSdcardPackage(),无法使用/data/updater/update.zip

源码修改:base\update\updateservice\services\engine\src\update_service_local_updater.cpp

复制代码
int32_t UpdateServiceLocalUpdater::ApplyNewVersion(const UpgradeInfo &info, const std::string &miscFile,
    const std::string &packageName, BusinessError &businessError)
{
 	...
    //修改sd卡升级流程为强制升级
    //int32_t ret = RebootAndInstallSdcardPackage(miscFile, packageNames) ? INT_CALL_SUCCESS : INT_CALL_FAIL;
    int32_t ret = RebootAndInstallUpgradePackage(miscFile, packageNames) ? INT_CALL_SUCCESS : INT_CALL_FAIL;
    ...
#endif
}

模块编译临时验证
注意: 32bit系统替换至system/lib,64bit系统替换至system/lib64

复制代码
## 模块化编译updateservice
./build.sh -p rk3568 --build-target base/update/updateservice:update_service
hdc shell mount -o remount,rw /;hdc file send xxx\out\rk3568\updater\update_service\libupdateservice.z.so system/lib/libupdateservice.z.so

(更多模块编译参考:OpenHarmony模块化编译)

4.4 验证

完成上述4.3修改后可通过hdc命令使得修改临时生效也可以全编译后烧录镜像(记得TAG修改为初始版本)

4.4.1修改权限隐私弹框TAG信息到初始状态

applications\standard\permission_manager\permissionmanager\src\main\ets\ServiceExtAbility\ServiceExtAbility.ts:

复制代码
# 基础软件预埋差异
-const TAG = 'PermissionManager_Log: ';
+const TAG = 'PermissionManager_Log: Base ';
const BG_COLOR = '#00000000';

4.4.2 编译源码并烧录

复制代码
#全量编译
./build.sh -p rk3568

4.4.3 确认系统状态信息

在升级前检查之前修改是否已生效

复制代码
#1、检查权限隐私弹框TAG
> hdc shell
$ hilog | grep "PermissionManager_Log"
#打开桌面音乐APP,弹出用户授权弹框
A03d00/JSAPP: PermissionManager_Log: Base 

#2、检查沙箱配置/system/etc/sandbox/appdata-sandbox.json
> hdc shell
$ cat /system/etc/sandbox/appdata-sandbox.json | grep myotademo
      "com.example.myotademo": [

#3、检查SELinux状态
hdc shell "getenforce"
Permissive

#4、检查/data/updater/目录权限
hdc shell mount -o remount,rw / ; hdc shell "ls -al /data"
...
drwxrwxrwx  3 update     update    3488 2017-08-05 18:05 updater

4.4.4 安装升级Demo

4.4.5 拷贝OTA全量包至Demo沙箱路径

复制代码
hdc file send xxx\base\update\packaging_tools\output_package\updater_full.zip  /data/app/el2/100/base/com.example.myotademo/haps/entry/files/update.zip

4.4.6 启动升级

Demo应用中选择Start Ota Upgrade启动升级,进度条100% 3s后自动关机进入升级模式,升级完成后自动重启

4.4.7 确认升级结果

升级完成自动重启后,检查预埋TAG是否已更新 PermissionManager_Log: Updated

复制代码
> hdc shell "hilog | grep PermissionManager_Log"
#打开桌面音乐APP,弹出用户授权弹框
A03d00/JSAPP: PermissionManager_Log: Updated ServiceExtensionAbility onCreate, ability name is com.ohos.permissionmanager.GrantAbility
A03d00/JSAPP: PermissionManager_Log: Updated ServiceExtensionAbility onRequest. start id is 1
...

4.5 可能遇到的问题及解决方案

  • 未找到OTA全量包源文件

    • OTA包存放目录错误: 应用沙箱路径/data/storage/el2/base/haps/对应设备绝对路径/data/app/el2/100/base/com.example.myotademo/haps/ 因此不可把OTA包直接存放至设备"沙箱路径"

    • Demo应用重装后,应用沙箱的OTA全量包会被删除,需要手动重新copy

      复制代码
      #检查应用存放OTA包沙箱路径是否存储OTA包
      hdc shell "ls -al /data/app/el2/100/base/com.example.myotademo/haps/entry/files"
      ...
      -rw-r--r-- 1 root     root     381611807 2017-08-05 22:13 update.zip  # 此时存在
      
      #若未找到update.zip,需重新手动copy
      hdc file send \base\update\packaging_tools\output_package\updater_full.zip   /data/app/el2/100/base/com.example.myotademo/haps/entry/files/update.zip
  • 未找到OTA目标路径 :

    • 确认/data/updater目录是否存在

      复制代码
      # 检查/data/updater目录
      hdc shell "ls -al /data/updater"

      updater目录不存在,则可手动创建,并设置好权限和组

      复制代码
      hdc shell
      chmod -R 777 /data/updater
      chown update:update /data/updater
    • 沙箱配置权限限制
      /data/updater目录存在,而Demo应用无法找到,则因为系统沙箱机制,原则上应用只允许访问自己的沙箱目录,因此需要修改沙箱配置文件,使得应用有权限访问设备公共目录
      修改并替换沙箱配置文件/system/etc/sandbox/appdata-sandbox.json

      复制代码
      #导出设备沙箱配置文件至本地桌面
      hdc shell mount -o remount,rw / ; hdc file recv /system/etc/sandbox/appdata-sandbox.json  C:\Users\\Desktop\
      #appdata-sandbox.json添加配置
      
      #替换设备/system/etc/sandbox/appdata-sandbox.json,重启生效
  • OTA拷贝失败
    OTA包从应用沙箱拷贝至/data/updater/失败,可见如下报错:

    复制代码
    C04388/file_api                com.examp...yotademo  E     [copy_file.cpp:43->IsAllPath] Failed to copy file, error code: 13
    A03d00/JSAPP                   com.examp...yotademo  E     copy arm package failed:Error: Permission denied

    可能原因:

    • 应用权限:参考前文,修改sdk\10\toolchains\lib\UnsgnedReleasedProfileTemplate.json配置demo应用为系统应用。

    • data分区权限不够:关闭selinux

      hdc shell
      setenforce 0

五、效果展示

OTA Demo启动本地升级

本地升级完成自动重启

六、总结

Congratulations~✌ 通过本文,你已基本掌握:

  • OpenHarmony全量包的制作方法
  • OpenHarmony 实现应用升级OTA包
  • OpenHarmony 应用升级OTA包的一般修改及常见问题处理

接下来就可以基于OpenHarmony源码进行更多开发创作了~

了解更多关于OpenHarmony文章↩

相关推荐
关键帧Keyframe13 小时前
AI 换脸不用上传服务器也行?FaceXSwap 这款 App 在手机上离线处理,效果却比云端还强!视频、GIF 动图、照片还都支持!
app·aigc·sora
iOS阿玮2 天前
分享一个4.3(a)瓜,一个操作毁了公司3个月的成果。
uni-app·app·apple
撬动未来的支点2 天前
算起计算器APP发布
app
前行的小黑炭2 天前
Android Compose :初步了解一下生命周期,对比原生android
android·kotlin·app
ZFJ_张福杰3 天前
【Flutter】APP的数据安全(基于Flutter 交易所APP的总结)
flutter·web3·区块链·app·交易所
前行的小黑炭4 天前
Compose页面切换的几种方式:Navigation、NavigationBar+HorizontalPager,会导致LaunchedEffect执行?
android·kotlin·app
前行的小黑炭4 天前
Android :Comnpose各种副作用的使用
android·kotlin·app
行墨8 天前
深入CoordinatorLayout原理与分析(一)基本使用篇
app
AscendKing10 天前
使用 HBuilderX 将网页打包为安卓 APP详细步骤
app·网页做成app·网页转app