이 페이지에서는 앱의 클라우드 백업 및 기기 간 (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 이전에 사용됩니다.
도구
백업 및 복원 작업을 테스트하려면 다음 도구에 관해 약간은 알아야 합니다.
클라우드 백업 테스트
클라우드 백업 및 복원은 이 섹션의 단계에 따라 단일 기기를 사용하여 수행할 수 있습니다.
클라우드 백업을 위한 기기 또는 에뮬레이터 준비
다음 체크리스트를 검토하여 백업 테스트를 위한 기기 또는 에뮬레이터를 준비합니다.
- 자동 백업의 경우 Android 6.0 (API 수준 23) 이상을 실행하는 기기 또는 에뮬레이터를 사용 중인지 확인합니다.
- 키-값 백업의 경우 Android 2.2 (API 수준 8) 이상을 실행하는 기기 또는 에뮬레이터를 사용 중인지 확인합니다.
- 클라우드 백업을 테스트하려면 인터넷에 연결되어 있어야 합니다.
- 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"
테스트 단계
- 앱을 열고 로그인한 후 모든 설정을 수정합니다.
- 스크립트를 실행하여 패키지 이름(예:
test_cloud_backup.sh com.example.myapp
)을 전달합니다. - 앱을 다시 열고 모든 데이터가 보관된 상태로 올바르게 작동하는지 확인합니다.
사용자는 로그인할 필요가 없으며 모든 설정, 진행 상황, 앱 데이터는 이전과 동일해야 합니다. 테스트 결과가 이 기준을 충족하지 않으면 중요한 데이터를 생략하지 않고 백업을 올바르게 구성했는지, 백업에서 제외한 캐시된 데이터의 재생성을 처리하고 있는지도 확인하세요. 테스트 반복마다 1~3단계를 반복합니다.
D2D 전송 테스트
D2D 전송을 테스트하는 가장 포괄적인 방법은 전체 휴대전화 콘텐츠를 초기화된 새 기기로 전송하고 제대로 작동하는지 확인하는 것입니다. 그러나 이 프로세스를 여러 번 반복해야 하는 경우 불편하고 시간이 오래 걸릴 수 있습니다. 이 단계에서는 기기에서 초기화를 반복적으로 실행하지 않고 단일 기기로 전송을 시뮬레이션하는 방법을 보여줍니다.
D2D 테스트를 위한 기기 준비
단일 기기에서 D2D 전송을 테스트하려면 다음과 같이 준비합니다.
- 기기에서 Android 12 (API 수준 31) 이상을 실행해야 합니다.
- 최신 버전의 D2D를 테스트하려면 앱에서 Android 12 (API 수준 31) 이상을 타겟팅하세요.
- 테스트 반복을 지원하는 다음 스크립트
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"
테스트 단계
- 기기에서 테스트할 앱을 설치합니다.
- 앱을 열고 로그인한 후 앱 설정을 수정합니다.
- 기기에서 스크립트를 실행하여 패키지 이름(예:
test_d2d.sh com.example.myapp
)을 전달합니다. - 스크립트가 완료되면 기기에서 앱을 열고 모든 데이터가 유지된 상태로 올바르게 작동하는지 확인합니다.
사용자는 로그인할 필요가 없으며 모든 설정, 진행 상황, 앱 데이터가 스크립트를 실행하기 전과 동일하게 표시되어야 합니다. 테스트 결과가 이러한 기준을 충족하지 않으면 데이터의 주요 부분을 생략하지 않고 전송을 올바르게 구성했는지, 전송에서 제외한 캐시된 데이터의 재생성도 처리하고 있는지 확인하세요. 각 테스트 반복에 대해 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
를 구현한 경우 백업에 데이터나 파일을 추가하지 않은 것일 수 있습니다.