백업 및 복원 테스트

이 페이지에서는 앱의 클라우드 백업 및 기기 간 (D2D) 전송 프로세스를 테스트하는 방법을 보여줍니다. 앱의 각 주요 버전에서 이 두 가지를 모두 테스트하여 사용자가 새 기기에서 앱을 계속 사용할 수 있도록 하는 것이 중요합니다. 백업과 전송은 모두 비슷하지만 Android 12 (API 수준 31) 이상에서는 둘 사이에 중요한 차이점이 있습니다. 특히 클라우드 백업의 경우 25MB에 비해 전송의 데이터 크기 한도가 2GB로 훨씬 더 크다는 점이 가장 두드러집니다.

이 가이드에서는 개발 주기 전반에 걸쳐 클라우드 백업 및 복원과 D2D 전송을 효율적으로 테스트하는 방법을 보여줍니다.

백업 테스트 작동 방식

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

다음 다이어그램은 클라우드 백업 및 복원 중에 데이터가 흐르는 방식을 보여줍니다. 테스트 목적으로 동일한 기기를 클라우드 백업 및 복원에 사용할 수 있습니다.

백업 프레임워크 데이터 흐름

다음 다이어그램은 D2D 전송 중 데이터가 흐르는 방식을 보여줍니다.

전송 프레임워크 데이터 흐름

클라우드 백업 및 복원 테스트와 달리 D2D 테스트에는 복사를 위해 소스 기기와 대상 기기가 필요합니다.

백업 관리자 서비스는 백업 및 복원 작업을 조정하고 시작하는 Android 시스템 서비스입니다. 서비스는 Backup Manager API를 통해 액세스할 수 있습니다.

백업 작업 중에 서비스는 앱에 백업 데이터를 쿼리한 다음 데이터를 클라우드에 보관처리하는 백업 전송에 전달합니다. 복원 작업 중에 백업 관리자 서비스는 백업 전송에서 백업 데이터를 검색하여 기기에 데이터를 복원합니다. D2D 전송의 경우 백업 관리자 서비스가 앱에 백업 데이터를 쿼리하고 새 기기의 Backup Manager 서비스로 직접 전달하여 앱에 데이터를 로드합니다.

백업 전송은 앱 데이터의 저장 및 검색을 담당하는 Android 구성요소입니다. Android 지원 기기는 백업 전송을 0개 이상 보유할 수 있지만 이러한 전송 중 하나만 활성으로 표시할 수 있습니다. 사용 가능한 백업 전송은 기기 제조업체와 서비스 제공업체의 맞춤설정으로 인해 기기마다 다르지만 대부분의 Google Play 지원 기기는 다음 전송과 함께 제공됩니다.

  • GMS 전송: Google 모바일 서비스의 일부인 대부분의 기기에서 활성 클라우드 백업 전송입니다. 이 전송은 Android Backup Service에 데이터를 저장합니다.
  • D2D 전송: 이 전송은 한 기기에서 다른 기기로 직접 데이터를 전송하기 위해 D2D 이전에 사용됩니다.

도구

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

  • adb: 기기나 에뮬레이터에서 명령어를 실행합니다.
  • bmgr: 다양한 백업 및 복원 작업을 실행합니다.
  • logcat: 백업 및 복원 작업의 출력을 확인합니다.

클라우드 백업 테스트

이 섹션의 단계를 따라 단일 기기를 사용하여 클라우드 백업 및 복원을 실행할 수 있습니다.

클라우드 백업을 위한 기기 또는 에뮬레이터 준비

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

  1. 자동 백업의 경우 Android 6.0 (API 수준 23) 이상을 실행하는 기기나 에뮬레이터를 사용 중인지 확인합니다.
  2. 키-값 백업의 경우 Android 2.2 (API 수준 8) 이상을 실행하는 기기 또는 에뮬레이터를 사용 중인지 확인합니다.
  3. 클라우드 백업을 테스트하려면 인터넷에 연결되어 있어야 합니다.
  4. Google 계정으로 기기에 로그인하고 설정 -> Google -> 백업에서 백업 계정으로 설정합니다.

클라우드 백업을 테스트하려면 클라우드 백업을 트리거한 다음 앱을 제거하고 재설치합니다. 이 단계를 반복 가능하게 만들려면 앱을 백업하고 APK를 로컬로 다운로드한 후 APK를 제거한 다음 APK를 재설치하는 test_cloud_backup.sh 스크립트를 사용하면 됩니다.

#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell bmgr transport com.android.localtransport/.LocalTransport | grep -q "Selected transport" || (echo "Error: error selecting local transport"; exit 1)
adb shell settings put secure backup_local_transport_parameters 'is_encrypted=true'
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

테스트 단계

  1. 앱을 열고 로그인한 후 모든 설정을 수정합니다.
  2. 스크립트를 실행하여 패키지 이름(예: test_cloud_backup.sh com.example.myapp)을 전달합니다.
  3. 앱을 다시 열고 올바르게 작동하는지, 모든 데이터가 보관되는지 확인합니다.

사용자가 로그인하지 않아도 되도록 하고 모든 설정, 진행 상황, 앱 데이터가 이전과 같아야 합니다. 테스트 결과가 이러한 기준을 충족하지 않으면 주요 데이터를 생략하지 않고 백업을 올바르게 구성했는지, 백업에서 제외한 캐시된 데이터의 재생성도 처리하고 있는지 확인하세요. 테스트를 반복할 때마다 1~3단계를 반복합니다.

D2D 전송 테스트

D2D 전송을 테스트하는 가장 포괄적인 방법은 전체 휴대전화 콘텐츠를 초기화된 새 기기로 전송하고 올바르게 작동하는지 확인하는 것입니다. 하지만 이 프로세스를 여러 번 반복해야 한다면 불편하고 시간이 많이 걸릴 수 있습니다. 이 단계에서는 기기에서 초기화를 반복적으로 실행하지 않고 단일 기기로 전송을 시뮬레이션하는 방법을 보여줍니다.

D2D 테스트용 기기 준비

단일 기기에서 D2D 전송을 테스트하려면 다음과 같이 준비합니다.

  1. 기기에서 Android 12 (API 수준 31) 이상을 실행해야 합니다.
  2. 최신 버전의 D2D를 테스트하려면 앱에서 Android 12 (API 수준 31) 이상을 타겟팅하세요.
  3. 테스트 반복을 지원하는 test_d2d.sh 스크립트를 만듭니다.
#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell settings put secure backup_enable_d2d_test_mode 1
adb shell bmgr transport com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr list transports | grep -q -F "  * com.google.android.gms/.backup.migrate.service.D2dTransport" || (echo "Failed to select and initialize backup transport"; exit 1)
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell settings put secure backup_enable_d2d_test_mode 0
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

테스트 단계

  1. 기기에서 테스트할 앱을 설치합니다.
  2. 앱을 열고 로그인한 후 앱 설정을 수정합니다.
  3. 기기에서 스크립트를 실행하여 패키지 이름(예: test_d2d.sh com.example.myapp)을 전달합니다.
  4. 스크립트가 완료되면 기기에서 앱을 열고 모든 데이터가 보관되어 제대로 작동하는지 확인합니다.

사용자가 로그인하지 않아도 되도록 하고 모든 설정, 진행 상황, 앱 데이터가 스크립트를 실행하기 전과 동일하게 표시되어야 합니다. 테스트 결과가 이러한 기준을 충족하지 않으면 주요 데이터를 생략하지 않고 전송을 올바르게 구성했는지, 그리고 전송에서 제외한 캐시된 데이터의 재생성도 처리하고 있는지 확인하세요. 테스트를 반복할 때마다 2~4단계를 반복합니다.

백업 및 복원 문제 해결하기

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

전송 할당량 초과

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의 다음 메시지는 앱이 백업을 위해 실행하는 데 10초 넘게 걸린다는 것을 나타냅니다.

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

로그 출력의 타임스탬프 차이를 확인합니다. 이 오류는 일반적으로 앱에서 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 서브클래스로 앱을 시작합니다.

백업할 데이터 없음

Logcat의 다음 메시지는 앱에 백업할 데이터가 없음을 나타냅니다.

I Backup  : [FullBackupSession] Package com.your.app.package doesn't have any backup data.

--- or ---

I Backup  : [D2dTransport] Package com.your.app.package doesn't have any backup data.

자체 BackupAgent를 구현했다면 백업에 데이터나 파일을 추가하지 않았을 가능성이 높습니다.