Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

자동 백업으로 사용자 데이터 백업

앱의 자동 백업은 Android 6.0(API 수준 23) 이상에서 타겟팅하거나 실행되는 앱의 사용자 데이터를 자동으로 백업합니다. Android는 앱 데이터를 사용자의 Google 드라이브에 업로드하여 보존합니다. 이 드라이브에서 앱 데이터는 사용자의 Google 계정 사용자 인증 정보에 따라 보호됩니다. 데이터양은 앱 사용자당 25MB로 제한되며 백업 데이터 보관 비용은 없습니다. 앱에서 백업 절차를 맞춤설정하거나 백업을 사용 중지하여 선택 해제할 수 있습니다.

Android의 백업 옵션 개요와 백업 및 복원해야 하는 데이터에 관한 안내는 데이터 백업 개요를 참고하세요.

자동 백업 설정의 단계별 진행에 관해 살펴보려면 Android Codelab의 자동 백업도 사용해 보세요.

백업되는 파일

기본적으로 자동 백업에는 시스템에서 앱에 할당하는 대부분의 디렉토리에 있는 다음과 같은 파일이 포함됩니다.

getCacheDir(), getCodeCacheDir() 또는 getNoBackupFilesDir()에서 반환한 디렉터리에 있는 파일은 자동 백업에서 제외됩니다. 이 위치에 저장된 파일은 일시적으로만 필요하거나 백업 작업에서 의도적으로 제외됩니다.

앱을 구성하여 특정 파일을 포함하거나 제외할 수 있습니다. 자세한 내용은 파일 포함 및 제외 섹션을 참고하세요.

참고: Android는 구성요소의 구성을 사용자 데이터로 취급하지 않습니다. 앱이 실행 중에 매니페스트에서 특정 구성요소를 사용 설정하거나 사용 중지한다면 자동 백업은 구성을 저장하거나 복원하지 않습니다. 구성의 상태를 보존하려면 공유 환경설정에 저장하고 복원 시 공유 환경설정을 복구하세요. 앱에서 앱의 상태를 저장하려면 공유 환경설정에 저장하고 복원 시 공유 환경설정을 복구하면 됩니다.

백업 위치

백업 데이터는 사용자의 Google 드라이브 계정에 있는 비공개 폴더에 저장되며 앱당 25MB로 제한됩니다. 저장된 데이터는 사용자의 개인 Google 드라이브 할당량에 포함되지 않습니다. 또한 최근 백업만 저장됩니다. 백업이 이뤄지면 이전 백업(백업이 있는 경우)이 삭제됩니다. 기기의 사용자나 다른 앱은 백업 데이터를 읽을 수 없습니다.

사용자는 Google 드라이브 Android 앱에 백업된 앱 목록을 볼 수 있습니다. Android 지원 기기에서 사용자는 설정 > 백업 및 재설정 > 앱 데이터 아래 드라이브 앱의 탐색 창에서 목록을 찾을 수 있습니다.

다음 예에서 보는 바와 같이 백업은 기기 설정의 전체 기간별로 별도의 데이터 세트에 저장됩니다.

  • 사용자가 두 개의 기기를 소유하고 있다면 백업 데이터 세트는 기기별로 존재합니다.
  • 사용자가 기기 한 대를 초기화한 다음 같은 계정으로 기기를 설정하는 경우 백업이 새 데이터 세트에 저장됩니다. 사용하지 않는 데이터 세트는 일정 기간 활동이 없으면 자동으로 삭제됩니다.

백업 일정

다음 조건이 모두 충족되면 자동 백업이 실행됩니다.

  • 사용자가 기기에 백업을 사용 설정했습니다. Android 9에는 이 설정이 설정 > 시스템 > 백업에 있습니다.
  • 마지막 백업 후 24시간 이상 경과했습니다.
  • 기기가 유휴 상태입니다.
  • 기기가 Wi-Fi 네트워크에 연결되어 있습니다(기기 사용자가 모바일 데이터 백업을 선택하지 않은 경우).

실제로 이 조건은 거의 매일 밤 발생하지만 기기에서 전혀 백업을 실행하지 않을 수 있습니다(예: 기기가 네트워크에 연결되지 않은 경우). 네트워크 대역폭 사용량을 절약하기 위해 업로드는 앱 데이터가 변경된 경우에만 실행됩니다.

자동 백업을 하는 동안 시스템은 앱을 종료하여 앱이 더 이상 파일 시스템에 쓰지 못하도록 합니다. 사용자가 앱이 종료되고 있는 것을 알 수 있기 때문에 기본적으로 백업 시스템은 포그라운드에서 실행 중인 앱은 무시합니다. backupInForeground 속성을 true로 설정하여 기본 동작을 재정의할 수 있습니다.

테스트를 간소화하기 위해 Android에는 앱의 백업을 수동으로 시작할 수 있는 도구가 포함되어 있습니다. 자세한 내용은 백업 및 복원 테스트를 참고하세요.

복원 일정

Play 스토어에서, 기기를 설정하는 동안(시스템에서 이전에 설치된 앱을 설치하는 경우) 또는 adb 설치를 실행하는 중 앱이 설치될 때마다 데이터가 복원됩니다. 복원 작업은 APK가 설치된 후 사용자가 앱을 시작할 수 있게 되기 전에 일어납니다.

초기 기기 설정 마법사가 진행되는 동안 사용 가능한 백업 데이터 세트 목록과 데이터를 복원할 데이터 세트를 묻는 메시지가 사용자에게 표시됩니다. 백업 데이터 세트를 선택하면 그 데이터 세트가 기기의 상위 데이터 세트가 됩니다. 기기는 자체 백업 또는 상위 데이터 세트에서 복원할 수 있습니다. 백업에 두 소스를 모두 사용할 수 있는 경우 기기는 자체 백업을 우선적으로 선택합니다. 사용자가 기기 설정 마법사를 진행하지 않았다면 기기는 자체 백업에서만 복원할 수 있습니다.

테스트를 간소화하기 위해 Android에는 수동으로 앱 복원을 시작할 수 있는 도구가 포함되어 있습니다. 자세한 내용은 백업 및 복원 테스트를 참고하세요.

백업 사용 설정 및 사용 중지

Android 6.0(API 수준 23) 이상을 타겟팅하는 앱은 자동 백업에 자동으로 포함됩니다. 앱 매니페스트 파일에서 android:allowBackup에 부울 값을 설정하여 백업을 사용 설정 또는 사용 중지합니다. 기본값은 true지만 의도를 명확히 나타내려면 매니페스트에서 다음과 같이 속성을 명시적으로 설정하는 것이 좋습니다.

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

android:allowBackupfalse로 설정하여 백업을 사용 중지할 수 있습니다. 앱에서 일부 다른 메커니즘을 통해 상태를 다시 생성할 수 있는 경우 또는 Android에서 백업해서는 안 되는 민감한 정보를 앱에서 다루는 경우 백업을 중지하는 것이 좋습니다.

파일 포함 및 제외

시스템에서는 기본적으로 모든 앱 데이터를 백업합니다. 자세한 내용은 백업되는 파일을 참고하세요. 이 섹션에서는 맞춤 XML 규칙을 정의하여 백업 대상을 제어하는 방법을 보여줍니다.

  1. AndroidManifest.xml에서 <application> 요소에 android:fullBackupContent 속성을 추가합니다. 이 속성은 백업 규칙을 포함하는 XML 파일을 가리킵니다. 예:
    <application ...
        android:fullBackupContent="@xml/my_backup_rules">
    </application>
    
  2. res/xml/ 디렉터리에 my_backup_rules.xml이라는 XML 파일을 만듭니다. 파일 내에 <include><exclude> 요소를 사용하여 규칙을 추가합니다. 다음 샘플에서는 device.xml을 제외한 모든 공유 환경설정을 백업합니다.
    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <include domain="sharedpref" path="."/>
        <exclude domain="sharedpref" path="device.xml"/>
    </full-backup-content>
    

XML 구성 구문

구성 파일의 XML 구문은 다음과 같습니다.

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" | "root"]
    path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
    path="string" />
</full-backup-content>

<full-backup-content> 태그 내에 <include><exclude> 요소를 정의할 수 있습니다.

  • <include> - 백업할 파일 또는 폴더를 지정합니다. 기본적으로 자동 백업은 거의 모든 앱 파일을 포함합니다. <include> 요소를 지정하면 시스템은 더 이상 모든 파일을 기본으로 포함하지 않고 지정된 파일만 백업합니다. 여러 파일을 포함하려면 <include> 요소를 여러 번 사용합니다.

    참고: getCacheDir(), getCodeCacheDir() 또는 getNoBackupFilesDir()에서 반환된 디렉터리의 파일은 백업에 포함하려고 해도 항상 제외됩니다.

  • <exclude> - 백업 중에 제외할 파일 또는 폴더를 지정합니다. 백업에서 일반적으로 제외되는 파일은 다음과 같습니다.
    • 서버에서 발행하거나 기기에서 생성한 기기 전용 식별자를 사용하는 파일. 예를 들어, Google 클라우드 메시징(GCM)은 사용자가 새 기기에 앱을 설치할 때마다 등록 토큰을 생성하도록 요구합니다. 만약 이전 등록 토큰이 복원되면 앱이 정상적으로 작동하지 않을 수 있습니다.
    • 계정 사용자 인증 정보 또는 민감한 정보. 백업에 이런 정보를 저장하도록 허용하는 것보다 복원된 앱을 처음 실행할 때 사용자에게 다시 인증을 요청하는 것이 좋습니다.
    • 앱 디버깅과 관련된 파일
    • 앱이 25MB의 백업 할당량을 초과하도록 하는 대용량 파일

참고: 구성 파일이 두 요소를 모두 지정하면 백업에는 <include> 요소에서 캡처된 모든 파일에서 <exclude> 요소에 이름이 지정된 리소스를 제외한 파일이 백업에 포함됩니다. 즉, <exclude>가 우선합니다.

각 요소는 다음 두 속성을 포함해야 합니다.

  • domain - 리소스의 위치를 지정합니다. 이 속성의 유효한 값에는 다음 정보가 포함됩니다.
  • 참고: 이 위치 외에 있는 파일은 백업할 수 없습니다.

  • path: 백업에 포함하거나 백업에서 제외할 파일 또는 폴더를 지정합니다. 참고:
    • 이 속성은 와일드 카드나 정규식 구문을 지원하지 않습니다.
    • .을 사용하여 현재 디렉터리를 참조할 수 있지만, 보안상의 이유로 상위 디렉터리 ..을 참조할 수는 없습니다.
    • 디렉터리를 지정하면 디렉터리와 반복되는 하위 디렉터리에 있는 모든 파일에 규칙이 적용됩니다.

include 요소는 requireFlags 속성도 포함할 수 있으며 백업을 위한 조건부 요구사항을 정의하는 방법을 설명하는 섹션에서 자세히 논의합니다.

백업에 필요한 기기 조건 정의

앱에서 기기에 민감한 정보를 저장하는 경우 사용자의 백업에 포함되는 앱의 데이터에 적용되는 조건을 지정할 수 있습니다. Android 9(API 수준 28) 이상에서는 다음 조건을 추가할 수 있습니다.

  • clientSideEncryption: 사용자의 백업은 클라이언트 측의 보안 비밀을 사용하여 암호화됩니다. 이러한 암호화 양식은 사용자가 Android 9 이상에서 백업을 사용 설정하고 기기에 화면 잠금을 설정(PIN, 패턴 또는 비밀번호)하기만 하면 Android 9 이상을 실행하는 기기에서 사용 설정됩니다.
  • deviceToDeviceTransfer: 사용자가 로컬 기기 간 전송(예: Google Pixel)을 지원하는 다른 기기로 백업을 전송 중입니다.

개발 기기를 Android 9로 업그레이드했다면 업그레이드 후 데이터 백업을 사용 중지하고 다시 사용 설정해야 합니다. 왜냐하면 Android는 설정 또는 설정 마법사에서 사용자에게 알린 후에 클라이언트 측의 보안 비밀만 사용하여 백업을 암호화하기 때문입니다.

포함 조건을 선언하려면 백업 규칙의 조합 내에서 <include> 요소의 requireFlags 속성에 원하는 값을 설정합니다.

my_backup_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- App data isn't included in user's backup
         unless client-side encryption is enabled. -->
    <include domain="file" path="."
             requireFlags="clientSideEncryption" />
<full-backup-content>

앱에서 키-값 백업 시스템을 구현하거나 직접 BackupAgent를 구현하면 BackupDataOutput 객체의 전송 플래그 조합과 맞춤 백업 에이전트의 FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED 또는 FLAG_DEVICE_TO_DEVICE_TRANSFER 플래그 간에 논리합 비교를 실행하여 이러한 조건부 요구사항을 백업 로직에 적용할 수도 있습니다.

다음 코드 스니펫에서는 이러한 메서드의 사용 예를 보여줍니다.

Kotlin

class MyCustomBackupAgent : BackupAgent() {
    override fun onBackup(oldState: ParcelFileDescriptor?,
            data: BackupDataOutput?, newState: ParcelFileDescriptor?) {
        if (data != null) {
            if ((data.transportFlags and
                    FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
                // Client-side backup encryption is enabled.
            }

            if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
                // Local device-to-device transfer is enabled.
            }
        }
    }

    // Implementation of onRestore() here.
}

자바

public class MyCustomBackupAgent extends BackupAgent {
    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
            ParcelFileDescriptor newState) throws IOException {
        if ((data.getTransportFlags() &
                FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
            // Client-side backup encryption is enabled.
        }

        if ((data.getTransportFlags() &
                FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
            // Local device-to-device transfer is enabled.
        }
    }

    // Implementation of onRestore() here.
}

BackupAgent 구현

자동 백업을 구현하는 앱은 BackupAgent를 구현할 필요가 없습니다. 그러나 선택적으로 맞춤 BackupAgent를 구현할 수 있습니다. 대개 다음 두 가지 이유로 맞춤 BackupAgent를 구현합니다.

  • onRestoreFinished() 또는 onQuotaExceeded(long, long)와 같은 백업 이벤트의 알림을 수신하려는 경우입니다. 이러한 콜백 메서드는 앱이 실행 중이 아니어도 실행됩니다.
  • XML 규칙을 사용하여 백업하려는 파일의 조합을 쉽게 표현할 수 없는 경우입니다. 이러한 경우는 드물지만 onFullBackup(FullBackupDataOutput)을 재정의하여 원하는 파일을 저장하는 BackupAgent를 구현할 수 있습니다. 시스템의 기본 구현을 유지하려면 슈퍼클래스에서 super.onFullBackup()에 상응하는 메서드를 호출합니다.

BackupAgent를 구현하면 기본적으로 시스템은 앱에서 키/값 백업 및 복원을 실행할 것으로 예상합니다. 대신 파일 기반 자동 백업을 사용하려면 앱의 매니페스트에서 android:fullBackupOnly 속성을 true로 설정합니다.

자동 백업 및 복원 작업이 진행되는 동안 시스템은 앱을 제한 모드로 시작하여 앱이 충돌을 일으킬 수 있는 파일에 액세스하지 못하도록 하며 앱이 BackupAgent의 콜백 메서드를 실행할 수 있게 합니다. 이 제한 모드에서는 앱의 기본 활동이 자동으로 시작되지 않으며 콘텐츠 제공자가 초기화되지 않고 앱의 매니페스트에 선언된 모든 서브클래스 대신 기본 클래스인 Application이 인스턴스화됩니다.

주의: 오류를 방지하려면 제한 모드로 실행되는 앱의 일부(주로 BackupAgent)가 동일한 앱에서 콘텐츠 제공자에 액세스하지 않는지 또는 Application 객체를 전송하도록 시도하지 않는지 확인해야 합니다. 이러한 패턴을 피할 수 없다면 키/값 백업을 구현하거나 백업을 완전히 사용 중지하는 것을 고려해 보세요.

BackupAgent키-값 백업에 사용되는 추상 메서드인 onBackup()onRestore()를 구현해야 합니다. 단, 키-값 백업을 실행하고 싶지 않다면 이러한 메서드의 구현을 비워 두면 됩니다.

자세한 내용은 BackupAgent 확장을 참고하세요.

추가 리소스

자동 백업에 관한 자세한 내용은 다음 리소스를 참조하세요.

Codelab