관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Scoped Storage(범위지정 저장소) 정리 (Legacy Storage와 차이점 정리) 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] Scoped Storage(범위지정 저장소) 정리 (Legacy Storage와 차이점 정리)

막무가내막내 2020. 9. 29. 20:23
728x90

 

[2021-06-04 업데이트]

 

 

이전에 안드로이드 11에 대해 공부했던 내용 중 안드로이드 10에서 나온 거지만 11에서도 언급된 범위 지정 저장소(Scoped Storage)에 관련 사항들에 대해 정리해보려합니다. ㅎㅎ

 

그림과 함께 간단하게 정리하면 다음과 같습니다. 

 

 

1.Scoped Storage는 안드로이드 10 버전에서 등장했습니다.

 

2. 내부저장소의 개별 앱 공간은 이전과 동일합니다 (개별앱 공간 공용공간 관련하여는 뒤에서 다룰 예정이니 그림보며 앱의 개인적인 저장공간이구나라고 이해하시면 됩니다)

 

3. 외부저장소의 개별 공간이 샌드박스 형식으로 격리됩니다.

 

4. 외부저장소의 공용공간이 사진 및 동영상, 음악, 다운로드 구조로 분리되고 이 안에서 패키지 별로 또 구분되어 저장되게 변했습니다.

+)기존의 개발자가 자유롭게 파일을 저장할 수 있던 Public Files 공용 공간이 사진 음악 다운로드로 4개의 조직화된 수집공간으로 나누어 관리가 되는 거라 보시면 됩니다.

 

4번에 의해 범위지정저장소는 기존 공간과 파일 소유자(ownership)가 명확히 분리되어 관리가 쉬워지고 앱이 얼마나 많은 저장 공간을 차지하고 있는지 쉽게 확인 이 가능해진다는 장점이 생깁니다. 보안도 좋아지고요.

 

* 그림에서 외부저장소에 공용공간(사진,음악,다운로드)에 패키지 그림도 있어서 햇갈릴까봐 추가 설명을 하면 사진 및 동영상안에 각각의 앱 데이터들이 들어간다는거지 앱의 디렉토리가 생기는게 아닙니다. 즉 외부저장소에서 공용공간과 앱패키지별로의 개인 공간으로 나뉜다보면됩니다. 

 

[참고]

샌드박스 구조외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태를 말합니다.

 

그리고 사진 및 동영상, 음악을 합쳐서 미디어라 통칭하고 미디어 외의 모든 문서, zip 파일 등은 다운로드에 해당합니다.

 

 

 


. 구글 IO 영상에서 발표한 ppt 영상의 사진인데 참고하면 좋을 것 같아 가지고 왔습니다. 

 

구글에서는 참고로 Scoped Storage를 분화한 컬렉션으로 구분하고 광역 저장소에 대한 접근을 제한한다는 개념이라고 정의하고 있습니다

 

 

 

 


 

저는 처음에 Scoped Storage에 대해 알아볼 때 다음과 같은 비유가 가장 와닿아서 가져와봤습니다. ㅎㅎ

기존에는 창고(공용공간) 안에 물품들이(데이터) 막 담겨있고, 열쇠만(권한) 있다면 누구나 가져가서 쓸 수 있는 상태지만 범위지정저장소 부터는 사물함처럼 물품들이 종류별로 분류되어 자물쇠가 채워져 있고, 각각의 열쇠가 있어야 가져다 쓸 수 있는 형태라고 보면 됩니다.

 

 

 

 

 

 

 

 


https://developer.android.com/training/data-storage

범위지정저장소로 저장소 구조가 바뀌면서 파일접근 관련해서도 변화가 생겼는데요.

범위지정저장소의 각 공간에 대한 접근 방법을 정리한 표입니다.

하나씩 정리하며 살펴보도록 하겠습니다.

 

 

 


 

먼저 개별 앱 공간 접근 방법입니다.

-> 자기 자신의 개별앱 공간의 접근을 위한 권한요청이 필요 없고 getExnternalFilesDir() 을 통해 접근이 가능하며 앱 삭제시 함께 제거됩니다.

 

 

 

Scope Storage 이전의 레거시 저장소와 비교해봤습니다.

[차이점]

Scoped Storage 이후 샌드박스 구조로 되면서 EXTERNAL_STORAGE 권한으로 자신의 앱이 아닌 다른 개별 공간을 마음대로 읽고 쓸 수 없다는 거 외에 큰 차이점이 없습니다.

[공통점]

1. 개별 앱 공간(Private Files) 권한 없이 읽기/쓰기 접근 가능

2. 삭제시 함께 제거됨

3. getExternalFilesDir() 혹은 getExternalCacheDir() 로 접근

 

만약 삭제시에도 파일을 보존하고 싶다면 MediaStore 통해 파일을 생성한 후 메타데이터를 추가해야합니다.

아니면 manifestandroid:allowBackup="true” 를 설정 시 앱 정보를 구글 클라우드에 저장하게 되는데

이렇게 하면 앱을 재설치 했을 때 클라우드에서 데이터를 복원할 수 있습니다.


 

 

두번째로 미디어에서의 접근 방법입니다.

미디어에서는 자신의 앱이 아닌 다른 파일에 접근 및 읽어올 때는 READ_EXTERMAL_STORAGE 권한이 필요하고

이 권한 외에도 READ_MEDIA라고 새로 추가된 권한이 있는데 그건 뒤에서 살펴보겠습니다.

접근은 MediaStore API 를 사용하고 앱이 삭제되도 제거 되지 않는다는 특징을 가지고 있습니다.

MediaStore API란 사용자가 가지고 있는 파일들을 다른 앱에서도 사용할 수 있도록 설계된 API 입니다.

MediaStore API 외에 File API, Storage Access Framework 를 통해서도 접근 가능하나 구글에서는 다음 사진과 같이 MediaStore 사용을 권고하고 있습니다.

 

 

 

 

 

 

이전 Legacy Storage와 비교해서 살펴보겠습니다.

레거시 스토리지는

READ_EXTERNAL_STORGE, WRITE_EXTERNAL_STORGE 를 사용해야 외부 공용 저장소(Public Files) 접근이(읽기, 쓰기) 가능했고 이 권한이 있으면 누가 생성한 파일이든, 어떤 경로에 저장된 파일이든 관계없이 모든 파일에 접근 및 조작이 가능 했습니다.

이게 말로 들으면 무적 같은 느낌이라 되게 좋아 보이는데 다른 앱에 마음대로 접근 할 수 있다는 것은 보안상 좋지 않다는 단점이 있습니다.

 

범위지정저장소는 

미디어콜렉션 안에서 자신의 앱에 해당하는 곳은 접근 권한 요청없이 접근이 가능하다는 차이점이있습니다.

이를 통해 기존의 불필요한 사용자 권한 요청을 줄일 수 있다는 장점도 생겼습니다.

하지만 다른 앱이 생성한 미디어 파일에 접근하는 경우는 권한이 필요하고 레거시와 차이점이 있습니다. 이에 대해 이어서 살펴보겠습니다.

 

 

 

 

 

다른 앱이 생성한 미디어에사의 파일에 접근하는 경우는 권한이 필요

다른 앱이 생성한 미디어 파일에 대한 접근 권한법을 요약 정리하면 다음과 같습니다.

 

-MediaStore 사용할 경우(10 버전에서 새로 생김)

READ_MEDIA_IMAGES 

READ_MEDIA_VIDEO

READ_MEDIA_AUDIO 

 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 는 안드로이드 Q 베타 3 버전에서 삭제되어 정식 출시되지 않은 퍼미션입니다.

 

-MediaStore 혹은 MediaStore 외의 방법을 사용할 경우

READ_EXTERNAL_STORAGE

 

-더 이상 추가 엑세스 제공 X-

WRITE_EXTERNAL_STORAGE

WRITE_MEDIA_STORAGE

 

앱이 생성한 미디어 파일에 접근하는 경우는 권한이 필요한데 READ_MEDIA_IMAGES,  READ_MEDIA_VIDEO ,READ_MEDIA_AUDIO를 사용하시면 됩니다.

이것들은 안드로이드 10에서 새로 추가된 권한이고 각각 사진, 동영상, 음성을 읽는데 필요합니다.

기존의 READ_EXTERNAL_STORAGE 로도 가능한 일이었지만 구글은 앱에서 미디어 파일로 작업할 때는 광범위한 권한요청이아닌 필요한 권한만 요청하라고 권고하고있습니다

하지만 READ_EXTERNAL_SOTRAGE 를 현재 사용하고 계셔도 안드로이드 11버전에서 잘 동작하기 때문에 계속 사용하셔도 무관합니다.

 

MediaStore 외의 다른 방법을 사용할 경우라면 똑같이 READ_EXTERNAL_STORAGE를 사용하면 됩니다.

앱이 Android 11을 타겟팅하는 경우 WRITE_EXTERNAL_STORAGE 권한 및 WRITE_MEDIA_STORAGE 독점 권한은 더 이상 추가 액세스를 제공하지 않는다는 점에 주의하셔야합니다. WRITE 권한이지만 안드로이드 11에서는 WRITE 기능을 못한다고 보시면 됩니다.  11버전 부터는 미디어 공간에서 다른 앱을 수정하는 방법이 변경되었기 때문입니다. 이에 대해서는 바로 뒤에서 살펴보겠습니다.

 

정리하면 안드로이드 11을 타겟팅 시 위에서 언급한(주황 배경색) 순서대로 우선시하여 사용하시길 추천 하지만 .READ_EXTERNAL_STORAGE 을 사용하셔도 무방합니다.

그리고 WRITE_EXTERNAL_STORAGE 사용시 추가엑세스 제공을 안한다는점을 주의하셔야합니다.

 

[구글 문서 참고]

 

 

 

 

수정방법

미디어 스토어와 관련된 READ_MEDIA 권한은 말 그대로 읽기만 가능하고 WRITE_EXTERNAL_STORAGE  권한은 추가 엑세스를 제공하지 않게 바뀌었다고 했는데요.

만약 다른 앱의 수정을 원한다면 안드로이드 10에서 추가된 역할(role) 이라는 해당 기능을 위한 기본 앱이 되어야 가능합니다.

https://brunch.co.kr/@huewu/8 참고

 

 

 

 

 

 

[MediaStore API참고]

미디어 스토어 사용방법에 대한 참고 링크를 남겨 놓습니다. 

codechacha.com/ko/android-mediastore-read-media-files/

 

안드로이드 - MediaStore에서 미디어 파일 정보 읽는 방법

Media provider는 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더입니다. MediaStore는 앱이 Media provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다

codechacha.com

github.com/android/storage-samples/tree/master/MediaStore

 

android/storage-samples

Multiple samples showing the best practices in storage APIs on Android. - android/storage-samples

github.com

developer.android.com/training/data-storage/files/media?hl=ko

 

외부 저장소에 있는 파일 작업하기  |  Android 개발자  |  Android Developers

MediaStore API는 다음과 같은 잘 정의된 유형의 미디어 파일에 액세스할 수 있는 인터페이스를 제공합니다. MediaStore는 또한 MediaStore.Files라는 컬렉션도 포함하며, 이 컬렉션을 통해 모든 유형의 미��

developer.android.com

 

 

 

 

구글 안드로이드 개발자문서에 있는 MediaStore API 샘플을 갖고와봤습니다.

정리하면 다음과 같습니다.

 

1. 먼저 다른 앱의 미디어스토어에 접근하려는거면 READ_EXTERNAL_STORAGE 같은 외부저장소 접근권한이 필요합니다.

 

2. 미디어 저장소 추상화와 상호작용하려면 ContentResolver를 사용해 query를 해야하는데 검은색 스니펫을 보시면 Query 메소드가 5개의 파라미터를 필요합니다. 각각의 파라미터를 살펴보면 다음과 같습니다.

 

Uri: 찾고자하는 데이터의 Uri입니다.

Projection: DBcolumn과 같습니다. 결과로 받고 싶은 데이  터의 종류를 알려줍니다.

Selection: DBwhere 키워드와 같습니다. 어떤 조건으로 필터링된 결과를 받을 때 사용합니다.

Selection args: Selection과 함께 사용되며 selction에서 물음표에 들어갈 값입니다. 많이 보신 구조일 겁니다.

Sort order: 쿼리 결과 데이터를 sorting할 때 사용합니다.

파라미터들을 사용하여 미디어 파일을 쿼리하고 검색 결과를 받아 볼 수 있습니다.

 

 

 

다음은 5분 이상의 길이를 가진 미디어를 검색하는 미디어 컬렉션 쿼리 예제인데 참고로 가져와봤습니다.

 

 

 

마지막 MediaStore 관련 참고로  구글에서 MediaStore를 밀어주는 만큼 안드로이드 11에서 MediaStore API 관련 method 들이 추가된게 있습니다. 

 

 

다음 구글 문서 링크에서 더 자세히 볼 수 있습니다.

developer.android.com/preview/privacy/storage?hl=ko#media-file-access

 

Android 11의 저장소 업데이트  |  Android 개발자  |  Android Developers

Android 11에서는 플랫폼을 더욱 강화하여 외부 저장소의 앱 및 사용자 데이터를 보다 안전하게 보호합니다. 미리보기 출시에서는 지난해 Android Dev Summit에서 발표한 미디어의 원시 파일 경로 액세

developer.android.com

 


 

 

마지막으로 미디어 파일 외에 모든 파일들이 저장되는 다운로드 공간 접근 방법 입니다.

여기는 권한은 필요없고  저장소 엑세스 프레임워크(SPA)와 시스템 파일 선택기를 통해 사용자가 명시적으로 파일을 선택한 경우 접근이 가능하며 앱 삭제시 제거되지 않습니다.

구글은 앞서 미디어 스토어 사용을 권고하는 것처럼 여기서는 스토리지 에세스 프레임워크(SPA)를 사용을 권고하고있습니다.

 

 

 

 

 

저장소 엑세스 프레임워크(Storage Access Framewrok)에 대해 간략하게 살펴보겠습니다.

다운로드 공간에 접근하기 위해 사용되며 크게 문서제공자, 선택기 UI, 클라이언트 앱으로 구성되며 사용자가 일관된 방식으로 파일을 탐색하고, 읽고 쓸 수 있는 환경을 제공합니다.

그리고 왼쪽 그림에서 보시는거와 같이 클라이언트앱과 제공자와 프로바이더는 서로 직접적으로 상호작용하지 않고 시스템 유아이를 통해 상호작용하는 것을 볼 수 있습니다.

이러한 상호작용을 위해서는 ACTION_OPEN_DOCUMENT 또는 ACTION_CREATE_DOCUMENT 인텐트를 실행시면 됩니다.

참고로 오른쪽에 일관된 방식으로 파일을 탐색한다는 뜻은 오른쪽 그림처럼 선택기 UI가 시스템 앱으로 유일하게 제공된다는 점입니다.

 (갤러리를 예로 들면 똑같이 생긴 이미지 파일선택 UI보여준다고보시면됩니다.)

 

 

 

 

SPA의 예제 코드도 봐보겠습니다.

왼쪽은 ACTION_OPEN_DOCUMENT를사용하여 이미지 파일이 들어 있는 문서 제공자를 검색하는 코드이고

오른쪽은 사용자가 선택기에서 문서를 선택한 후 onActivityResult() 통해 선택한 문서 URI 응답받는 코드입니다.

오른쪽은 사용자가 선택기에서 문서를 선택한 후 onActivityResult()가 호출됩니다resultData 매개변수에는 선택한 문서를 가리키는 URI가 포함됩니다getData()를 사용하여 URI를 추출합니다. 이제 추출한 URI를 사용하여 사용자가 원하는 문서를 검색하면 됩니다. 예를 들면 다음과 같습니다

 

 

저장소 접근 프레임워크에 대해서는 다음 사이트에서 더 자세히 보실 수 있습니다.

공식 문서 : developer.android.com/guide/topics/providers/document-provider?hl=ko

블로그 : codechacha.com/ko/android-storage-access-framework/

brunch.co.kr/@huewu/14

 

 


 

지금까지 말씀 드린 범위지정저장소에 의한 저장공간 변화로 외부저장소를 사용하던 많은 앱들이 영향을 받고 대응이 필요했습니다.

개발자들이 Scoped Storage 에 바로 대응하는데 시간이 걸리고 힘든점을 알기 떄문에 구글에서는 안드로이드 10 버전에서 requestLegacyStorage true로 설정시 영어 해석 그대로  레거시 스토리지 모델을 사용할 수 있게 해줬었습니다.

 

[참고]

TargetAndroid 10 (API level 29)로 올린 앱이, 10이상의 단말에 새로 설치되는 경우에만 Storage mode가 활성화 됩니다. Android의 저장소 정책은 앱이 처음 설치했을때의 상태를 유지해준다고 합니다. 만약에 Android P 단말에서 여러분의 앱이 설치가 되고, 사용자의 단말이 Android 10 디바이스로 업그레이드가 되거나, 앱을 Target level 29로 변경하여 업그레이드가 되었을때도기존과 동일한 Storage mode로 동작하게 됩니다.

 

 

 

 

그러나 !!!!

안드로이드 11 부터는 이 플래그를 무시하게 됩니다. 따라서 Scoped Storage 에 대응하고 기존 데이터 필요 시

디렉터리로 데이터 이전 하는 작업이 필요합니다

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

 

https://developer.android.com/preview/privacy/storage?hl=ko

 

 

 

 

다음링크에서 저장소 이전 관련하여 더 자세히 볼 수 있습니다.

developer.android.com/preview/privacy/storage#migrate-data-for-scoped-storage

 

Android 11의 저장소 업데이트  |  Android 개발자  |  Android Developers

Android 11에서는 플랫폼을 더욱 강화하여 외부 저장소의 앱 및 사용자 데이터를 보다 안전하게 보호합니다. 미리보기 출시에서는 지난해 Android Dev Summit에서 발표한 미디어의 원시 파일 경로 액세

developer.android.com

 

www.youtube.com/watch?v=RjyYCUW-9tY

 

 


 

[보충 자료]

 

추가적인 내용으로 안드로이드 11부터 저장소 접근 내용이 좀 바꼈습니다. 

안드로이드 11부터는  범위 지정 저장소를 선택 해제하지 않은 앱이 READ_EXTERNAL_STORAGE권한을 요청하는 경우 Android 10과 다른 대화상자가 사용자에게 표시됩니다.

밑 사진은 제가 테스트 해본 화면인데 기존 Photo media and files 에서 photo, files  권한 내용이 변경된 점과

같은 안드로이드 10이여도 범위지정저장소를 적용했냐 안했냐에따라 다른 대화상자가 뜸을 볼 수 있었습니다.

 

 

 

 

[그 외 추가 정보]

 

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

 

이를 대체하기 위해 모든 파일 엑세스하는 방법이 새로 생겼습니다.

일부 앱에는 파일 관리나 백업 및 복원 작업과 같이 광범위한 파일 액세스가 필요한 핵심 사용 사례가 있는데

이러한 앱은 밑과 같은 과정으로 모든 파일 액세스 권한을 얻을 수 있습니다.

모든 파일 액세스

1. MANAGE_EXTERNAL_STORAGE 권한을 선언 (안드로이드 11에서 생김)

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

developer.android.com/about/versions/11/privacy/storage#all-files-access

 

Android 11의 저장소 업데이트  |  Android 개발자  |  Android Developers

Android 11(API 수준 30)에서는 플랫폼을 한층 더 강화하여 외부 저장소의 앱 및 사용자 데이터를 더욱 안전하게 보호합니다. 이 버전에는 미디어의 원시 파일 경로 액세스 선택, 미디어의 일괄 수

developer.android.com

 

 

 


 

[최종요약]

 

마지막으로 안드로이드 11의 저장공간 관련을 요약하면 다음과 같습니다.

 

1.안드로이드 11버전 타켓팅시 Scoped Storage 대응

 

2.MediaStore API, SAF 지속적인 지원할 것이니 애용

 

3.자신의 앱 파일인 경우 접근이 더 자유로워졌지만 다른 앱 파일의 접근할 경우는 더 엄격해짐

 

 

 

 

이상 공부한 내용에 대해 정리를 끝마치겠습니다.


[참고]

developer.android.com/training/data-storage/files/external-scoped?hl=ko

 

범위가 지정된 외부 저장소 액세스 관리하기  |  Android 개발자  |  Android Developers

사용자에게 파일의 더 많은 권한을 제공하고 파일이 복잡해지는 것을 제한하기 위해, Android 10(API 레벨 29) 이상을 타겟팅하는 앱은 외부 저장소로 범위가 지정된 액세스 또는 범위 지정 저장소��

developer.android.com

www.youtube.com/watch?v=UnJ3amzJM94

brunch.co.kr/@huewu/8

 

안드로이드 Q Scoped Storage 이해하기

개발자를 위한 안드로이드 Q #2 | 개발자를 위한 안드로이드 Q #6 안드로이드 Q Scoped Storage에서 살아남기 시작하기 전에... 본 포스트는 Scoped Storage 관련된 내용을 다루며, 3월 14일 공개된 안드로이�

brunch.co.kr

www.youtube.com/watch?v=RjyYCUW-9tY

 

medium.com/@chapi79/%EC%9D%B4%EC%A0%9C%EB%8A%94-android-scoped-storage%EB%A5%BC-%EC%A4%80%EB%B9%84%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C-3d5c22a5a0a9

 

이제는 Android Scoped Storage를 준비해야 할 때

Android 10에서 외부저장소에 대해 Scoped Storage Mode가 소개되었습니다. 이에 영향을 받는 애플리케이션은 2020년 상반기까지는 Scoped mode에 대한 준비가 되어있어야 합니다.

medium.com

developer.android.com/training/data-storage#scoped-storage

 

데이터 및 파일 저장소 개요  |  Android 개발자  |  Android Developers

Android는 다른 플랫폼의 디스크 기반 파일 시스템과 유사한 파일 시스템을 사용합니다. 시스템은 앱 데이터를 저장하기 위한 다음과 같은 여러 옵션을 제공합니다. 앱별 저장소: 내부 저장소 볼��

developer.android.com

 

[파일경로]

https://android.stackexchange.com/questions/205430/what-is-storage-emulated-0

 

What is /storage/emulated/0/?

Recently, I've figured out that if I delete files from /sdcard/Download it deletes files from /storage/emulated/0/Download. And if I add the files into /sdcard/Download it duplicates them in /storage/

android.stackexchange.com

https://imnotyourson.com/which-storage-directory-should-i-use-for-storing-on-android-6/

 

Which storage directory should I use for storing on Android 6+

Android File System Structure Android uses the Linux file system structure which has a single root. So, both internal storage and external storage are directories which are partition in Android file system. Partitions There's some storage related partition

imnotyourson.com

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments