회사에서 Url링크로 펌웨어를 다운받고 블루투스 디바이스에게 펌웨어를 넘겨주는 프로젝트를 담당했었다. 초기 계획으론 링크 다운로드이니 당연히 외부 저장소의 Downloads폴더에 펌웨어가 위치할거라 생각하기도하고, Retrofit으로 String이나 Int값만 해봤지 .zip파일까지 응답으로 올 거라곤 생각을 못해서 Android의 DownloadManager를 사용하여 저장하려 했었다. 하지만 해당 펌웨어는 회사의 자산이기에 접근성이 있는 외부 저장소에 위치시키기엔 다소 민감한 문제였고, 그리하여 내부 저장소로 계획을 변경하였는데 여기서 문제가 발생했는데
DownloadManager에서 꾸역꾸역 디렉터리를 내부 저장소 경로로 바꿨지만 에러가 발생, 해당 문제를 하루종일 찾다보니 결국 외부 저장소만 지원한다는 사실을 알게 되었다..
평소 Stack Overflow는 외국인만 득실대서 손이 안가는 사이트였지만 사수님께서 하나의 링크를 찾아 보내주셨고, 그 내용은 Retrofit으로 zip파일을 받는 법이었다. 이는 현재 포스팅과 연관이 없으니 여기에서 따로 포스팅하겠다.
본론으로 와서, 안드로이드의 내부 외부 저장소가 어떤 차이가 있어 이런 제한이 생기고, 어떠한 경우에 써야하는지 알아보려한다.
우선 간략하게 둘을 비교하자면
: OS에서 앱에게 주어진 저장 공간, 자연스럽게 앱이 삭제가 되면 할당된 공간도 사라지기에 폴더 및 파일이 삭제된다.
: 외부SD카드에 있는 저장 공간, 추후 말할 외부 앱 개별 공간은 앱이 삭제되어도 사라지지 않지만, 그 외 경로들은 남아있는다.
느끼듯이, 내부 저장용량보단 외부 저장용량이 더 커 크기가 큰 파일들은 외부에 저장할 일이 발생할 수 있다.
로그에 나와있는대로 저장되는 경로부터가 다르다!
현재 API 레벨별로 방식이 달라져서 이 정도만 말하고 바로 변화된 요소를 살펴보자.
는 이하 동문
외부 저장소에 많은 변화가 생겼다. 이름이 Scope Storage로 변신했는데 해석하면 범위 저장소인데, 접근 유뮤가 확실해져서 단어를 적용한듯 하다.
변화된 정책을 보고 느낀건, 당연히 이게 맞는게 아닌가 싶었다. 전 방식이었다면 악의가 있는 앱이 사용자 핸드폰에 있는 외부 저장소에 있는 파일들을 권한만 있으면 읽거나 수정하거나 삭제하거나 빼올 수 있었기 때문이다. 나는 젊어서 모르겠는데 이에 대한 이슈가 상당히 심각했다고 들었다. 이제는 WRITE권한이 사라져 다른 앱의 파일엔 수정이 불가하도록 변했다.
다른 앱이 만든 파일 내용을 수정하려면 해당 기능을 위한 기본 앱이 되어야한다. 이미지에 접근하고 싶다면 기존 갤러리앱을 해당 앱으로 바꾸면 가능하다고 한다.