백업 및 복원 테스트

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

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

백업 테스트 작동 방식

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

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

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

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

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

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

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

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

백업 전송은 앱 데이터를 저장하고 가져오는 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 -> 백업에서 기기를 백업 계정으로 설정합니다.

클라우드 백업을 테스트하려면 클라우드 백업을 트리거한 다음 앱을 제거하고 다시 설치합니다. 이러한 단계를 반복할 수 있도록 하려면 다음 스크립트 test_cloud_backup.sh를 사용하면 됩니다. 이 스크립트는 앱을 백업하고, APK를 로컬에 다운로드하고, APK를 제거하고, APK를 다시 설치합니다.

#!/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를 구현한 경우 백업에 데이터나 파일을 추가하지 않은 것일 수 있습니다.