前言
本章內容為開發人員指南(Dev Guide)/Developing/Appendix/App Install Location,版本為Android3.0 r1,翻譯來自"madgoat",歡迎訪問它的部落格:"http://madgoat.cn",再次感謝"madgoat" !期待你一起參與翻譯Android的相關資料,聯絡我over140@gmail.com。
聲明
歡迎轉載,但請保留文章原始出處:)
部落格園:http://www.cnblogs.com/
Android中文翻譯組:http://goo.gl/6vJQl
原文
http://developer.android.com/guide/appendix/install-location.html
本文
自API Level 8開始,你可以允許你的應用安裝至擴充儲存(例如,SD卡)。這是一個可選功能,你可以在你應用的manifest屬性android:installLocation
裡設定。如果你沒設定這個屬性,那麼你的應用將被安裝到內建儲存,而且將不允許移動到擴充儲存上。
為了允許系統可以在擴充儲存上安裝你的應用,修改你的manifest檔案,在 <manifest> 元素中包含android:installLocation 屬性,設定其值為"preferExternal"或"auto"。例如:
<manifest xmlns:android=http://schemas.android.com/apk/res/android
android:installLocation="preferExternal"
... >
如果你定義了 "preferExternal",意味著你要求你的應用安裝至擴充儲存,但是系統不能保證應用肯定會安裝至擴充儲存。如果擴充儲存沒有空間了,系統將把應用安裝到內建儲存。使用者可以在兩個位置之間移動你的應用。
如果你定義了 "auto",表示你的應用可能會安裝在擴充儲存,但是對安裝位置沒有特別的偏好。系統將基於很多因素決定你的應用安裝到哪裡。使用者同樣可以將應用在兩個位置之間移動。
當你的應用安裝在擴充儲存上:
* 只要擴充儲存已經掛載在裝置上,對應用的效能都沒有影響。
* .
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或更低版本相容:
* 在 <manifest>
元素中,包含值為"auto"或 "preferExternal" 的 android:installLocation 屬性。
* 繼續保持你的 android:minSdkVersion 屬性不變(小於8的值)並且確定你的應用代碼只使用與此level保持相容的API。
* 為了編譯你的應用,更改你的build target為API Level 8。這步操作是必須的,因為舊的Android庫無法理解 android:installLocation 屬性,並且當該屬性存在時,也不會編譯你的應用。
當你的應用安裝到API Level 低於8的裝置上時, android:installLocation 屬性被忽略,並且應用會被安裝至內建儲存上。
注意:儘管XML標記,例如這個將被之前的平台忽略,但你還是要小心不要使用API Level 8中的編程API,除非你在你的代碼中提供向後相容。關於在應用代碼中建立向後相容的資訊,請參考 Backward Compatibility 這篇文章。
不應當安裝在擴充儲存的應用
Applications That Should NOT Install on External Storage
當使用者啟用USB大型存放區來給他們的電腦共用檔案時(卸載或移除擴充儲存),任何安裝在擴充儲存上並正在啟動並執行應用都會被結束。實際上此時系統並不知道應用程式的存在,直到大型存放區關閉,或者擴充儲存重新掛載到裝置上。除了殺死該應用程式使它對使用者不可用,它還會使用更嚴重地方式中斷某些類型的應用程式。為了使你的應用始終如你所期望的那樣運行,當你使用了下面任何一種特性,那你就不應當允許你的應用安裝到擴充儲存上去,以避免產生當擴充儲存被卸載時所導致的後果:
服務Services
當擴充儲存被卸載時,你正在啟動並執行Service
將被結束並且不會再重新啟動。你可以註冊 ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
廣播(broadcast) Intent,當安裝在擴充儲存上的應用對系統重新有效時,會通知你的應用。在那個時候,你可以重新啟動你的Service。
定時服務Alarm Services
你註冊到 AlarmManager
的鬧鐘會被取消。當擴充儲存重新掛載時,你必須手工重新註冊。
IME引擎Input Method Engines
你的IME(IME)將被替換為預設IME。當擴充儲存重新掛載,使用者可以開啟系統設定以重新啟用你的IME。
壁紙Live Wallpapers
你正在啟動並執行 Live Wallpaper 會被替換為預設的。當擴充儲存被掛載時,使用者可以重新選擇Live Wallpaper。
Live Folders
你的 Live Folder 將被從home螢幕被移除。當擴充儲存被掛載上時,使用者可以重新添加Live Folder到Home介面。
應用程式組件App Widgets
你的App Widget將被從Home介面移除,當擴充儲存被掛載時,在系統重設Home應用之前,使用者將無法使用你的App Widget(通常直到系統重啟)。
Account Managers
在擴充儲存被掛載之前,你使用 AccountManager
建立的賬戶都是不可見的。
Sync Adapters
在擴充儲存被掛載之前,你的 AbstractThreadedSyncAdapter
和所有相關的同步功能將無法工作。
Device Administrators
你的 DeviceAdminReceiver
和它的管理能力會被禁止,這會導致裝置功能產生無法預料的結果,這種現象會持續到擴充儲存重新掛載為止。
Broadcast Receivers listening for "boot completed"
T系統在擴充儲存掛載到裝置前發送廣播 ACTION_BOOT_COMPLETED
。所以如果你的應用安裝到擴充儲存上,它擁有也接收不到這個廣播。
如果你的應用使用的上面列表中的任何一種特性,那你就不應該允許你的應用安裝到擴充儲存上去。預設情況下,系統將不允許你的應用安裝至擴充儲存,所以你不需要擔心你已存在的應用。然而,如果你不確定你的應用是否永遠不會安裝到擴充儲存上去,那麼你可以通過定義 android:installLocation
值為 "internalOnly"來確保其安裝至內建儲存。儘管這不會改變預設的行為,但它明確的指出,你的應用只會被安裝在內建儲存上並且作為提醒你和其他開發人員已經做出決定。
應當安裝在擴充儲存的應用
Applications That Should Install on External Storage
簡單來說,任何沒有使用上一章節功能列表中的應用安裝在擴充儲存上都是安全的。大型的遊戲更是常見的應該允許安裝至擴充儲存的應用類型,因為遊戲當處於非啟用狀態時,通常不需要提供額外的服務。當擴充儲存無效後,遊戲進程被結束,這並不會帶來明顯的影響,當儲存重新有效後,使用者可以重新啟動遊戲 (假設遊戲在正常的 Activity lifecycle中儲存了狀態)。
如果你的應用的APK檔案大小為幾兆(M),那你就需要認真考慮是否啟用應用安裝至擴充儲存了,這樣的話使用者可以保留他們的內建儲存空間。