文章目录
- 一、环境配置
- 二、前言
- 三、准备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源码进行更多开发创作了~