讨论广场 问答详情
OTA本地升级
Double 2025-08-21 17:05:07
472 评论 分享

请教下, OpenHarmony 支持将 OTA 包下载到本地然后通过调用 update.LocalUpdater 的  applyNewVersion 的方法进行升级吗?
我通过 hdc 将 OTA 包拷贝到设备的 /data/updater 目录下,然后通过调用 applyNewVersion 接口进行升级,可以升级成功。  

          this.localUpdater.applyNewVersion([{
            fileType: update.ComponentType.OTA,
            filePath: "/data/updater/updater_full.zip",
          }])

如果我将 OTA 包放到应用目录下(/data/app/el2/0/base/<PackageName>/files) ,上面的 filePath 传入对应的路径,调用 applyNewVersion 时无法正常升级并且提示:updaterkits.cpp 238 : updaterkits: xxxxx/updater_full.zip is not readable。
另外我想请教下,OTA 包有方法可以直接下载到公共目录吗,比如下载到 /data/updater 目录,现在尝试往 data/updater 目录下写会提示13900002 No such file or directory或者无权限。

472 评论 分享
写回答
全部评论(10)

楼主你这个问题解决了吗?遇到同样的问题了

2025-09-13 22:53:16
3 楼

我在ohos4.0上已验证OK,第三方APP可以进行本地升级,(参考https://laval.csdn.net/user/discuss/67e20d0c45a25f3de59ec039)你是在哪个版本环境

就本地升级而言,根据你的现象可以分为几个问题:

1.APP如何将OTA包放在公共目录,如/data/updater?

需要配置沙箱权限/system/etc/sandbox/appdata-sandbox.json,使得APP能访问/data/updater

2.APP如何用/data/updater/*.zip进行本地升级?

参考上述链接demo 代码,与问题1独立开,手动将zip copy到/data/updater。另外如果使用applyNewVersion()接口本地升级,需修改update_service_local_updater.cpp将默认sd卡升级流程改为强制升级模式。

2025-08-22 09:38:27
2025-08-22 15:00:17
引用:“app将文件copy至公共目录,参考https://laval.csdn.net/user/discuss/67eb8bfec6dedb6213c05ff8 需要注意:接口所需权限是否配置,app最好设置为系统应用 沙箱配置参考: "com.xxx.xxx": [ { "sandbox-switch": "ON", "sandb”
我参考上面链接还是不行,app 是系统应用,copy 提示 13900002 - No such file or directory。 下面是我的沙箱配置与拷贝代码。我看设备的 data/sandbox 目录下是有创建 data/updater 目录的
2025-08-22 15:00:17
2025-08-22 11:48:42
引用:“我设备是 dayu200 rk3568,源码 5.1。 示例链接的文档写的很好,很详细,但是在文章最后一步,我看 applyNewVersion() 接口传入的路径是 /data/updater,但是没讲到如何使用非 hdc 的方式将 OTA 包放到 /data/updater 路径下。 配置沙箱权限我之前有试过,可能是我配置有误的原因,我配置后还是不行(不管是直接写,还是从私有目录下 copy ”
app将文件copy至公共目录,参考https://laval.csdn.net/user/discuss/67eb8bfec6dedb6213c05ff8 需要注意:接口所需权限是否配置,app最好设置为系统应用 沙箱配置参考: "com.xxx.xxx": [ { "sandbox-switch": "ON", "sandbox-root": "/mnt/sandbox/", "mount-paths": [ { "src-path": "/data/updater", "sandbox-path": "/data/updater", "sandbox-flags": [ "bind", "rec" ], "check-action-status": "false" }, { "src-path": "/mnt/data/external/Sdcard", "sandbox-path": "/mnt/data/external/Sdcard", "sandbox-flags": [ "bind", "rec" ], "check-action-status": "false" } ], "symbol-links": [] } ],
2025-08-22 11:48:42
2025-08-22 11:14:08
我设备是 dayu200 rk3568,源码 5.1。 示例链接的文档写的很好,很详细,但是在文章最后一步,我看 applyNewVersion() 接口传入的路径是 /data/updater,但是没讲到如何使用非 hdc 的方式将 OTA 包放到 /data/updater 路径下。 配置沙箱权限我之前有试过,可能是我配置有误的原因,我配置后还是不行(不管是直接写,还是从私有目录下 copy 过去都不行,提示 13900002 - No such file or directory),能否麻烦提供一份正确的 data/updater 配置,我是参考 https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-boot-appspawn.md 进行配置,下方是我的配置:
2025-08-22 11:14:08
1 楼

印象里目录应该是 data/update/ota_package/

2025-08-21 17:14:06
2025-08-22 09:32:51
引用:“升级分为本地升级与在线升级,咱目前先别管在线升级。这样理解,我上层应用想自己去实现下载 OTA 包业务(先不用管为啥要自己实现而不用系统的),把 OTA 包下载保存到本地,然后调用 applyNewVersion 接口去做本地升级,目前遇到两个问题: 1、OTA 包无法下载到公共目录,比如无法下载到 /data/updater 目录 2、OTA 包下载到应用的私有目录,调用 applyNewVer”
1.A应用自己用request等下载,默认是下载到自己的应用环境下,如果你要下载到别的公共目录(沙箱环境),需要到sandbox中配置特权。 2.OTA包下载到A应用自有目录,你调用接口applyNewVersion,但实际执行该接口的updateService没有权限访问A应用私有目录。 解决方案: 1.要么你加沙箱权限 下载到公共目录,参考filepicker。 2.或者参考download 接口的updateService服务配置权限,下载到公共目录。 3.或者下载到A应用目录后,使用fs copy一下。
2025-08-22 09:32:51
2025-08-21 20:22:58
引用:“默认下载是到data/update/ota_package/目录啊,你如果是通过下载的download下载 切换存储路径的话,要改updaetService里吧,同时给他沙箱权限才行。 ”
升级分为本地升级与在线升级,咱目前先别管在线升级。这样理解,我上层应用想自己去实现下载 OTA 包业务(先不用管为啥要自己实现而不用系统的),把 OTA 包下载保存到本地,然后调用 applyNewVersion 接口去做本地升级,目前遇到两个问题: 1、OTA 包无法下载到公共目录,比如无法下载到 /data/updater 目录 2、OTA 包下载到应用的私有目录,调用 applyNewVersion 接口又提示 updaterkits.cpp 238 : updaterkits: xxxxx/updater_full.zip is not readable 搞的我本地升级有点两边都走不通的样子,其实我就是想上层应用自己下载 OTA 包后,把 OTA 包放到一个公共目录下,然后调用 applyNewVersion 接口传入该 OTA 包路径可以正常升级成功
2025-08-21 20:22:58
2025-08-21 19:51:14
引用:“我这边目前是本地升级,我将本地 OTA 文件通过 hdc 拷贝到 ota_package 目录然后调用本地升级接口(applyNewVersion)也是提示 xxxxx/updater_full.zip is not readable。 ota_package 我看其他朋友的文章好像是在线升级的目录,我也不确定,我还没实操试过在线升级功能,下面图中也是我看源码的注释”
默认下载是到data/update/ota_package/目录啊,你如果是通过下载的download下载 切换存储路径的话,要改updaetService里吧,同时给他沙箱权限才行。
2025-08-21 19:51:14
2025-08-21 17:28:10
我这边目前是本地升级,我将本地 OTA 文件通过 hdc 拷贝到 ota_package 目录然后调用本地升级接口(applyNewVersion)也是提示 xxxxx/updater_full.zip is not readable。 ota_package 我看其他朋友的文章好像是在线升级的目录,我也不确定,我还没实操试过在线升级功能,下面图中也是我看源码的注释
2025-08-21 17:28:10