Android開發者指南(7) —— App Install Location

前言html

  本章內容爲開發者指南(Dev Guide)/Developing/Appendix/App Install Location,版本爲Android3.0 r1,翻譯來自"madgoat",歡迎訪問它的博客:"http://madgoat.cn",再次感謝"madgoat" !期待你一塊兒參與翻譯Android的相關資料,聯繫我over140@gmail.com。
 android

 

聲明數據庫

  歡迎轉載,但請保留文章原始出處:)
 編程

   農民伯伯:http://over140.blog.51cto.com/安全

    Android中文翻譯組:http://goo.gl/6vJQlapp

 

原文

  http://developer.android.com/guide/appendix/install-location.htmlide

 

正文
 性能

 

    自API Level 8開始,你能夠容許你的應用安裝至擴展存儲(例如,SD卡)。這是一個可選功能,你能夠在你應用的manifest屬性android:installLocation裏設定。若是你沒設定這個屬性,那麼你的應用將被安裝到內置存儲,並且將不容許移動到擴展存儲上。優化

         爲了容許系統能夠在擴展存儲上安裝你的應用,修改你的manifest文件,在 <manifest> 元素中包含android:installLocation 屬性,設置其值爲"preferExternal""auto"。例如:ui

               <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 8Android 2.2)及以上版本的設備纔有效的。使用API Level 8 以前的版本編譯的已存在的應用,將一直安裝在內置存儲,而且沒法移動至擴展存儲(即便設備上運行的是API Level 8版本的系統)。然而,若是你的應用計劃支持低於8API Level,你能夠選擇針對API Level 8及更高版本支持此特性,而且繼續保持與低於API level 8的設備兼容。

         爲了容許安裝在擴展存儲而且保持與API Level 8或更低版本兼容:

 * <manifest>元素中,包含值爲"auto" "preferExternal" android:installLocation 屬性。

 * 繼續保持你的 android:minSdkVersion 屬性不變(小於8的值)而且肯定你的應用代碼只使用與此level保持兼容的API

 * 爲了編譯你的應用,更改你的build targetAPI 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的鬧鐘會被取消。當擴展存儲從新掛載時,你必須手工從新註冊。

輸入法引擎Input Method Engines

你的輸入法(IME)將被替換爲默認輸入法。當擴展存儲從新掛載,用戶能夠打開系統設置以從新啓用你的輸入法。

壁紙Live Wallpapers

你正在運行的 Live Wallpaper 會被替換爲默認的。當擴展存儲被掛載時,用戶能夠從新選擇Live Wallpaper

Live Folders

你的 Live Folder 將被從home屏幕被移除。當擴展存儲被掛載上時,用戶能夠從新添加Live FolderHome界面。

應用程序部件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),那你就須要認真考慮是否啓用應用安裝至擴展存儲了,這樣的話用戶能夠保留他們的內置存儲空間。

相關文章
相關標籤/搜索