개발일지
[Android] Scoped Storage 본문
- 안드로이드 Q 이전 (Legacy Storage)
- 외부저장소가 하나의 거대한 공용 저장소로 동작
- 외부저장소를 읽고 쓸 수 있는 권한이 있으면 누가 생성한 파일인지, 어떤 경로에 지정된 파일인지 관계없이 모든 파일에 접근 가능함 (별다른 제한 없이 모든 종류의 파일을 생성할 수 있음 )
- 개별 앱을 위한 별도의 공간이 마련되어 있음(private files)
안드로이드 Q 이전 - Public Files 공간은 READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE 권한만 있다면 자유롭게 읽고 쓸 수 있음
- 최상위 경로로 가지고 오도록 해던 Environment.getExternalStorageDirectory() 사용 못함
- 안드로이드 Q 이후 (Scoped Storage)
- → 기존 외부 저장소의 Public Files 공간이 완전히 사라지고 안드로이드Q 부터는 '사진 및 동영상' / '음악' / '다운로드' / 샌드박스 구조의 '개별 앱 공간'으로 나누어 관리하게 됨.
샌드박스 모델: 외부로 부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 미연에 방지하는 기술→ 외부로부터 유입되는 악성코드로부터 시스템 내 파일이나 프로세스를 보호→ 어떤 코드가 작동 가능한 범위를 제한하고 악용될 수 있는 승인을 제외한 채 필요 최소한의 승인만 부여함→ 악성코드가 활동해 감염되고 침투되더라도 샌드박스 밖으로는 전파되지 못함
- 개별 앱마다 루트 디렉터리가 모두 달라짐 → 더 이상 파일 절대 경로를 사용할 수 없음
2. 개별 앱 공간은 샌드박스 형식으로 isolated 된다. 앱은 다른 앱의 저장 공간에 접근할 수 없다.
3. 자신이 소유한 파일을 읽고 쓰기 위해서는 별도의 권한을 요청할 필요 없다. (기존의 불필요한 사용자 권한 요청을 줄일 수 있음)
→ 공용 공간에 저장된 미디어 파일 중 다른 앱이 생성한 미디어 파일에 접근하는 경우에만 권한이 필요함 → 이를 위해 안드로이드Q 에서는 새롭게 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 권한 추가됨
주의: WRITE_ 형태의 권한이 존재하지 않음 / 다운로드 공간 접근을 위한 권한은 존재하지 않음 (쓰기 권한이 존재하지 않기 때문에 자신이 생성한 파일 외에 다른 앱이 생성한 파일을 수정할 수 없음)
[ 안드로이드 Q 이후 저장소 접근 방식 ]
콘텐츠 유형액세스 방법권한다른 앱 액세스 가능 여부앱 제거 시 파일이 삭제 여부
앱 전용으로 사용되는 파일 |
내부저장소: getFileDir() / getCacheDir() 외부저장소: getExternalFilesDir() / getExternalCacheDir() |
내부저장소: X 외부저장소: X Android 4.4 (API 19) 이상에서는 앱이 외부 저장소 내 앱별 디렉터리에 액세스 하기 위해 저장소 관련 권한을 요청할 필요 없음 |
파일이 내부 저장소 내 디렉터리에 있다면 → X 파일이 외부 저장소 내 디렉터리에 있다면 → O |
O |
공유 가능한 미디어 파일 (이미지, 오디오, 파일, 동영상) |
MediaStore API -MediaStore.Images: 사진 파일 -MediaStore.Video: 비디오 파일 -MediaStore.Audio: 음악 파일 → 공용 폴더 아래의 모든 파일들을 탐색해서 찾는 것이 아니라 MediaStore에 쿼리를 하여 Uri 객체를 얻어 사용해야 함 |
Android 10 (API 29) 이상에서 다른 앱의 파일에 액세스 할 때에는(파일 생성할 때에는 권한 필요 없음) READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE Android 9 (API 28) 이하에서 모든 파일에 권한이 필요함 |
O READ_EXTERNAL_STORAGE 권한 필요 |
X |
다운로드한 파일 | SAF(Storage Access Framework) -Document Provider : 문서(파일)을 제공하는 주체 -Client app :프로바이더가 제공하는 문서를 사용하는 앱 -Selector : 일종의 시스템 UI 로 클라이언트 앱에서 필요한 파일을 사용자가 선택할 때 사용됨 |
X | O ( System File Picker) | X |
→ 앱은 직접 파일에 접근할 수 없고 MediaStore 와 SAF 를 통해 파일에 대한 Uri 를 얻어 접근해야 함
→ 사용자가 앱을 필요로 하는 파일에만 접근 권한을 부여할 수 있게 만들고 보안을 향상 시키려는 목적
참고: https://developer.android.com/training/data-storage
데이터 및 파일 저장소 개요 | Android 개발자 | Android Developers
Android는 다른 플랫폼의 디스크 기반 파일 시스템과 유사한 파일 시스템을 사용합니다. 시스템은 앱 데이터를 저장하기 위한 다음과 같은 여러 옵션을 제공합니다. 앱별 저장소: 내부 저장소 볼
developer.android.com
======================================================================================
[ 파일 접근 변화 ] : 이전에는 외부 저장소 전체를 볼 수 있어서 DCIM, Movies, Music 등 각각의 폴더를 직접적으로 볼 수 있고 관리할 수 있었다면 Scoped storage가 적용된 순간부터는 파일 관리자 앱 만의 공간을 볼 수 있게 됨
[ 권한 요청의 변화 ] : 기존에 권한을 요청할 때 외부 저장소 접근 권한만 요청하고 끝났다면, 앞으로는 사진, 동영상, 음악에 대해서 각각 접근 권한을 요청하게 될 거이고 사용자는 개별적으로 승인해줘야 함. (앱마다 접근할 수 있는 권한이 보다 세부적으로 나누어서 할당할 수 있게 됨)
※ 앱이 Android 10 디바이스에서 Scoped storage 정책을 적용받지 않으려면 다음 중 1가지 방법을 따라야 함
- 안드로이드 API 28 이하를 Target SDK 로 설정
- 안드로이드 API 29 이상을 Target SDK 로 설정하는 경우, requestLegacyExternalStorage 속성을 true 로 설정하며 Scoped storage 정책이 적용되지 않음
- Android 11(R)을 타겟팅하는 앱은 Scoped Storage 정책이 강제로 적용됩니다. requestLegacyExternalStorage 속성으로 이전 방식을 선택할 수 없습니다.
- 하지만 Android 10을 타겟팅하는 앱은 requestLegacyExternalStorage 속성으로 선택이 가능합니다.
'Android' 카테고리의 다른 글
[Android] Observer Pattern / Event Bus (0) | 2021.06.29 |
---|---|
[Android][Kotlin] return and jumps and This-expressions (0) | 2021.06.29 |
[Android][Kotlin] SharedPreferences (0) | 2021.06.29 |
[Android][Kotlin] SwipeRefreshLayout (0) | 2021.06.29 |
[Android] ViewBinding (0) | 2021.06.29 |