# åº”ç”¨è§¦å‘æ•°æ®å¤‡ä»½/æ¢å¤ï¼ˆä»…对系统应用开放) 备份æ¢å¤æ¡†æž¶æ˜¯ä¸ºè®¾å¤‡ä¸Šçš„åº”ç”¨ã€æœåŠ¡æä¾›è‡ªèº«æ•°æ®å¤‡ä»½å’Œæ¢å¤çš„解决方案。系统应用开å‘者å¯ä»¥æ ¹æ®éœ€æ±‚,按下述指导开å‘应用,以触å‘备份/æ¢å¤æ•°æ®ã€‚ - [获å–能力文件](#获å–能力文件):获å–当å‰ç³»ç»Ÿç”¨æˆ·å†…所有应用与备份æ¢å¤ç›¸å…³åŸºç¡€ä¿¡æ¯çš„能力文件。能力文件在应用备份/æ¢å¤æ•°æ®æ—¶ä¸å¯ç¼ºå°‘。 - [应用备份数æ®](#应用备份数æ®)ï¼šæ ¹æ®èƒ½åŠ›æ–‡ä»¶æä¾›çš„应用信æ¯ï¼Œé€‰æ‹©éœ€è¦å¤‡ä»½çš„应用数æ®å¹¶è¿›è¡Œå¤‡ä»½ã€‚ - [应用æ¢å¤æ•°æ®](#应用æ¢å¤æ•°æ®)ï¼šæ ¹æ®èƒ½åŠ›æ–‡ä»¶æä¾›çš„应用信æ¯ï¼Œé€‰æ‹©éœ€è¦æ¢å¤çš„应用数æ®å¹¶è¿›è¡Œæ¢å¤ã€‚ ## å¼€å‘说明 备份æ¢å¤API的使用指导请å‚è§[APIå‚考](../reference/apis-core-file-kit/js-apis-file-backup-sys.md)。 在使用备份æ¢å¤æŽ¥å£ä¹‹å‰ï¼Œéœ€è¦ï¼š 1. [申请应用æƒé™](../security/AccessToken/determine-application-mode.md#system_basicç‰çº§åº”用申请æƒé™çš„æ–¹å¼):`ohos.permission.BACKUP` 2. 导入ä¾èµ–模å—:`@ohos.file.backup` ```js import backup from '@ohos.file.backup'; ``` ## 获å–能力文件 获å–当å‰ç³»ç»Ÿç”¨æˆ·å†…所有应用与备份æ¢å¤ç›¸å…³åŸºç¡€ä¿¡æ¯çš„能力文件。能力文件在应用备份æ¢å¤æ•°æ®æ—¶æ˜¯ä¸å¯ç¼ºå°‘的,开å‘者å¯ä»¥æ ¹æ®éœ€è¦èŽ·å–能力文件。 该文件包å«è®¾å¤‡ç±»åž‹ã€è®¾å¤‡ç‰ˆæœ¬ã€åº”用的基础性信æ¯ï¼Œå¦‚应用åç§°ã€åº”用数æ®å¤§å°ã€åº”用版本信æ¯ã€æ˜¯å¦æ”¯æŒå¤‡ä»½æ¢å¤ã€æ˜¯å¦åœ¨æ¢å¤æ—¶å®‰è£…应用。 调用[backup.getLocalCapabilities()](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#backupgetlocalcapabilities)获å–能力文件。 ```ts import backup from '@ohos.file.backup'; import common from '@ohos.app.ability.common'; import fs from '@ohos.file.fs'; import { BusinessError } from '@ohos.base'; // 获å–应用文件路径 let context = getContext(this) as common.UIAbilityContext; let filesDir = context.filesDir; async function getLocalCapabilities(): Promise<void> { try { let fileData = await backup.getLocalCapabilities(); console.info('getLocalCapabilities success'); let fpath = filesDir + '/localCapabilities.json'; fs.copyFileSync(fileData.fd, fpath); fs.closeSync(fileData.fd); } catch (error) { let err: BusinessError = error as BusinessError; console.error('getLocalCapabilities failed with err: ' + JSON.stringify(err)); } } ``` **返回的能力文件内容示例:** | 属性åç§° | æ•°æ®ç±»åž‹ | å¿…å¡« | å«ä¹‰ | | -------------- | -------- | ---- | ---------------------- | | bundleInfos | 数组 | 是 | 应用信æ¯åˆ—表 | | allToBackup | 布尔值 | 是 | 是å¦å…许备份æ¢å¤ | | extensionName | å—符串 | 是 | 应用的扩展å | | name | å—符串 | 是 | 应用的包å | | needToInstall | 布尔值 | 是 | 应用æ¢å¤æ—¶æ˜¯å¦éœ€è¦å®‰è£… | | spaceOccupied | 数值 | 是 | 应用数æ®å ç”¨çš„ç©ºé—´å¤§å° | | versionCode | 数值 | 是 | åº”ç”¨çš„ç‰ˆæœ¬å· | | versionName | å—符串 | 是 | 应用的版本åç§° | | deviceType | å—符串 | 是 | 设备类型 | | systemFullName | å—符串 | 是 | 设备版本 | ```json { "bundleInfos" :[{ "allToBackup" : true, "extensionName" : "BackupExtensionAbility", "name" : "com.example.hiworld", "needToInstall" : false, "spaceOccupied" : 0, "versionCode" : 1000000, "versionName" : "1.0.0" }], "deviceType" : "default", "systemFullName" : "OpenHarmony-4.0.0.0" } ``` ## åº”ç”¨å¤‡ä»½æ•°æ® å¼€å‘者å¯ä»¥æ ¹æ®èƒ½åŠ›æ–‡ä»¶æä¾›çš„应用信æ¯ï¼Œé€‰æ‹©éœ€è¦å¤‡ä»½çš„应用数æ®ã€‚ 备份过程ä¸ï¼Œå¤‡ä»½æ¢å¤æœåŠ¡ä¼šå°†åº”ç”¨çš„æ•°æ®æ‰“åŒ…æˆæ–‡ä»¶ï¼Œæ‰“包åŽçš„æ–‡ä»¶ä¼šä»¥æ‰“å¼€çš„æ–‡ä»¶å¥æŸ„å½¢å¼ï¼Œé€šè¿‡åˆ›å»ºå®žä¾‹æ—¶æ‰€æ³¨å†Œçš„回调[onFileReady](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#onfileready)接å£è¿”回。 å¼€å‘者å¯ä»¥æ ¹æ®éœ€è¦å°†æ–‡ä»¶å†…容ä¿å˜åˆ°æœ¬åœ°ã€‚ **示例** ```ts import backup from '@ohos.file.backup'; import common from '@ohos.app.ability.common'; import fs from '@ohos.file.fs'; import { BusinessError } from '@ohos.base'; // èŽ·å–æ²™ç®±è·¯å¾„ let context = getContext(this) as common.UIAbilityContext; let filesDir = context.filesDir; // 创建SessionBackupç±»çš„å®žä¾‹ç”¨äºŽå¤‡ä»½æ•°æ® let g_session: backup.SessionBackup; function createSessionBackup(): backup.SessionBackup { let generalCallbacks: backup.GeneralCallbacks = { // onFileReady为æœåŠ¡å›žè°ƒç»™åº”ç”¨ä¾§æ•°æ®å®Œæˆçš„通知,建议开å‘者在该接å£å†…ä¸è¦è¿›è¡Œè¿‡å¤šçš„耗时实现,å¯ä»¥é€šè¿‡å¼‚æ¥çº¿ç¨‹å®žçްfile.fdæ•°æ®çš„å¤„ç† onFileReady: (err: BusinessError, file: backup.File) => { if (err) { console.info('onFileReady err: ' + JSON.stringify(err)); } try { let bundlePath = filesDir + '/' + file.bundleName; if (!fs.accessSync(bundlePath)) { fs.mkdirSync(bundlePath); } // æ¤å¤„执行copyFileSyncä¼šå¤šä¸€æ¬¡å†…å˜æ‹·è´ï¼Œå¼€å‘者å¯ä»¥ç›´æŽ¥ä½¿ç”¨onFileReadyçš„file.fdæ¥è¿›è¡Œæ•°æ®å‡ºæ¥ï¼Œå¤„ç†å®ŒæˆåŽcloseå³å¯ï¼Œè¿™æ ·ä¼šå‡å°‘å†…å˜æ¶ˆè€— fs.copyFileSync(file.fd, bundlePath + `/${file.uri}`); fs.closeSync(file.fd); console.info('onFileReady success'); } catch (e) { console.error('onFileReady failed with err: ' + e); } }, onBundleBegin: (err: BusinessError<string|void>, bundleName: string) => { if (err) { console.info('onBundleBegin err: ' + JSON.stringify(err)); } else { console.info('onBundleBegin bundleName: ' + bundleName); } }, onBundleEnd: (err: BusinessError<string|void>, bundleName: string) => { if (err) { console.info('onBundleEnd err: ' + JSON.stringify(err)); } else { console.info('onBundleEnd bundleName: ' + bundleName); } }, onAllBundlesEnd: (err: BusinessError) => { if (err) { console.info('onAllBundlesEnd err: ' + JSON.stringify(err)); } else { console.info('onAllBundlesEnd'); } }, onBackupServiceDied: () => { console.info('onBackupServiceDied'); }, onResultReport: (bundleName: string, result: string) => { console.info('onResultReport bundleName: ' + bundleName); console.info('onResultReport result: ' + result); }, onProcess:(bundleName: string, process: string) => { console.info('onPross bundleName: ' + JSON.stringify(bundleName)); console.info('onPross result: ' + JSON.stringify(process)); } } let sessionBackup = new backup.SessionBackup(generalCallbacks); return sessionBackup; } async function sessionBackup (): Promise<void> { g_session = createSessionBackup(); // æ¤å¤„坿 ¹æ®backup.getLocalCapabilities()æä¾›çš„能力文件,选择需è¦å¤‡ä»½çš„应用 // 也å¯ç›´æŽ¥æ ¹æ®åº”用包å称进行备份 const backupApps: string[] = [ "com.example.hiworld", ] await g_session.appendBundles(backupApps); console.info('appendBundles success'); } ``` ## 应用æ¢å¤æ•°æ® å¼€å‘者å¯ä»¥æ ¹æ®èƒ½åŠ›æ–‡ä»¶æä¾›çš„应用信æ¯ï¼Œé€‰æ‹©éœ€è¦æ¢å¤çš„应用数æ®ã€‚ æ¢å¤è¿‡ç¨‹ä¸ï¼Œå¤‡ä»½æ¢å¤æœåŠ¡ä¼šæ ¹æ®å¼€å‘者调用[getFileHandle](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#getfilehandle)的请求内容,将应用待æ¢å¤æ•°æ®çš„æ–‡ä»¶å¥æŸ„,通过创建实例时注册的回调[onFileReady](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#onfileready)接å£è¿”回。å¯ä»¥æ ¹æ®è¿”回的[uri](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#filemeta)将应用对应的待æ¢å¤æ•°æ®å†™å…¥åˆ°æ–‡ä»¶å¥æŸ„ä¸ã€‚写入完æˆåŽå¼€å‘者调用[publishFile](../reference/apis-core-file-kit/js-apis-file-backup-sys.md#publishfile)通知æœåŠ¡å†™å…¥å®Œæˆã€‚ 待应用所有æ¢å¤æ•°æ®å‡†å¤‡å°±ç»ªåŽï¼ŒæœåС开始æ¢å¤åº”用数æ®ã€‚ **示例** ```ts import backup from '@ohos.file.backup'; import fs from '@ohos.file.fs'; import { BusinessError } from '@ohos.base'; // 创建SessionRestore类的实例用于æ¢å¤æ•°æ® let g_session: backup.SessionRestore; let initMap = new Map<string, number>(); let testFileNum = 123; // 123: åˆå§‹åŒ–文件个数 let testBundleName = 'com.example.myapplication'; // 测试包å initMap.set(testBundleName, testFileNum); let countMap = new Map<string, number>(); countMap.set(testBundleName, 0); // åˆå§‹åŒ–计数 async function publishFile(file: backup.File): Promise<void> { let fileMeta: backup.FileMeta = { bundleName: file.bundleName, uri: '' } await g_session.publishFile(fileMeta); } function createSessionRestore(): backup.SessionRestore { let generalCallbacks: backup.GeneralCallbacks = { onFileReady: (err: BusinessError, file: backup.File) => { if (err) { console.info('onFileReady err: ' + JSON.stringify(err)); } // æ¤å¤„å¼€å‘è€…è¯·æ ¹æ®å®žé™…场景待æ¢å¤æ–‡ä»¶å˜æ”¾ä½ç½®è¿›è¡Œè°ƒæ•´ bundlePath let bundlePath: string = ''; if (!fs.accessSync(bundlePath)) { console.info('onFileReady bundlePath err : ' + bundlePath); } fs.copyFileSync(bundlePath, file.fd); fs.closeSync(file.fd); // æ¢å¤æ•°æ®ä¼ 输完æˆåŽï¼Œä¼šé€šçŸ¥æœåŠ¡ç«¯æ–‡ä»¶å‡†å¤‡å°±ç»ª countMap[file.bundleName]++; if (countMap[file.bundleName] == initMap[file.bundleName]) { // æ¯ä¸ªåŒ…的所有文件收到åŽè§¦å‘publishFile publishFile(file); } console.info('onFileReady success'); }, onBundleBegin: (err: BusinessError<string|void>, bundleName: string) => { if (err) { console.error('onBundleBegin failed with err: ' + JSON.stringify(err)); } console.info('onBundleBegin success'); }, onBundleEnd: (err: BusinessError<string|void>, bundleName: string) => { if (err) { console.error('onBundleEnd failed with err: ' + JSON.stringify(err)); } console.info('onBundleEnd success'); }, onAllBundlesEnd: (err: BusinessError) => { if (err) { console.error('onAllBundlesEnd failed with err: ' + JSON.stringify(err)); } console.info('onAllBundlesEnd success'); }, onBackupServiceDied: () => { console.info('service died'); }, onResultReport: (bundleName: string, result: string) => { console.info('onResultReport bundleName: ' + bundleName); console.info('onResultReport result: ' + result); }, onProcess:(bundleName: string, process: string) => { console.info('onPross bundleName: ' + JSON.stringify(bundleName)); console.info('onPross result: ' + JSON.stringify(process)); } } let sessionRestore = new backup.SessionRestore(generalCallbacks); return sessionRestore; } async function restore01 (): Promise<void> { g_session = createSessionRestore(); const restoreApps: string[] = [ "com.example.hiworld", ] // èƒ½åŠ›æ–‡ä»¶çš„èŽ·å–æ–¹å¼å¯ä»¥æ ¹æ®å¼€å‘者实际场景进行调整。æ¤å¤„仅为请求示例 // å¼€å‘者也å¯ä»¥æ ¹æ®èƒ½åŠ›æ–‡ä»¶å†…å®¹çš„ç»“æž„ç¤ºä¾‹ï¼Œè‡ªè¡Œæž„é€ èƒ½åŠ›æ–‡ä»¶å†…å®¹ let fileData = await backup.getLocalCapabilities(); await g_session.appendBundles(fileData.fd, restoreApps); console.info('appendBundles success'); // æ·»åŠ éœ€è¦æ¢å¤çš„应用æˆåŠŸåŽï¼Œè¯·æ ¹æ®éœ€è¦æ¢å¤çš„应用å称,调用getFileHandle接å£èŽ·å–å¾…æ¢å¤åº”ç”¨æ•°æ–‡ä»¶çš„æ–‡ä»¶å¥æŸ„ // 应用待æ¢å¤æ•°æ®æ–‡ä»¶æ•°è¯·ä¾æ®å®žé™…备份文件个数为准,æ¤å¤„仅为请求示例 let handle: backup.FileMeta = { bundleName: restoreApps[0], uri: "manage.json" } await g_session.getFileHandle(handle); handle.uri = "1.tar"; await g_session.getFileHandle(handle); console.info('getFileHandle success'); } ```