이 페이지에서는 자동 백업 및 키/값 백업을 통해 백업 및 복원 작업을 수동으로 트리거하여 앱이 데이터를 올바르게 저장하고 복원하도록 하는 방법을 보여줍니다.
백업 작동 방식
이 섹션에서는 Android 백업 프레임워크의 다양한 요소를 살펴보고 이러한 요소가 자동 백업 및 키/값 백업을 지원하는 앱과 상호작용하는 방식을 설명합니다. 앱 개발 단계에서는 프레임워크 내부 작업의 대부분이 추상화되기 때문에 이 정보를 알 필요가 없었습니다. 하지만 테스트 단계에서는 이러한 개념을 이해하는 것이 중요합니다.
다음 다이어그램은 백업 및 복원 중에 일어나는 데이터 흐름 방식을 보여줍니다.
백업 관리자 서비스는 Android 시스템 서비스로, 백업 및 복원 작업을 조정하고 시작합니다. 이 서비스는 BackupManager
API를 통해서 액세스할 수 있습니다.
백업 작업 중에 이 서비스는 앱에 백업 데이터를 쿼리한 후 데이터를 보관처리하는 백업 전송에 전달합니다. 복원 작업 중 백업 관리자 서비스는 백업 데이터를 백업 전송에서 가져와서 기기에 복원합니다.
백업 전송은 백업을 저장하고 가져오는 Android 구성요소입니다. Android 기기에는 0개 이상의 백업 전송이 있을 수 있지만 이러한 전송 중 하나만 활성 상태로 표시될 수 있습니다. 사용 가능한 백업 전송은 기기 제조업체 및 서비스 제공업체의 맞춤설정에 따라 기기마다 다를 수 있지만, 대부분의 Google Play 지원 기기는 다음 전송과 함께 출시됩니다.
- Google 전송(기본값) - 대부분의 기기에서 활성화된 백업 전송이며 Google 모바일 서비스의 일부입니다. 이 문서에서는 사용자가 Google 전송을 사용한다고 가정합니다. 이 전송은 사용자 Google 드라이브 계정의 비공개 폴더에 자동 백업 데이터를 저장합니다. 키/값 백업 데이터는 Android Backup Service에 저장됩니다.
- 로컬 전송 - 기기에 로컬로 백업 데이터를 저장합니다. 이 전송은 일반적으로 개발/디버깅 목적으로 사용되며 실제 환경에서는 유용하지 않습니다.
기기에 백업 전송이 없으면 데이터를 백업할 수 없습니다. 앱이 부정적인 영향을 받지는 않습니다.
주의: 백업 전송은 기기마다 다를 수 있으므로 Android는 백업을 사용하는 동안 데이터의 보안을 보장할 수 없습니다. 백업을 사용하여 사용자 이름 및 비밀번호와 같은 민감한 정보를 저장할 때는 주의해야 합니다.
기본 요건
백업 및 복원 작업을 테스트하려면 다음 도구에 관해 약간은 알아야 합니다.
기기 또는 에뮬레이터 준비
다음 체크리스트를 검토하여 백업 테스트를 위한 기기 또는 에뮬레이터를 준비합니다.
- 자동 백업의 경우 Android 6.0(API 수준 23) 이상을 실행하는 기기 또는 에뮬레이터를 사용 중인지 확인합니다.
- 키/값 백업의 경우 Android 2.2(API 수준 8) 이상을 실행하는 기기 또는 에뮬레이터를 사용 중인지 확인합니다.
- 기기 또는 에뮬레이터에서 백업 및 복원이 사용 설정되었으며 Google 계정이 추가되었는지 확인합니다. 다음 두 가지 방법으로 확인할 수 있습니다.
- 기기 버전에 따라 설정 > 백업 및 복원으로 이동하거나 화면 상단의 검색창에서 백업을 검색하면 됩니다.
- adb 셸에서
bmgr enabled
를 실행합니다.
실제 기기에서 백업 및 복원은 일반적으로 초기 설정 마법사에서 사용 설정됩니다. 에뮬레이터는 설정 마법사를 실행하지 않으므로 기기 설정에서 백업을 사용 설정하고 백업 계정을 지정하는 것을 잊지 말아야 합니다.
- 다음 명령어를 실행하여 Google 백업 전송이 사용할 수 있고 활성화되어 있는지 확인합니다.
adb shell bmgr list transports
그런 다음, 콘솔에서 다음 출력을 확인합니다.
android/com.android.internal.backup.LocalTransport * com.google.android.gms/.backup.BackupTransportService
Google Play가 없는 실제 기기 및 Google API가 없는 에뮬레이터에는 Google 백업 전송이 포함되어 있지 않을 수 있습니다. 이 문서에서는 Google 백업 전송을 사용 중인 것으로 가정합니다. 다른 백업 전송을 사용하여 백업 및 복원을 테스트할 수 있지만, 절차와 출력은 다를 수 있습니다.
백업 테스트
앱의 백업을 시작하려면 다음 명령어를 실행합니다.
adb shell bmgr backupnow <PACKAGE>
backupnow
명령어는 Android 7.0 이상을 실행하는 기기 및 에뮬레이터에서 사용 가능합니다. 이 명령어는 패키지의 매니페스트 선언에 따라 키/값 백업 또는 자동 백업을 실행합니다. 백업 절차의 출력을 확인하려면 logcat을 살펴봅니다. 예를 들면 다음과 같습니다.
D/BackupManagerService: fullTransportBackup() I/GmsBackupTransport: Attempt to do full backup on <PACKAGE> ---- or ---- V/BackupManagerService: Scheduling immediate backup pass D/PerformBackupTask: starting key/value Backup of BackupRequest{pkg=<PACKAGE>}
기기에서 backupnow
명령어를 사용할 수 없다면 자동 백업 또는 키/값 백업을 위해 아래 단계를 완료합니다.
자동 백업의 경우 다음 단계를 완료합니다.
- 다음 명령어를 실행합니다.
adb shell bmgr backup @pm@ && adb shell bmgr run
- 다음의 출력이 나오는지
adb logcat
을 모니터링하여 이전 단계의 명령어가 끝날 때까지 기다립니다.I/BackupManagerService: K/V backup pass finished.
- 다음 명령어를 실행하여 전체 백업을 실행합니다.
adb shell bmgr fullbackup <PACKAGE>
참고: fullbackup
명령어는 앱이 키/값 백업을 구현하더라도 전체 백업을 실행하도록 강제합니다. 시스템은 앱의 백업 구성을 무시하고 android:fullBackupOnly
속성이 true로 설정된 것처럼 작동합니다.
키/값 백업의 경우 다음 단계에 따라 백업을 예약하고 실행합니다.
- 마지막 백업 이후로 앱이
BackupManager.dataChanged()
를 호출하지 않았다면 다음 명령어를 실행하여 테스트 목적으로 백업 작업에 앱을 포함할 수 있습니다.adb shell bmgr backup <PACKAGE>
- 그런 다음, 아래 명령어를 실행하여 백업을 트리거할 수 있습니다.
adb shell bmgr run
bmgr backup
은 앱을 백업 관리자의 큐에 추가합니다.
bmgr run
은 백업 작업을 시작하여 백업 관리자가 큐에 있는 모든 백업 요청을 실행하도록 강제합니다.
키/값 백업을 테스트할 때 모든 환경설정 변경에서 백업을 예약하는지 확인해야 합니다. 다음 방법 중 하나를 사용하여 백업이 예약되었는지 확인할 수 있습니다.
adb shell dumpsys backup
을 실행하고 앱이Pending key/value backup
아래 명령어의 출력에 나열되어 있는지 확인합니다.- 백업을 예약할 때 메시지를 로깅합니다. 그런 다음,
adb logcat
을 실행하고 명령어의 출력을 확인하여 백업이 예약되었는지 확인할 수 있습니다.
복원 테스트
수동으로 복원을 시작하려면 백업 토큰을 사용하여 다음 명령어를 실행합니다(아래의 백업 토큰을 가져오는 방법 참고).
adb shell bmgr restore <TOKEN> <PACKAGE>
백업 토큰을 조회하려면 adb shell dumpsys backup
을 실행합니다. 토큰은 Ancestral:
및 Current:
라벨 뒤에 오는 16진수 문자열입니다. Ancestral 토큰은 처음에 기기 설정 마법사를 사용하여 기기가 설정되었을 때 기기를 복원하는 데 사용되었던 백업 데이터 세트를 나타냅니다. Current 토큰은 기기의 현재 백업 데이터 세트(기기가 현재 백업 데이터를 전송하고 있는 대상 데이터 세트)를 나타냅니다.
그런 다음, 복원 절차의 출력을 확인하려면 logcat을 살펴봅니다. 예를 들면 다음과 같습니다.
V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683 ... I/BackupManagerService: Restore complete.
adb
또는 Google Play 스토어 앱을 사용하여 앱을 제거했다가 다시 설치하는 방식으로 앱의 자동 복원을 테스트할 수 있습니다.
문제 해결
이 섹션은 몇 가지 일반적인 문제를 해결하는 데 도움이 됩니다.
전송 할당량 초과
Logcat에 다음 메시지가 표시되는 경우
I/PFTBT: Transport rejected backup of <PACKAGE>, skipping --- or --- I/PFTBT: Transport quota exceeded for package: <PACKAGE>
앱이 할당량을 초과했습니다. 백업 데이터양을 줄이고 다시 시도해 보세요. 예를 들어 앱의 캐시 디렉터리에서만 데이터를 캐싱하고 있는지 확인하세요. 캐시 디렉터리는 백업에 포함되지 않습니다.
전체 백업이 가능하지 않음
Logcat에 다음 메시지가 표시되는 경우
I/BackupManagerService: Full backup not currently possible -- key/value backup not yet run?
기기에서 아직 키/값 백업 작업이 발생하지 않았기 때문에 전체 백업 작업이 실패했습니다. bmgr run
명령어를 사용하여 키/값 백업을 트리거한 후 다시 시도해 보세요.
에이전트 대기 시간 초과
Logcat에 다음 메시지가 표시되는 경우
12-05 18:59:02.033 1910 2251 D BackupManagerService: awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package} 12-05 18:59:12.117 1910 2251 W BackupManagerService: Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package} 12-05 18:59:12.117 1910 2251 W BackupManagerService: Can't find backup agent for com.your.app.package
백업을 위해 앱이 실행되는 데 10초 넘게 걸립니다. 로그 출력의 타임스탬프 차이를 확인하세요. 이 오류는 일반적으로 앱에서 ProGuard 없이 멀티덱스 구성을 사용할 때 발생합니다.
초기화되지 않은 백업 계정
Logcat에 다음 메시지가 표시되는 경우
01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for an uninitialized backup account. 01-31 14:32:45.699 1043 18255 W PFTBT: Transport failed; aborting backup: -1001 01-31 14:32:45.699 1043 18255 I PFTBT: Full backup completed with status: -1000
백업 데이터 세트가 초기화되지 않아 백업이 취소되었습니다.
adb shell bmgr run
명령어를 사용하여 백업 관리자를 실행한 후 백업을 다시 실행해 보세요.
앱 메서드가 호출되지 않음
자동 백업은 Application
의 기본 클래스를 사용하여 앱을 시작하기 때문에 앱의 설정 메서드가 호출되지 않을 수 있습니다. 자동 백업은 앱의 어떤 활동도 시작하지 않으므로 앱이 활동에서 설정하면 오류가 표시될 수 있습니다. 자세한 내용은 BackupAgent 구현을 참고하세요.
반면, 키/값 백업은 앱 매니페스트 파일에 선언한 Application
서브클래스를 사용하여 앱을 시작합니다.