[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 에 앱 설치하기에 대해 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길~
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Selector 를 이용하여 간단한 버튼 구현하기. ( Custom Button? ) (0) | 2012.02.09 |
---|---|
[Android/안드로이드] 사각형, 선, 타원 shape xml 로 정의하고 쉽게 재사용하기. (2) | 2012.02.09 |
[android/안드로이드] 최적의 성능을 위한 앱 설계 방법. ( High Performance, 최적화를 위한 앱 설계 방법 ) (4) | 2012.02.09 |
[android/안드로이드] 응답성을 고려한 설계 ( ANR 을 피하는 설계 ) (0) | 2012.02.09 |
[android/안드로이드] 무결성을 위한 앱 설계시 고려할 사항들. (0) | 2012.02.08 |
댓글