在OpenHarmony系统中,恢复出厂设置(也称为"恢复工厂默认设置")是一种将设备恢复到初始状态的操作,通常用于解决系统故障、清除用户数据或重置设备。
恢复出厂设置的作用
清除用户数据:删除所有用户安装的应用、设置、个人文件(如照片、文档等)。
重置系统设置:将系统参数恢复到出厂时的默认值(如网络设置、语言、时区等)。
修复系统问题:解决因软件冲突、系统卡顿或配置错误导致的问题。
系统版本不变:恢复出厂设置不会更改系统版本,仅清除用户数据
1. 思维导图

2. 源码坐标
| 功能 | 路径 | 关键符号 | 行号 | 备注 |
|---|---|---|---|---|
| 统一 C++ 入口 | base/update/ota_service/src/factory_reset.cpp |
FactoryReset::resetToFactory() |
45-55 | 仅作合法性检查 + 写标志 |
| JS ArkTS 封装 | base/update/ota_service/js/napi/factory_reset_napi.cpp |
napi_factory_reset() |
28-36 | 透调到 C++ |
| 终端脚本 | base/update/updater/tools/write_updater.cpp |
main() |
60-70 | 写 /misc/boot/mode |
| 擦除脚本 | base/update/updater/scripts/updater-script |
erase_userdata() |
120-130 | 调用 blockdev --wipe |
| 白名单列表 | vendor/xxx/etc/factory_reset_keep.json |
纯文本 | 无行号 | 每行一个保留路径 |
bash
方式1:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; #导入abilityAccessCtrl
async function factoryReset() {
try {
let atManager = abilityAccessCtrl.createAtManager();
await atManager.reset('factory');
console.log('恢复出厂设置初始化成功');
} catch (err) {
console.error(`恢复出厂设置错误: ${err.code}, ${err.message}`);
}
}
方式2:
使用文件系统操作
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';
async function customFactoryReset() {
try {
// 1. 删除用户数据分区
await fs.rmdir('/data/user');
// 2. 恢复系统配置文件
await fs.copy('/system/etc/factory_defaults', '/data');
// 3. 重启设备
let power = await import('@ohos.power');
power.reboot('factory-reset');
} catch (err) {
console.error(`Custom factory reset failed: ${(err as BusinessError).message}`);
}
}
方式3:擦除系统数据和重启系统的方式
#include "reset_service.h"
void FactoryReset(struct HdfDeviceObject *device)
{
// 擦除user分区
BlockErase("/dev/block/by-name/userdata");
// 恢复出厂分区
BlockRestore("/dev/block/by-name/factory");
// 重启系统
SystemReboot();
}
3. 终端命令
bash
# 1 连接设备
hdc shell
# 2 写入标志
write_updater user_factory_reset
# 3 重启到 updater
reboot updater
该种方式原理就是重置用户数据,实际代码可以使用如下方式来实现恢复出厂设置:
import { childProcess } from '@ohos.process';
async function FactoryReset() {
try {
let cmd = 'reset factory';
let result = await childProcess.execute(cmd);
console.log(`Factory reset command executed: ${result.exitCode}`);
} catch (err) {
console.error(`Execute factory reset failed: ${err.code}, ${err.message}`);
}
}
执行后 90 s 内完成擦除并自动重启到开机向导。
4. 参数与文件
| 文件 | 作用 | 示例内容 |
|---|---|---|
/misc/boot/mode |
重启模式标志 | user_factory_reset |
/system/etc/factory_reset_keep.list |
保留路径白名单 | /data/vendor/camera/calibration.dat |
/system/etc/updater-script |
擦除脚本 | erase("/dev/block/by-name/userdata") |
ohos.permission.FACTORY_RESET |
权限声明 | 系统应用必须申请 |
5. 需求定制思路
| 需求 | 修改点 | 验证方法 |
|---|---|---|
| 保留相机校准 | 在 factory_reset_keep.list 追加 /data/vendor/camera/* |
恢复后 ls /data/vendor/camera 文件存在 |
| 禁止低电量重置 | 在 FactoryReset::resetToFactory() 加 if (soc < 15) return ERR_LOW_BATTERY; |
返回错误码 2001 |
| 重置前云备份 | 在 updater-script 前插入 exec /system/bin/cloud_backup.sh |
日志出现 cloud_backup_success |
| 重置后自动 OTA | 在 updater-script 最后加 exec /system/bin/ota_client |
日志出现 ota_start |
| 双分区回滚 | 保持 AB 分区,失败自动回滚 |
getprop ro.boot.slot_suffix 切换 |
| 重置后首次开机向导 | 无需修改,系统默认 | 出现 com.ohos.setupwizard |
| 重置后自动激活 | 在 updater-script 最后加 exec /system/bin/auto_activate |
日志出现 activate_success |
| 重置后自动注册 | 在 updater-script 最后加 exec /system/bin/auto_register |
日志出现 register_success |
| 重置后保留蓝牙配对 | 在 factory_reset_keep.list 追加 /data/misc/bluedroid/* |
蓝牙自动连接 |
| 重置后保留 Wi-Fi 配置 | 在 factory_reset_keep.list 追加 /data/misc/wifi/* |
Wi-Fi 自动连接 |
| 重置后保留输入法词库 | 在 factory_reset_keep.list 追加 /data/user/0/com.inputmethod/dict |
输入法词库保留 |
| 重置后保留企业证书 | 在 factory_reset_keep.list 追加 /data/misc/keystore/* |
证书不丢失 |
6. 验证脚本
bash
#!/bin/bash
set -e
echo "=== 1 备份相机校准 ==="
# OpenHarmony相机校准路径通常为/data/service/el0/camera
hdc shell "tar -czf /data/service/el0/camera_backup.tgz -C /data/service/el0/camera ."
echo "=== 2 触发重置 ==="
# OpenHarmony专用重置命令(需要系统权限)
hdc shell "param set persist.sys.factory.reset 1"
hdc shell "reboot recovery" # 进入恢复模式执行重置
echo "=== 3 等待重启 ==="
# 增加重试机制和超时检测
timeout=300
elapsed=0
while [ $elapsed -lt $timeout ]; do
if hdc shell getprop | grep -q 'sys.boot_completed=1'; then
break
fi
sleep 5
elapsed=$((elapsed+5))
done
if [ $elapsed -ge $timeout ]; then
echo "错误:设备未在${timeout}秒内完成启动"
exit 1
fi
echo "=== 4 验证保留文件 ==="
# OpenHarmony相机校准文件验证(支持多目录检测)
hdc shell "ls /data/service/el0/camera | grep -E 'calibration|cam_cal'"
echo "=== 5 验证重置成功 ==="
# 检查OpenHarmony专用重置标志
if hdc shell getparam | grep -q 'factory.reset.mode=1'; then
echo "PASS: 恢复出厂设置验证成功"
else
echo "FAIL: 未检测到重置标志"
exit 1
fi
7. 注意事项
- 权限 :仅系统应用可声明
ohos.permission.FACTORY_RESET。 - 数据 :
/data与/cache默认全擦;白名单文件除外。 - 升级 :
updater-script随 OTA 更新,可热修复。 - 回滚:AB 分区机制保证失败自动回滚旧系统。