openharmony之恢复出厂设置需求总结

在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 分区机制保证失败自动回滚旧系统。
相关推荐
xq95272 小时前
鸿蒙next 获取versionCode和versionName
harmonyos
深海的鲸同学 luvi3 小时前
【HarmonyOS】H5 实现在浏览器中正常跳转 AppLinking 至应用
华为·harmonyos
zhanshuo15 小时前
HarmonyOS 实战:学会在鸿蒙中使用第三方 JavaScript 库(附完整 Demo)
harmonyos
zhanshuo15 小时前
鸿蒙应用权限处理全攻略:从配置到相机拍照,一篇文章讲透
harmonyos
AlbertZein17 小时前
HarmonyOS5 凭什么学鸿蒙—— GetContext
架构·harmonyos
森之鸟20 小时前
flutter项目适配鸿蒙
flutter·华为·harmonyos
奶糖不太甜21 小时前
鸿蒙图片资源加载全攻略:从基础到性能优化
harmonyos·图片资源
小小小小小星1 天前
鸿蒙多端适配开发指南:从入门到实战
harmonyos
鸿蒙小灰1 天前
鸿蒙开发之仿抖音APP教程:方法论与技术探索
harmonyos