Android 11의 저장소 업데이트

Android 11에서는 플랫폼을 더욱 강화하여 외부 저장소의 앱 및 사용자 데이터를 보다 안전하게 보호합니다. 이러한 노력의 일환으로 플랫폼에는 범위 지정 저장소로 쉽게 전환하도록 추가 개선사항이 도입됩니다.

이번 미리보기 출시에는 미디어의 원본 파일 경로 액세스 선택, 미디어의 일괄 수정 작업, 저장소 액세스 프레임워크의 업데이트된 UI와 같이 작년에 Android Dev Summit에서 발표한 몇 가지 개선사항이 도입됩니다.

개발자 프리뷰 향후 버전에서 파일 액세스의 추가 개선사항뿐 아니라 파일 관리 및 사진 갤러리와 관련된 업데이트된 정책도 찾아보세요. 언제나 그렇듯 다음 버전의 Android를 만드는 데 도움이 되도록 의견을 보내주시기 바랍니다. Issue Tracker를 사용하여 의견을 보내면 됩니다.

Google은 항상 소중한 의견에 귀 기울이고 있습니다. 이 간단한 설문조사를 통해 기능 사용 방식을 알려주세요. 특히 이 기능의 영향을 받은 사용 사례에 관해 알려주세요.

범위 지정 저장소 적용

개발자에게 테스트 시간을 추가로 주기 위해 Android 10(API 수준 29)을 타겟팅하는 앱은 여전히 requestLegacyExternalStorage 속성을 요청할 수 있습니다. 이 플래그를 사용하면 앱은 범위 지정 저장소와 관련된 변경사항(예: 여러 디렉터리 및 여러 미디어 파일 유형에 관한 액세스 권한 부여)을 일시적으로 선택 해제할 수 있습니다. Android 11을 타겟팅하도록 앱을 업데이트하면 시스템에서 requestLegacyExternalStorage 플래그를 무시합니다.

Android 10과 호환성 유지

앱이 Android 10 기기에서 실행될 때 범위 지정 저장소를 선택 해제하는 경우 앱의 매니페스트 파일에서 requestLegacyExternalStoragetrue로 계속 설정하는 것이 좋습니다. 이렇게 하면 Android 10을 실행하는 기기에서 앱이 예상대로 계속 동작할 수 있습니다.

범위 지정 저장소 사용 시 표시되는 디렉터리로 데이터 이전

앱이 레거시 저장소 모델을 사용하고 이전에 Android 10 이하를 타겟팅했다면 범위 지정 저장소 모델이 사용 설정되었을 때 앱이 액세스할 수 없는 디렉터리에 데이터를 저장할 수 있습니다. Android 11을 타겟팅하기 전에 먼저 범위 지정 저장소와 호환되는 디렉터리로 데이터를 이전합니다. 대부분의 상황에서 데이터를 앱별 디렉터리로 이전할 수 있습니다.

이전할 데이터가 있다면 사용자가 Android 11을 타겟팅하는 앱의 새 버전으로 업그레이드할 때 레거시 저장소 모델을 보존할 수 있습니다. 이렇게 하면 사용자가 앱에서 이전에 데이터를 저장했던 디렉터리에 저장된 앱 데이터에 액세스할 수 있는 권한을 유지할 수 있습니다. 업그레이드에 레거시 저장소 모델을 사용하려면 앱의 매니페스트에서 preserveLegacyExternalStorage 속성을 true로 설정합니다.

참고: 대부분의 앱에서는 preserveLegacyExternalStorage를 사용할 필요가 없습니다. 이 플래그는 앱 데이터를 범위 지정 저장소와 호환되는 위치로 이전하며 사용자가 앱을 업데이트할 때 데이터 관련 액세스 권한을 유지하도록 하려는 상황을 위해서만 설계됩니다. 이 플래그를 사용하면 사용자가 앱을 업데이트할 때 레거시 저장소 모델이 계속 사용되기 때문에 범위 지정 저장소가 앱 사용자에게 어떤 영향을 주는지 테스트하기가 더 어려워집니다.

preserveLegacyExternalStorage를 사용한다면 레거시 저장소 모델은 사용자가 앱을 제거할 때까지만 유효합니다. 사용자가 Android 11을 실행하는 기기에 앱을 설치 또는 재설치하면 앱이 preserveLegacyExternalStorage의 값과 상관없이 범위 지정 저장소 모델을 선택 해제할 수 없습니다.

범위 지정 저장소 테스트

앱의 타겟 SDK 버전 및 매니페스트 플래그 값과 관계없이 앱의 범위 지정 저장소를 사용 설정하려면 다음 앱 호환성 플래그를 사용 설정하세요.

범위 지정 저장소를 사용 중지하고 대신 레거시 저장소 모델을 사용하려면 두 플래그를 모두 설정 해제하세요.

기기 저장용량 관리

앱이 파일 관리자 앱이고 Android 11에서 실행된다면 앱에 모든 파일 액세스 권한이 있어도 더 이상 다른 앱의 캐시 파일을 삭제할 수 없습니다. 대신 앱에서 다음을 해야 합니다.

  1. ACTION_MANAGE_STORAGE 인텐트 작업을 호출하여 여유 공간을 확인합니다.
  2. 기기에 여유 공간이 충분하지 않다면 앱에서 모든 캐시를 지우는 데 동의하라는 메시지를 사용자에게 표시합니다. 그렇게 하려면 ACTION_CLEAR_APP_CACHE 인텐트 작업을 호출합니다.

미디어 파일 액세스

사용자 개인정보 보호를 유지하면서도 더 간편하게 미디어에 액세스하도록 Android 11은 다음 기능을 추가합니다.

일괄 작업 실행

기기 간 일관성과 사용자 편의성 강화를 위해 Android 11은 MediaStore API에 몇 가지 메서드를 추가합니다. 이러한 메서드는 특정 미디어 파일 수정(예: 사진을 직접 편집)에 간소화된 흐름을 사용하려는 앱에 특히 유용합니다.

추가된 메서드는 다음과 같습니다.

createWriteRequest()
앱에 지정된 미디어 파일 그룹에 관한 쓰기 액세스 권한을 부여하도록 사용자에게 요청합니다.
createFavoriteRequest()
지정된 미디어 파일을 기기의 '즐겨찾기' 미디어로 표시하도록 사용자에게 요청합니다. 이 파일에 읽기 액세스할 수 있는 앱은 사용자가 파일을 '즐겨찾기'로 표시했음을 알 수 있습니다.
createTrashRequest()
지정된 미디어 파일을 기기의 휴지통에 넣도록 사용자에게 요청합니다. 휴지통에 있는 항목은 시스템에서 정의한 기간이 지나면 영구적으로 삭제됩니다.
createDeleteRequest()
지정된 미디어 파일을 휴지통에 미리 넣지 않고 영구적으로 삭제하도록 사용자에게 요청합니다.

이러한 메서드 중 하나를 호출하면 시스템에서 PendingIntent 객체가 빌드됩니다. 앱이 이 인텐트를 호출하면 앱에서 지정된 미디어 파일을 업데이트하거나 삭제하도록 동의를 요청하는 대화상자가 사용자에게 표시됩니다.

원시 경로를 사용하여 파일에 액세스

Android 11에서는 READ_EXTERNAL_STORAGE 권한이 있는 앱이 직접 파일 경로 및 네이티브 라이브러리를 사용하여 기기의 미디어 파일을 읽을 수 있습니다. 이 기능으로 앱이 타사 미디어 라이브러리와 더 원활하게 호환될 수 있습니다.

직접 파일 경로와 네이티브 라이브러리를 사용한다면 앱의 매니페스트 파일에서 requestLegacyExternalStoragetrue로 설정하여 범위 지정 저장소를 선택 해제하는 것이 좋습니다. 이렇게 하면 Android 10을 실행하는 기기에서 앱이 예상대로 동작합니다.

다른 앱의 비공개 디렉터리에 액세스

Android 11에서 앱은 외부 저장소 내 다른 모든 앱의 전용 앱별 디렉터리의 파일에 더 이상 액세스할 수 없습니다.

문서 액세스 제한

개발자에게 테스트할 시간을 주기 위해 저장소 액세스 프레임워크(SAF)와 관련된 다음 변경사항은 Android 11을 타겟팅하는 앱에만 적용됩니다.

디렉터리에 액세스

더 이상 ACTION_OPEN_DOCUMENT_TREE 인텐트 작업을 사용하여 다음 디렉터리에 관한 액세스 권한을 요청할 수 없습니다.

  • 내부 저장소 볼륨의 루트 디렉터리
  • 기기 제조업체가 신뢰할 수 있다고 생각하는 각 SD 카드 볼륨의 루트 디렉터리(카드가 에뮬레이션되었거나 삭제 가능한지 여부와 관계없음)
  • Download 디렉터리

파일에 액세스

더 이상 ACTION_OPEN_DOCUMENT_TREE 또는 ACTION_OPEN_DOCUMENT 인텐트 작업을 사용하여 다음 디렉터리에서 개별 파일을 선택하도록 사용자에게 요청할 수 없습니다.

  • Android/data/ 디렉터리 및 모든 하위 디렉터리
  • Android/obb/ 디렉터리 및 모든 하위 디렉터리

변경사항 테스트

이 동작 변경사항을 테스트하려면 다음 단계를 따르세요.

  1. ACTION_OPEN_DOCUMENT 작업을 사용하여 인텐트를 호출합니다. Android/data/Android/obb/ 디렉터리가 모두 나타나지 않는지 확인합니다.
  2. 다음 중 한 가지 방법을 사용합니다.
  3. ACTION_OPEN_DOCUMENT_TREE 작업을 사용하여 인텐트를 호출합니다. Download 디렉터리가 표시되고 디렉터리와 연결된 작업 버튼이 비활성화되는지 확인합니다.

권한

Android 11은 저장소 권한과 관련된 다음과 같은 변경사항을 도입합니다.

임의의 버전 타겟팅

첫 번째 대화상자에는 설정의 '허용'이라는 링크가 표시됩니다.
그림 1. 앱에서 범위 지정 저장소를 사용하고 READ_EXTERNAL_STORAGE 권한을 요청할 때 표시되는 대화상자

다음 변경사항은 앱의 타겟 SDK 버전에 관계없이 Android 11에서 적용됩니다.

  • 저장소 런타임 권한이 파일 및 미디어로 이름이 바뀝니다.
  • 범위 지정 저장소를 선택 해제하지 않은 앱이 READ_EXTERNAL_STORAGE 권한을 요청하는 경우 Android 10과 다른 대화상자가 사용자에게 표시됩니다. 이 대화상자는 그림 1과 같이 앱에서 사진과 미디어에 액세스할 수 있는 권한을 요청하고 있다는 것을 나타냅니다.

    사용자는 시스템 설정에서 READ_EXTERNAL_STORAGE 권한이 있는 앱을 확인할 수 있습니다. 설정 > 개인정보 보호 > 권한 관리자 > 파일 및 미디어 페이지에서 권한이 있는 각 앱이 모든 파일에 허용 아래에 나열됩니다.

    참고: 앱이 Android 11을 타겟팅하면 '모든 파일'의 이 액세스 권한은 읽기 전용입니다. 이 앱을 사용하여 공유 저장공간의 모든 파일을 읽고 쓰려면 모든 파일 액세스 권한이 있어야 합니다.

Android 11 타겟팅

앱이 Android 11을 타겟팅하는 경우 WRITE_EXTERNAL_STORAGE 권한 및 WRITE_MEDIA_STORAGE 독점 권한은 더 이상 추가 액세스를 제공하지 않습니다.

모든 파일 액세스

일부 앱에는 파일 관리나 백업 및 복원 작업과 같이 광범위한 파일 액세스가 필요한 핵심 사용 사례가 있습니다. 이러한 앱은 다음을 실행하여 모든 파일 액세스 권한을 얻을 수 있습니다.

  1. MANAGE_EXTERNAL_STORAGE 권한을 선언합니다.
  2. ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 인텐트 작업을 사용하여 앱에 모든 파일 관리 액세스 허용 옵션을 사용 설정할 수 있는 시스템 설정 페이지로 사용자를 안내합니다.

모든 파일 액세스 권한은 다음 권한을 부여합니다.

앱은 MediaStore API 또는 원시 파일 경로를 사용하여 이러한 파일에 액세스할 수 있습니다. 앱이 저장소 액세스 프레임워크를 사용한다면 이 앱을 사용하여 모든 파일 액세스 권한이 제공하는 추가 파일 및 디렉터리에 액세스할 수 없습니다.

MANAGE_EXTERNAL_STORAGE 권한을 사용하면 앱이 공유 저장공간에 있는 잠재적으로 민감한 정보에 액세스할 수 있습니다. 향후 버전의 개발자 프리뷰에서 Google Play를 찾아 이 권한이 필요한 앱에 관한 가이드라인을 제공하세요.

이 특수 권한과 Android 11에서 Android 저장소 API의 기타 변경사항에 관한 자세한 내용은 Android의 최신 사용자 저장소라는 매체 도움말을 참조하세요.