본문 바로가기
안드로이드/구글

안드로이드 10(Q) - Scoped Storage

by 안드뽀개기 2022. 10. 18.
반응형

 

이번엔 정라하려고 했다가 미뤄두었던 안드로이드 10(Q) 에서의 새로운 저장소 Scoped Storage 정책에 대해 정리해보고자 작성합니다.

 

Q 버전 이전의 기존 정책에서는 나의 앱이 디바이스의 어떤 파일에 접근하려면 사용자에게 저장소 권한만 얻으면 가능했습니다. 폴더를 탐색하여 파일의 경로(Path)를 얻어 데이터를 읽고 쓰는 작업이 가능했습니다.

 

하지만, Q 버전 부터는 나의 앱에서 디바이스의 다른 파일에 접근하는게 불가능해졌습니다. 구글에서는 보안상의 이유다른 앱의 공용공간에 접근이 불가능하고 공용 미디어 파일에 접근할 때에는 READ_EXTERNAL_STOARGE 권한으로 접근해야 합니다. 그리고 자신의 앱의 공간에서는 권한이 필요 없도록 구조를 바꾸었습니다.

 

내부 저장소 vs 외부 저장소

안드로이드의 저장소는 내부 저장소와 외부 저장소로 나뉩니다.

내부 저장소는 /data/ 로 시작하는 경로를 가진 저장소이고, 외부 저장소는 /storage/ 로 시작하는 경로를 가진 저장소입니다.

 

 - 내부 저장소의 데이터 폴더 : /data/data/[앱의 패키지명]/

 - 외부 저장소의 데이터 폴더 : /stoarge/emulated/0/Android/data/[앱의 패키지명]

Scoped Storage는 외부 저장소에 대한 새로운 정책이므로, 아래의 내용들은 대부분 외부 저장소와 관련된 내용이라고 생각하시면 됩니다.

 

Q 버전 이전의 외부 저장소 정책

Q 버전 이하에서, 외부 저장소는 다음과 같은 폴더들이 있습니다.

 - 앱 데이터 폴더 : /stoarge/Android/data/[앱의 패키지명]/

 - 공용 폴더(DCIM, Pictures 등) : /storage/[폴더 명]

 

앱 데이터 폴더는 앱이 삭제되면 함께 삭제되어 데이터가 제거됩니다.

반면, 공용 폴더에 저장해두었던 데이터들은 앱이 삭제되어도 글대로 유지됩니다. 이 폴더에 읽거나 쓰려면 READ_EXTERNAL_STOAGE 혹은 WRITE_EXTERNAL_STOARGE 권한을 얻어야 합니다.

 

 

Q 버전부터의 외부 저장소 정책(Scoped Storage 정책)

구글은 Scoped Storage 정책을 3개로 나누어 설명하고 있습니다.

 - 개별 앱 데이터 폴더

 - 공용 미디어 파일들(Media - 사진 및 동영상, 음악 폴더)

 - 공용 파일들(Downloads 폴더)

 

1. 개별 앱 접근 방법

 개별 앱 공간은 따로 권한요청이 필요 없고 Context.getExternalFilesDir()를 통해 자신의 앱 공간에만 접근할 수 있습니다. 기존에는 EXTERNAL_STORAGE권한으로 다른 앱의 개별공간을 접근했지만 변경된 후 부터는 접근할 수 없습니다.

 

  경로: /storage/emulated/0/Android/data/com.app.a/files/Pictures

  접근: getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath

 

  경로: /storage/emulated/0/Android/data/com.app.a/cache

  접근: etExternalCacheDir().getAbsolutePath

 

 

2. 공용공간 접근방법(Media - 사진 및 동영상, 음악)

 Q 버전부터는 MediaStore api를 사용하여 미디어 관련 공용공간에 접근할 수 있습니다. MediaStore은 사용자가 가지고있는 파일들을 다른 앱에서도 사용될 수 있도록 설계된 api입니다. Media디렉토리 안에서는 자신의 앱에 해당하는 곳은 권한없이 사용할 수 있습니다. 이전 버전에서는 WRITE_EXTERNAL_STORAGE만 있으면 다른 앱의 공용파일에도 접근할 수 있었지만, 보안상의 이슈로 10부터는 이를 막아놓은 것입니다.

 

 공용 폴더 안에 있는 미디어 파일들은 MediaStore를 통해 읽을 수 있습니다. 예를 들어, 사진 또는 동영상 파일을 찾고 싶으면 공용 폴더 아래의 모든 파일들을 탐색해서 찾는 것이 아니라 MediaStore에 쿼리를 하여 Uri 객체를 얻어 사용해야 합니다.

 

3줄 요약:

 1) 공용공간 내부 나의 앱 폴더에는 권한 없이 접근이 가능하고 다른 앱 폴더에는 접근할 수 없다!

 2) 공용공간 내부에서 나와 다른 앱 폴더를 제외한 영역의 폴더에는 READ_EXTERNAL_STOAGE 권한을 얻어서 접근이 가능하다!

 3) 공용공간 내부에서 나와 다른 앱 폴더를 제외한 영역의 폴더에 파일을 생성하는 것은 권한이 없도 된다!

 

 결국, Scoped Storage에서는 WRITE_EXTERNAL_STORAGE 권한이 필요가 없어졌음을 알 수 있다. 권한 없이 파일을 생성할 수 있고, 다른 앱의 전용 공간에는 파일을 생성할 수 없기 때문이다.

 

3. 공용공간 접근방법(Downloads 부분 - 기타 파일들)

 공용 미디어 파일들을 제외하고, Downloads 폴더 등을 접근할 때는 SAF(Storage Access Framework)를 이용해야 합니다. SAF는 Android Lollipop 부터 소개되었지만, 시스템 구조가 직접 접근하는 방식보다 간단하지 않고 UX가 복잡해 많은 앱들이 사용하지 않았습니다. SAF는 폴더들을 관리하는 DocumentsProvider와, 사용자가 앱에 파일 접근을 허용할 수 있도록 UI를 제공하는 DocumentsUI로 이루어져 있습니다.

 

 Q에서 앱들은 공용 파일들에 접근할 때 DocumentsUI의 액티비티를 띄워 사용자에게 어떤 파일에 대한 접근 권한을 부여받아야 합니다. 그 이후에, 그 파일을 읽거나 쓰도록 해야 합니다. 사용자가 파일 또는 폴더를 선택하기 때문에 사용자는 더 좁은 범위로 권한을 부여할 수 있게 되었습니다.

 

 

 

 

내용 및 이미지 출처:

1.

https://codechacha.com/ko/android-q-scoped-storage/

2.
https://velog.io/@bonimddal2/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-QAPI-29%EC%9D%B4%EC%83%81%EC%97%90%EC%84%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EB%A3%A8%EA%B8%B0

반응형