안드로이드 10 Scope Storage 에 대해 자세히 알아봅시다.


오늘, 안드로이드 10이 약 8번의 베타버전을 거치고 픽셀 시리즈와 에센셜 폰 등에 배포되며 세상에 나왔습니다.


안드로이드 개발자들에게는 아이스크림 샌드위치 (ICS, Android 4.0) 이상의 강력한 대격변으로 예상되는데요.


프로젝트 메인라인 (Project Mainline) 이 사용자들에게 가장 큰 변화점으로 느껴질 것으로 예상되는 가운데,


앱의 사용성에서의 가장 큰 변화점으로 느껴질 것인 범위 스토리지 (Scope Storage) 정책에 대해 알아봅시다.




# 안드로이드 9 파이 (Android 9 Pie) 까지



지금까지의 안드로이드의 저장소 정책은 심플한 것 같으면서도 약간은 어려운 부분이 있습니다.


시스템 내부의 Internal Storage (아니 오타났네 ㅡㅡ) 가 있으며, 일반적인 앱의 내부 캐시 데이터가 이곳에 저장됩니다.


마치 iOS의 컨테이너 구조와 같이, 일반적인 파일은 이 공간에 저장할 수 있고, 다른 앱은 해당 공간에 존재하는 파일을 볼 수 없습니다.


필요시에 ContentProvider를 통해 앱간 공유가 가능했었죠.


반면 외부 저장소 (External Storage) 에는 앱을 업데이트하며 생긴 apk 파일의 dex 파일 등이 이 공간에 저장됩니다.


External Storage에 있는 앱간 개별 폴더 (주로 /mnt/sdcard/data/data 에 들어가는 데이터들) 는 업데이트로 인해 생기는 샌드박스라 보면 됩니다.


중요한건 Public Storage 였죠.


사용자들은 별다른 제약 없이 지금까지 이 공간에 파일을 USB를 꽂던가 네트워크 다운로드로 하여금 이 공간에 모든 파일을 저장하고 쓸 수 있습니다.


생성자나 수정자에 상관없이, 어떤 앱이 만든 파일이던지 파일이 존재하기만 한다면, 그리고 관련 외부 공간 파일 쓰기 권한 (WRITE_EXTERNAL_STORAGE) 가 존재하는 한


파일을 생성하고, 삭제하고, 수정할 수 있었습니다.


가끔 일부 앱들이 쓸데없이 파일을 이 공간에 이미지 파일등을 저장하면 갤러리에 파일이 노출되곤 하는 앱이 옛날에 많았었죠.




# 안드로이드 10 Scope Storage



그렇다면, 안드로이드 10 Scope Storage 정책이란 무엇인가?


공용 공간에 대해 더 이상 간단하게 사용하지 못하게 한다는 것으로 보시면 됩니다.


최근 구글이 안드로이드 업데이트에서의 주요 관점은 프라이버시 보호였으며, Scope Stroage는 그 일환이라 볼 수 있습니다.


이제, External Storage의 공용 공간을 Image and Videos, Audio, Downloads (이하 미디어 컬렉션) 로 구분하며 파일을 저장합니다.



이 부분이 조금 복잡할 수 있습니다.


External Storage의 개별 앱 컨테이너는 현행과 같이, 자신만 접근이 가능하며, 별다른 권한이 필요 없습니다.

(앱 내에서만 쓰는 파일이라면, 현행과 동일합니다.)


새로운 미디어 컬렉션에 파일을 쓰거나 삭제하는 것도 권한은 필요 없습니다. 다운로드 폴더에 파일을 쓰는 것도 마찬가지입니다.


자신이 만든 미디어 컬렉션이나 다운로드 파일에 접근하는 것도 권한이 필요 없습니다.




타 앱이 만든 파일의 미디어 컬렉션에 접근하기 위해서는,


외부 저장소 파일 읽기 권한 (READ_EXTERNAL_STORAGE) 가 필요합니다.


권한이 없다면, 자신이 만든 파일에만 접근이 가능합니다.




타 앱이 만든 다운로드 폴더의 파일은 조금 상황이 다릅니다.


Storage Access Frameworks (SAF) 를 활용해야 접근이 가능하며, 기본 앱으로 지정이 되어야 타 앱이 만든 파일도 기존처럼 읽고 쓰고 삭제할 수 있습니다.




앱이 삭제될 때는 어떨까요?


자신이 만든 파일은, 앱이 삭제 될 때 자신의 컨테이너를 모조리 안고 지워집니다. 즉, 내부 파일이 모두 삭제됩니다.


하지만, 앱이 삭제된다고 해서 파일을 삭제하지 말아야 할 때도 있습니다.


예를 들어, 사진 앱을 만들었고 사용자가 여자친구 사진을 엄청나게 찍었는데 앱을 지우면서 여자친구 사진이 모조리 날아간다면 말입니다.


이렇게 되기 싫다면, 해당 파일을 MediaStore에 저장하면 됩니다.




즉, 마치 리눅스의 정책처럼 자신이 만든 파일과 아닌 파일의 경계가 확실해졌다고 볼 수 있습니다.




간단히 정리하면,


1. 공용 공간이 3가지 분류 (이미지&동영상, 오디오, 다운로드) 로 구분됩니다.


2. 앱은 각자의 컨테이너를 갖고 있으며 해당 폴더에 읽고 쓰는 것은 권한이 필요 없습니다.


3. 앱이 삭제 될 때, 각자의 컨테이너가 모두 삭제됩니다.


4. MediaStore에 파일을 저장하면, 권한이 있는 앱들은 해당 파일을 볼 수 있습니다. 앱이 삭제되어도 파일은 지워지지 않습니다.


5. 타 앱이 만든 파일을 "읽고" 싶다면, 관련 권한 (READ_EXTERNAL_STORAGES) 권한이 필요합니다.

(정식 배포에서 READ_MEDIA_IMAGES 등 삭제됨)


6. 다운로드 폴더에 접근하고 싶다면 저장소 액세스 프레임워크 (SAF) 를 사용해야 합니다.


7. 다운로드 폴더의 파일을 기존처럼 쓰고 읽고 삭제하고 싶다면, 역할 (Role) 정책에 의해 기본 앱 (Default App) 으로 선택되어야 합니다.


8. 타 앱에게 파일을 공유하고 싶다면 기존처럼 contentProvider를 사용합니다.


9. 즉, 이제 모든 파일을 읽고 쓰고 하는 것은 사용자에게 해당 기능에서 선택받은 단 1개의 앱만이 가능합니다.




뭔소린지 모르시겠죠? 저도 쓰면서도 좀 헷갈리지만 암튼 그렇습니다..


어찌되었든, 이런 정책은 더 이상 개발자들이 무분별한 외부 저장소 권한을 요청하지 말라는 뜻으로 보이기도 합니다.


현재 이 정책은 베타 초기에는 필수요소였으나, 현재는 targetSDK가 29 (안드로이드 10) 일 경우에 한해 선택 적용되었습니다.


약 1년의 유예기간 동안 앱들이 대응하고, 그 다음 안드로이드 11 (아마도..?) 에서 필수요소가 되었을 때 효과를 크게 볼 수 있겠습니다.

이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET