안드로이드 스튜디오 :: 사용자 데이터 백업

Android/공통 2021.01.29 댓글 moonsu
728x90

Android 개발자 페이지를 참고 했습니다.

 

안드로이드는 앱의 데이터를 클라우드에 백업할 수 있도록 자동 백업과 키/값 백업, 두 가지 방법을 제공한다. 자동 백업은 Android 6.0(API 23) 이상에서 데이터를 사용자의 Google 드라이브 계정에 업로드하여 보존한다. 앱의 할당한 대부분의 디렉터리에 있는 파일을 포함하며, 원하는 파일을 빼거나 더할 수 있다. 최대 25MB까지.

키/값 백업 기능은 Android 2.2(API 8) 이상에서 작동하며 키/값 쌍 형태의 설정 데이터를 Android Packup Service에 업로드하여 보존한다. 일반적으로 자동 백업을 추천한다. 기본으로 사용 설정이 되어있고 따로 구현할 작업이 없기 때문이다. 하지만 더 구체적인 요구사항이 있다면 키/값 백업 기능의 사용을 고려할 수 있다. 본 글에서는 자동 백업에 대해 설명한다.

 

 

 

1. 백업되는 파일


자동 백업에는 앱의 데이터가 할당된 대부분의 디렉토리에 있는 파일이 포함된다.

(1) 공유 환경설정 파일

(2) getFilesDir() 또는 getDir(String, int) 을 사용해 액세스하는 앱의 내부 저장소 파일

(3) getDatabasePath(String) 에서 반환한 디렉토리 파일 (SQLiteOpenHelper 클래스 파일 포함)

(4) getExternalFilesDir(String) 에서 반환한 디렉토리의 외부 저장소에 있는 파일

 

getCacheDir(), getCodeCacheDir() 또는 getNoBackupFilesDir() 에서 반환한 디렉토리 파일은 자동 백업에서 제외된다. 이 위치에 저장된 파일은 임시파일(캐시 등)으로써 일시적으로만 사용되거나 백업 작업에서 의도적으로 제외된다.

 

 

 

2. 백업 위치


백업 데이터는 사용자의 Google 드라이브 계정에 있는 비공개 폴더에 저장되며 앱당 25MB로 제한되다. 저장된 데이터는 개인 Google 드라이브 할당량에 포함되지 앟으며, 최근 백업만 저장된다. 또한 사용자가 두 대의 기기를 소유하고 있다면 백업 데이터는 기기별로 존재한다.

!!주의 : 데이터양이 25MB를 초과하면 시스템은 onQuotaExceeded() 를 호풀하고 데이터를 백업하지 않는다. 이후 25MB 임계값 이내로 줄어드는지 주기적으로 확인하고 자동 백업을 계속한다.

 

 

 

3. 백업 일정


다음 조건 충족시 자동 백업이 실행된다.

(1) 사용자의 백업 사용 설정. Android 9 이상에서는 이 설정이 설정 > 시스템 > 백업에 있다.

(2) 마지막 백업 후 24시간 이상 경과.

(3) 기기가 유휴 상태 (어떤 프로그램에 의해서도 사용되지 않는 상태)

(4) Wi-Fi 연결상태. (사용자가 모바일 데이터 백업을 선택하지 않은 경우)

 

실제로 위 조건은 매일 밤 발생한다. 하지만 기기에서 전혀 백업을 실행하지 않을 수 있다. (예 : 기기가 네트워크에 연결되지 않은 경우 등)

백업 및 복원 테스트 도구를 통해 앱의 백업을 수동으로 시작할 수 있다. 백업 및 복원 테스트 참고.

 

 

 

4. 복원 일정


Play Store에서 기기를 설정하는 동안 (시스템에서 이전에 설치된 앱을 설치하는 경우) 또는 adb 설치를 실행하는 중 데이터가 복원된다. 복원 작업은 APK를 설치한 후 앱 시작 전에 일어나며 복원할 데이터를 묻는 메세지가 사용자에게 표시된다.

 

 

 

5. 백업 사용 설정 및 중지


Android 6.0(API 23) 이상에서 자동 백업은 자동으로 포함된다. 앱 매니페스트 파일에서 android:allowBackup을 통해 백업 사용을 결정할 수 있다. 기본값은 true.

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

 

 

 

6. 포함, 제외할 파일


시스템에서는 기본적으로 모든 앱 데이터를 백업하지만 XML을 이용해 백업 대상을 제어할 수 있다.

(1) res/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>

 

 

(2) 매니페스트에서 <application> 요소에 android:fullBackupContent 속성을 추가한다. 앞서 생성한 XML 파일을 추가한다.

<application ...
    android:fullBackupContent="@xml/my_backup_rules">
</application>

 

 

 

7. 백업 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> 요소를 정의할 수 있다.

 

(1) <include>

백업할 파일 또는 폴더를 지정한다. <include> 요소를 하나라도 지정하게 되면 시스템은 지정된 파일만 백업한다.

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

 

(2) <exclude>

백업에서 제외할 파일 또는 폴더를 지정한다.

 

(3) 속성

각 요소는 다음 속성을 포함해야 한다.

- domain : 리소스 위치 지정

    - rood : 앱에 속한 모든 비공개 파일이 저장된 디렉토리

    - file : getfilesDir() 에서 반환한 디렉토리

    - database : getDatabasePath() 에서 반환한 디렉토리, SQLiteOpenHelper로 생성된 데이터베이스가 여기 저장된다.

    - sharedpref : SharedPreferences 가 저장된 디렉토리

    - external : getExternalFilesDir() 에서 반환한 디렉토리.

 

- path : 백업에 포함하거나 제외할 파일 또는 폴더 지정

 

 

 

 

 

728x90
반응형

댓글