[Android]앱 삭제 했는데 데이터가 남아 있는 문제 - 데이터 백업

안드로이드 앱 삭제 했는데 데이터가 남아 있는 문제는 Android 6.0부터 제공되는 자동백업 때문입니다. 자동백업을 중지 시키려면 manifest.xml application 속성에 아래와 같은 설정을 추가해 주세요.

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

 

밑에 내용은 데이터 백업에 대한 자세한 구글 문서 입니다.

 

백업 사용 설정 및 중지

 

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

 

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

 

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

 

파일 포함 및 제외

 

시스템은 기본적으로 거의 모든 앱 데이터를 백업합니다.

 

  • getFilesDir() 또는 getDir(String, int)를 사용하여 액세스하는 앱의 내부 저장소에 저장된 파일
  • getDatabasePath(String)에서 반환한 디렉터리 파일(이 디렉터리는 SQLiteOpenHelper 클래스를 사용하여 생성한 파일도 포함함)
  • getExternalFilesDir(String)에서 반환한 디렉터리의 외부 저장소에 있는 파일

getCacheDir(), getCodeCacheDir() 또는 getNoBackupFilesDir()에서 반환한 디렉터리 파일은 자동백업에서 제외됩니다.

 

XML을 정의하여 백업 대상 제어

 

AndroidManifest.xml에서 <application>요소에 android:fullBackupContent 속성을 추가합니다. 

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

 

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"
        requiredFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
        <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
        path="string" />
</full-backup-content>

 

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

 

<include>

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

 

<exclude>

백업 중에 제외할 파일 또는 폴더를 지정합니다. 백업에서 일반적으로 제외되는 파일을 다음과 같습니다.

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

리소스가 <include>와 <exclude>요소 모두 포함되어 있다면 <exclude>에 지정된 리소스를 제외한 파일이 백업에 <include>됩니다. <exclude>를 우선적으로 처리 합니다.

 

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

 

domain - 리소스의 위치를 지정합니다.

이 속성의 유효한 값에는 아래 정보가 포함됩니다. 아래 위치 이외의 파일은 백업할 수 없습니다.

  • root - 이 앱에 속한 모든 비공개 파일이 저장된 파일 시스템의 디렉터리
  • file - getFilesDir()에서 반환한 디렉터리
  • database - getDatabasePath()에서 반환한 디렉터리 SQLiteOpenHelper를 사용하여 생성된 데이터베이스가 여기 저장 됩니다.
  • Sharedpref - SharedPreferences가 저장된 디렉터리
  • external - getExternalFilesDir()에서 반환한 디렉터리

path - 백업에 포함하거나 백업에서 제외할 파일 또는 폴더를 지정합니다. 다음 사항을 참고하세요.

 

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

백업을 위한 조건부 요구사항 정의

 

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

 

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

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

    <?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>
    

 

 

 

 

'study' 카테고리의 다른 글

프래그먼트  (0) 2020.02.04
[Manifest]Permission  (0) 2020.01.31
[코틀린 Kotlin]when  (0) 2020.01.20
[Android] Navigation  (0) 2020.01.10
[Android] 화면 전환에 따라 UI 대응  (0) 2020.01.09

댓글



Designed by JB FACTORY