본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] 어플리케이션 외장메모리 ( SD card )에 설치하는 방법.

by 돼지왕 왕돼지 2012. 2. 9.
반응형

[Android/안드로이드] 어플리케이션 외장메모리 ( SD card )에 설치하는 방법.


참조 : https://developer.android.com/guide/topics/data/install-location.html


안녕하세요 돼지왕왕돼지입니다.
오늘은 앱을 설치시부터 외장 메모리 ( sd card ) 에 설치하는 방법에 대해 알아보고자 합니다.


이거 원래부터 가능했던 거 아닌가용?

 
아닙니다용. 요즘은 대부분의 유저가 2.2 버전 이상의 안드로이드를 사용하지만,
안드로이드 2.2 버전 ( API Level 8 ) 부터 어플리케이션을 외부 메모리에 설치할 수 있는 기능이 추가되었습니다. 
이전 버전에서 내장 메모리가 적어 앱을 설치하는 데 제한이 많아서 나온 방책이겠죠?



어떻게 해야 앱을 처음부터 SD Card ( 외장 메모리 ) 에 설치하죠?


다음의 설정값을 통해서 간단하게 원하는 바를 이룰 수 있습니다.

@manifest의 <manifest> tag

android:installLocation = "preferExternal" 
android:installLocation = "auto" 
android:installLocation = "internalOnly"   


이 설정값을 주지 않으면 default로 무조건 내장 메모리에 설치하게 되어 있습니다.
물론 사용자가 [Setting] - [Apps] 쪽으로 가서 해당 앱을 외장 메모리로 강제 이동을 시킬 수는 있지만 말이죠.

 

설정값에 대해 설명해주세요.

 

preferExternal

 
이 속성값은 어플리케이션을 "무조건 먼저" 외부 저장장치에 설치해달라고 요청하는 것입니다. 하지만 앞서 "먼저" 란 글에서 느끼셨겠지만, 반드시 외장 메모리에 설치된다는 보장이 없습니다. 만약 외장 메모리에 빈 공간이 없다면, 즉 용량이 부족하다면 내부메모리에 설치가 됩니다. 물론 위에서도 말했지만, 사용자가 임의로 내장 메모리 <-> 외장메모리 로 앱의 위치를 바꿀 수는 있습니다.


internalOnly


이 녀석은 internal 에 무조건 설치하는 녀석입니다. 추후 다루겠지만, internal memory 에 저장되어야만 하는 앱들이 있습죠. default 값입니다.

 

auto


시스템에서 몇 가지 요소를 기반으로 해당 어플리케이션을 어디에 설치할지를 알아서 결정합니다. 물론 마찬가지로 설치 후 내부/외부 메모리로 앱을 자유자제로 옮길 수 있습니다. 



앱이 외장 메모리에 설치된다면, 내부 메모리에 설치되는 것과 뭔가 많이 다른가요?


- 먼저 외부 저장장치( 보통 SD Card ) 가 마운트 되어있는 한, 어플리케이션의 성능 상에 어떤 차이점도 없습니다.

*2017.09.14. 첨언

아래 문장을 보면 실제 코드부는 internal 에 저장됨을 확인할 수 있다. 즉 apk 안의 resource 내용을 load 하는 것은 external 을 통해 해야하므로 external storage 를 읽는만큼의 performance 저하가 "있을 수 있다". ( 체감할 정도의 성능저하가 발생할지는 케바케일듯하다. )

- 외부저장장치에 설치할 경우, .apk 파일 자체가 외부 저장장치에 저장이 됩니다. 하지만, 든 private 사용자 데이터, 데이타 베이스, .dex 파일과 native 코드들은 모두 내부 메모리에 저장되죠. 즉, 외장메모리에 설치한다고 모든 정보가 외장 메모리에 있는 것만은 아닙니다. 내장 메모리에도 .dex 가 있기 때문에 추가 data 를 사용하지 않는다고 해도, 어느 정도 공간을 차지하게 됩니다.

- SD카드에 설치된 어플리케이션은 오직 하나의 디바이스에서만 작동하게 됩니다.
 ( 어플 설치시 랜덤하게 생성된 키를 이용해서 암호화하고, 이 암호화는 해당 단말에서만 풀 수 있다고 하네요. )

- 뭔가 맘에 안 드신다면, 외부 메모리에 설치된 앱을, 내부로도 당연히 바꿀 수 있습니다.



그럼 Froyo ( Android 2.2 or API Level 8 ) 이하버전에서 작성된 앱들은 외부 메모리로 옮길 수 있나요?


아쉽지만, API Level 8 이전 버전으로 작성된 앱들은 항상 내부 메모리에만 저장될 수 있습니다. 앱을 설치한 단말이 Android 2.2 이상의 버전이라도 말이죠. 물론 반대의 경우 즉, 앱이 API Level 8 이상으로 작성되었을 경우, android:minSdkVersion = ( integer ) 값을 8 미만으로 설정한다면, Froyo 이하 버전의 단말에서도 설치가 가능하며, installLocation 값은 자동으로 무시가 됩니다.



그럼 메모리 문제가 있으니 무조건 외부 메모리에 설치하는 것이 좋을까요?


"무조건", "반드시" 란 말에 맞는 이야기는 솔찍히 거의 없죠.
앱들 중에 외부 저장 장치에 설치되서는 안 되는 것들이 있답니다. 왜냐면 외부 저장장치 ( SD-Card ) 가 unmount 되는 경우 메모리에 설치되어 운영되는 앱들은 모두 강제 종료가 되기 때문입니다. 시스템은 해당 앱들에 대해 외부 저장 장치가 다시 마운트 되기 전까지 알 수 없습니다.

따라서 다음과 같은 API나 Component류를 사용하는 녀석들은 내부 메모리에 설치 되는 것이 좋습니다.
앞서 언급했지만 다음과 같은 경우는 android:installLocation = "internalOnly" 로 설정하는 것이 좋습니다.
( default 값이긴 하지만, 명시적으로 쓰는 것도 나쁘지 않죠. ) 






Service


서비스가 unmount 로 인해 종료된다면, remount 되더라도 재시작 하지 않습니다. 물론 이전에 죽지 않는 서비스처럼 구현해도 되고, ACTION_EXTERNAL_APPLICATIONS_AVAILABLE Broadcast 를 receiver 등록하고, receiver 에서 서비스를 다시 시작하는 방식으로 구현하면 다시 시작 시키는 것이 가능은 하겠습니다. 하지만 보통 Service 란 것이 Background 에서 어떤 일을 지속적으로 하도록 의도된 것이기 때문에 목적에 벗어나기 쉽습니다.


Alarm Services


Alarm Manager 에 등록해두었던 Alarm 들이 모두 취소됩니다. 따라서 외부 저장장치가 다시 마운트 되었을 때 일일히 필요한 alarm 을 재등록 해야 하는 번거로움이 있습니다. '알람시계' 같은 앱을 외부 메모리에 저장한다면, SD Card 가 remount 되며 절대 알람을 못 들을 수도 있겠습니다.


Input Method Engines ( IME )


개발자가 작성한 IME 가 설정되어 있다가 unmount 되면 IME 는 자동으로 기본 IME 로 대체됩니다. 하지만, 마운트 된 후에 다시 원래 설정으로 돌아가는 것이 아니라, [Setting] 을 통해 IME 를 다시 활성화시키는 작업이 추가되어야 합니다. 상당히 불편하죠..


Live Wallpapers, Live Folders


이도 IME 처럼 unmount 시 기본 Wallpaper 로 대체됩니다. 하지만, Remount 된 후 다시 Live Wallpaper 를 설정해주어야 합니다. IME 보다는 덜 번거롭지만 번거로운 건 매한가지죠. Live Folders 의 경우는 Home Screen 에 아이콘이 있었다면 아이콘이 사라집니다. Remount 시 자동으로 다시 생기지 않고, Live Folder 아이콘을 다시 추가해야 합니다.


App Widget


AppWidget 도 Live Folder 처럼 홈 스크린에 비치되어 있었다면 unmount 시 사라집니다. 문제는 외부 저장 장치가 다시 마운트 된 후에도 해당 App Widget은 다시 사용할 수 없다는 데 있습니다. Unmount로 삭제된 App Widget은 Launcher 가 재시작되어야만 사용가능한데, 일반적인 런처는 시스템 재부팅 전에는 일어나지 않죠. 즉 App Widget 이 외부 메모리에 있다면, 다시 사용하려면 무조건 리부팅 해야 한다고 보시면 되겠습니다. ( 물론 Setting 에 Force Close 가 있고, DDMS 에 Kill Process가 있긴 하지만... 일반 사용자들이 잘 알까요?.. )


Account Managers, Sync Adapter


Account Manager : Remount 될 때까지, 해당 앱을 통해 생성된 사용자 계정 정보는 모두 사라집니다.
Sync Adapter : Remount 될 때까지, 외부 저장 장치와의 동기화 기능이 작동하지 않습니다.


 Device Administrators


DeviceAdminReceiver를 비롯하여 모든 관리자 기능들은 사용할 수 없습니다. 이와 관련된 문제는 장치와 밀접한 관련이 있기 때문에 Remount 된 후에도 제대로 작동하지 않을 가능성이 높으며, 영구적으로 작동 안 할 가능성도 있습니다. 매우 무서운 녀석입니다.


이상으로 External Memory 에 앱 설치하기에 대해 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길~




반응형

댓글