一、备份框架:数据安全的「底层基建」🏗️
核心原理
- 沙箱隔离:每个应用拥有独立备份目录,数据按
应用包名
隔离存储
- 自动触发:系统在应用卸载、OTA升级、设备迁移时自动启动备份/恢复
- 版本兼容:支持跨版本(如HarmonyOS 3→Next)的数据平滑迁移
备份目录结构
/data/storage/el1/base/.backup/restore/
├── app/ # 应用数据(如用户设置、数据库)
│ └── com.example.app/
│ ├── data.db # 数据库文件
│ └── config.json
└── user/ # 用户文件(如图片、文档)
└── com.example.app/
└── photos/
└── 202406_trip.jpg
关键场景
场景 | 触发条件 | 核心动作 |
应用卸载 | 用户卸载应用时 | 自动备份沙箱数据到恢复目录 |
设备OTA升级 | 系统检测到新版本待安装 | 先备份数据,升级后恢复 |
跨设备迁移 | 用户启用「数据迁移」功能 | 加密传输备份数据至新设备 |
二、BackupExtensionAbility:自定义备份的「大脑」🧠
核心生命周期方法
import { BackupExtensionAbility, BundleVersion } from '@ohos.backup';
export default class MyBackupAbility extends BackupExtensionAbility {
// 备份逻辑(如压缩数据、加密存储)
async onBackup() {
// 1. 收集需要备份的文件列表
const files = ['data.db', 'settings.json'];
// 2. 压缩并加密数据
await compressAndEncrypt(files, 'backup.tar.gz');
// 3. 保存到系统备份目录
await this.saveToBackupDir('backup.tar.gz');
}
// 恢复逻辑(如校验文件、数据迁移)
async onRestore(targetVersion: BundleVersion) {
// 1. 检查备份文件完整性
const isValid = await verifyBackupFile('backup.tar.gz');
if (!isValid) return;
// 2. 解密并解压数据
await decryptAndExtract('backup.tar.gz', this.appSandboxDir);
// 3. 处理版本兼容性(如旧数据格式转换)
if (targetVersion < '1.2.0') {
await migrateLegacyData();
}
}
}
版本兼容策略
// 根据目标版本号执行不同恢复逻辑
onRestore(targetVersion: BundleVersion) {
switch (targetVersion.name) {
case '1.0.0':
// 从HarmonyOS 3迁移时,重命名数据库字段
renameDbField('old_field', 'new_field');
break;
case '2.0.0':
// 从HarmonyOS Next Beta迁移时,升级加密算法
upgradeEncryption();
break;
}
}
三、安全与性能优化:备份的「双重保障」🛡️
1. 数据安全设计
- 加密存储:
- import { crypto } from ‘@ohos.security’;
async function encryptData(data: Buffer, key: string) {
const cipher = await crypto.createCipher(‘AES-256-CBC’, key);
return cipher.update(data, ‘binary’, ‘base64’);
}
- **权限控制**:
- 备份目录默认仅应用自身可读写,其他应用需申请`ohos.permission.READ_BACKUP_DATA`权限(需华为审核)
### 2. 性能优化技巧
- **增量备份**:仅备份变化的数据(需记录文件哈希值)
- ```typescript
- // 对比文件哈希,仅备份修改过的文件
- const changedFiles = getChangedFiles(previousHash, currentHash);
- await backupFiles(changedFiles);
- ```
- - **异步处理**:在`onBackup`中使用`setTimeout`或`requestIdleCallback`避免阻塞主线程
- ```typescript
- onBackup() {
- requestIdleCallback(async () => {
- await heavyBackupTask(); // 耗时操作放在空闲时段执行
- });
- }
- ```
### 3. 常见错误处理
| 错误类型 | 原因分析 | 解决方案 |
|--------------------|------------------------------|---------------------------|
| 备份失败 | 存储空间不足 | 提示用户清理空间 |
| 恢复后数据异常 | 备份文件损坏 | 校验文件完整性,提供默认数据|
| 跨版本兼容性问题 | 旧版本数据格式不兼容 | 添加版本迁移逻辑 |
## 四、实战场景:电商App的数据迁移方案📱
### 场景描述
用户从旧手机迁移数据到新鸿蒙设备,需同步:
- 购物车商品(数据库数据)
- - 收藏的图片(用户文件)
- - 支付密码(敏感数据)
### 实现步骤
1. **备份阶段**:
2. ```typescript
3. onBackup() {
4. // 备份数据库
5. backupDbFile('shopping_cart.db');
6. // 压缩并加密图片
7. compressUserPhotos('收藏夹/', 'photos.tar.gz');
8. // 单独加密敏感数据
9. encryptSensitiveData('payment_password', 'encrypted_key');
10. }
11. ```
2. **恢复阶段**:
3. ```typescript
4. onRestore() {
5. // 先恢复数据库
6. restoreDbFile('shopping_cart.db');
7. // 再解密用户文件
8. decryptAndExtract('photos.tar.gz', '用户/收藏夹/');
9. // 最后加载敏感数据(需用户二次验证)
10. if (await verifyUser()) {
11. loadEncryptedData('payment_password');
12. }
13. }
14. ```
## 五、避坑指南⚠️
### 1. 避免备份无效数据
- ❌ 勿备份临时文件(如缓存图片)
- - ✅ 仅备份用户生成的关键数据(如订单记录、自定义设置)
### 2. 处理跨设备差异
```typescript
// 根据设备类型调整备份策略
const deviceType = await getDeviceType();
if (deviceType === 'wearable') {
// 手表存储小,仅备份核心数据
backupCoreDataOnly();
} else {
// 手机/平板备份完整数据
backupFullData();
}
3. 测试流程规范
- 模拟应用卸载→重装,验证数据完整恢复
- 跨设备迁移测试(如手机→平板)
- 极端场景测试:备份时断电、存储空间不足
总结:数据备份「三原则」
- 安全第一:敏感数据必加密,权限控制必严格
- 效率优先:增量备份+异步处理,减少用户等待
- 兼容完备:版本迁移逻辑清晰,适配多设备场景