為了允許系統可以在擴充存儲上安裝你的應用,修改你的manifest檔案,在 <manifest> 元素中包含android:installLocation 屬性,設定其值為"preferExternal"或"auto"。例如:
android:installLocation="preferExternal"
... >
如果你定義了 "preferExternal",意味着你要求你的應用安裝至擴充存儲,但是系統不能保證應用肯定會安裝至擴充存儲。如果擴充存儲沒有空間了,系統将把應用安裝到内置存儲。使用者可以在兩個位置之間移動你的應用。
如果你定義了 "auto",表示你的應用可能會安裝在擴充存儲,但是對安裝位置沒有特别的偏好。系統将基于很多因素決定你的應用安裝到哪裡。使用者同樣可以将應用在兩個位置之間移動。
當你的應用安裝在擴充存儲上:
* 隻要擴充存儲已經挂載在裝置上,對應用的性能都沒有影響。
* <code>.</code>apk 檔案儲存在擴充存儲上,但是所有的使用者私有資料,資料庫,優化過的 .dex 檔案和釋放的原生代碼都儲存在内置存儲空間上。
* 存儲你應用的唯一容器是被一個随機生成的KEY加密存放的,僅僅能被最初安裝的裝置進行解密操作。是以,安裝在SD卡上的應用僅僅針對一個裝置可以工作。
* 使用者可以通過系統設定移動你的應用到内置存儲。
警告:當使用者啟用USB大容量存儲以共享檔案給計算機或者通過系統設定解除安裝SD卡,外置存儲從裝置解除安裝并且所有運作在外置存儲的應用立刻都被結束。
向後相容Backward Compatibility
将你的應用安裝至擴充存儲的功能是運作API Level 8(Android 2.2)及以上版本的裝置才有效的。使用API Level 8 之前的版本編譯的已存在的應用,将一直安裝在内置存儲,并且無法移動至擴充存儲(即使裝置上運作的是API Level 8版本的系統)。然而,如果你的應用計劃支援低于8的API Level,你可以選擇針對API Level 8及更高版本支援此特性,并且繼續保持與低于API level 8的裝置相容。
為了允許安裝在擴充存儲并且保持與API Level 8或更低版本相容:
* 繼續保持你的 android:minSdkVersion 屬性不變(小于8的值)并且确定你的應用代碼隻使用與此level保持相容的API。
* 為了編譯你的應用,更改你的build target為API Level 8。這步操作是必須的,因為舊的Android庫無法了解 android:installLocation 屬性,并且當該屬性存在時,也不會編譯你的應用。
當你的應用安裝到API Level 低于8的裝置上時, android:installLocation 屬性被忽略,并且應用會被安裝至内置存儲上。
不應當安裝在擴充存儲的應用
Applications That Should NOT Install on External Storage
當使用者啟用USB大容量存儲來給他們的計算機共享檔案時(解除安裝或移除擴充存儲),任何安裝在擴充存儲上并正在運作的應用都會被結束。實際上此時系統并不知道應用程式的存在,直到大容量存儲關閉,或者擴充存儲重新挂載到裝置上。除了殺死該應用程式使它對使用者不可用,它還會使用更嚴重地方式中斷某些類型的應用程式。為了使你的應用始終如你所期望的那樣運作,當你使用了下面任何一種特性,那你就不應當允許你的應用安裝到擴充存儲上去,以避免産生當擴充存儲被解除安裝時所導緻的後果:
服務Services
定時服務Alarm Services
輸入法引擎Input Method Engines
桌面Live Wallpapers
Live Folders
應用程式部件App Widgets
Account Managers
Sync Adapters
Device Administrators
Broadcast Receivers listening for "boot completed"
應當安裝在擴充存儲的應用
Applications That Should Install on External Storage
如果你的應用的APK檔案大小為幾兆(M),那你就需要認真考慮是否啟用應用安裝至擴充存儲了,這樣的話使用者可以保留他們的内置存儲空間。