백업 및 복원 테스트

이 페이지에서는 자동 백업키/값 백업으로 백업 및 복원 작업을 수동으로 트리거하여 앱이 데이터를 올바르게 저장하고 복원했는지 확인하는 방법을 보여줍니다.

백업 작동 방식

이 섹션에서는 Android 백업 프레임워크의 다양한 요소와 요소들이 자동 백업 및 키/값 백업을 지원하는 앱과 상호작용하는 방법을 설명합니다. 앱 개발 단계에서는 프레임워크 내부 작업의 대부분이 추상화되기 때문에 이 정보를 알 필요가 없었습니다. 하지만 테스트 단계에서는 이러한 개념을 이해하는 것이 중요합니다.

다음 다이어그램은 백업 및 복원 중에 일어나는 데이터 흐름 방식을 보여줍니다.백업 프레임워크

백업 관리자 서비스는 Android 시스템 서비스이며 백업 및 복원 작업을 조정하고 시작합니다. 서비스는 BackupManager API를 통해서 액세스할 수 있습니다. 백업 작업 중에 서비스는 앱에 백업 데이터를 쿼리하고 그런 다음 데이터를 보관하는 백업 전송에 전달합니다. 복원 작업 중 백업 관리자 서비스는 백업 데이터를 백업 전송에서 가져와서 기기에 복원합니다.

백업 전송은 백업 저장 및 회수를 담당하는 Android 구성요소입니다. Android 기기는 0 개 이상의 백업 전송을 가질 수 있지만, 전송 중 하나만 활성 상태로 표시될 수 있습니다. 사용 가능한 백업 전송은 기기 제조업체 및 서비스 제공업체의 맞춤설정에 따라 기기마다 다를 수 있지만, 대부분의 Google Play 지원 기기는 다음과 같은 전송을 제공합니다.

  • Google 전송(기본값) - 대부분의 기기에서 활성화된 백업 전송이며 Google 모바일 서비스의 일부입니다. 이 문서는 사용자가 Google 전송을 사용한다고 가정합니다. 이 전송은 사용자의 Google 드라이브 계정의 비공개 폴더에 자동 백업 데이터를 저장합니다. 키/값 백업 데이터는 Android Backup Service에 저장됩니다.
  • 로컬 전송 - 기기에 로컬로 백업 데이터를 저장합니다. 이 전송은 일반적으로 개발/디버깅 목적으로 사용되며 실제 환경에서는 유용하지 않습니다.

기기에 백업 전송이 없으면 데이터를 백업할 수 없습니다. 앱에 부정적인 영향을 미치지는 않습니다.

주의: 백업 전송은 기기마다 다를 수 있으므로 Android는 백업을 사용하는 동안 데이터의 보안을 보장할 수 없습니다. 백업을 사용하여 사용자 이름 및 비밀번호와 같은 민감한 정보를 저장할 때는 주의해야 합니다.

기본 요건

백업 및 복원 작업을 테스트하려면 다음 도구를 알아야 합니다.

  • adb - 기기 또는 에뮬레이터에서 명령어 실행
  • bmgr - 다양한 백업 및 복원 작업 실행
  • logcat - 백업 및 복원 작업의 출력 확인

기기 또는 에뮬레이터 준비

다음 체크리스트를 검토하여 백업 테스트를 위한 기기 또는 에뮬레이터를 준비합니다.

  • 자동 백업의 경우 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 이상을 실행하는 기기 및 에뮬레이터에서 사용 가능합니다. 이 명령어는 패키지의 manifest 선언에 따라 키/값 백업 또는 자동 백업을 실행합니다. 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 명령어를 기기에서 사용할 수 없다면 자동 백업 또는 키/값 백업을 위해 아래 단계를 완료합니다.

자동 백업의 경우 다음 단계를 완료하세요.

  1. 다음 명령어를 실행합니다.
        adb shell bmgr backup @pm@ && adb shell bmgr run
        
  2. 다음의 출력이 나오는지 adb logcat을 모니터링하여 이전 단계의 명령어가 끝날 때까지 기다립니다.
        I/BackupManagerService: K/V backup pass finished.
        
  3. 다음 명령어를 실행하여 전체 백업을 실행합니다.
        adb shell bmgr fullbackup <PACKAGE>
        

참고: fullbackup 명령어는 앱이 키/값 백업을 구현하더라도 전체 백업을 실행하도록 강제합니다. 시스템은 앱의 백업 구성을 무시하고 android:fullBackupOnly 속성이 참으로 설정된 것처럼 작동합니다.

키/값 백업의 경우 다음 단계에 따라 백업을 예약하고 실행합니다.

  1. 마지막 백업 이후로 앱이 BackupManager.dataChanged()를 호출하지 않았다면 다음 명령어를 실행하여 테스트 목적으로 백업 작업에 앱을 포함할 수 있습니다.
        adb shell bmgr backup <PACKAGE>
        
  2. 그런 다음 아래 명령어를 실행하여 백업을 트리거할 수 있습니다.
        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 토큰은 처음에 기기 설정 마법사를 사용하여 기기가 설정되었을 때 기기를 복원하는 데 사용되었던 백업 데이터세트를 참조합니다. 현재 토큰은 기기의 현재 백업 데이터세트(기기가 현재 백업 데이터를 전송하고 있는 데이터세트)를 참조합니다.

그런 다음 logcat을 확인하여 복원 절차의 출력을 확인합니다. 예:

    V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null
    V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683
    ...
    I/BackupManagerService: Restore complete.
    

adb 또는 Google Play 스토어 앱을 사용하여 앱을 제거했다가 다시 설치하는 방식으로 앱의 자동 복원을 테스트할 수 있습니다.

adb shell bmgr restore <PACKAGE> 명령어(백업 세트 토큰을 지정하지 않음)는 다른 복원 명령어와 약간 다르게 작동하므로 실행을 추천하지 않습니다.

문제해결

이 섹션은 몇 가지 일반적인 문제를 해결하는 데 도움이 됩니다.

전송 할당량 초과

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 없이 multidex 구성을 사용하는 경우에 발생합니다.

초기화되지 않은 백업 계정

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 구현을 참조하세요.

반면, 키/값 백업은 앱 manifest 파일에 선언한 Application 서브클래스를 사용하여 앱을 시작합니다.