Android - 開發可以安裝於SD Card的App
在開發WP7或iPhone的App過程裡,開發者不需去在意自己的App究竟是被安裝在那裡,因為安裝的路徑是由Mobile OS
自行安排的,程式裡存取的區域都是被獨立於每個App使用,因此,控制範圍與安裝資料的搬移都只會在這獨立區域之中。
但在開發Android上的App,由於Android本身支援外接設備提供外接磁碟機的使用,豐富的檔案系統功能,讓開發者選擇
的項目就增加了,尤其使用Android的用戶部分都會重新刷ROM移除ISP業者安裝或廠商提供的App,因此,在開發Android
的App就需要特別注意我們要安裝的路徑了。
過去Android 2.2(API Level 8)以前,是完全不支援將App安裝於Internal Stroage之外的地方。但根據<App Install Location>
該篇文章的介紹,主要針對開發App時可以透過相關的設定,讓程式雖然預設安裝於手機裡,但也可以透過手機的設定將App
移至SD Card中。接下來詳細說明如何來開發:
該屬性設定於AnrdoidMainfest.xml中,它是屬於選擇性的參數。如果程式不宣告設定該屬性,開發的App預設安裝於
內鍵儲存區(internal storage),它也無法被移除到額外儲存區(external storage)。該屬性支援二個屬性值:
‧preferExternal:
設定此值,強迫開發的App要求被安裝於external storage,但Android系統不保證一定會被安裝於external storage之中,
因為可能會遇到external storage空間不足或其他問題。只要設定了這個屬性,就允許App可以移動internal或external二個
區域之中。
‧auto:
設定此值,宣告開發的App允許被安裝於external storage,但不強迫安裝於internal或external storage之中,交由Android
系統去決定(基於某些因素)該App要安裝於那個區域。但只要設定該屬性,也允許App可以移動internal或external二個區域之鞏。
1: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2: android:installLocation="preferExternal" ... >
設定了該屬性之後會有什麼影響呢?將App安裝於external storage後:
a. 並不會影響App執行效能,它只是移動App至external storage儲存,執行時還是把App放入主記憶體;
b. .apk檔案雖被儲存至external storage,但user data, database, optimizied, dex檔案與extracted native code
將仍然被儲存於internal storage中;
c. 每一個App安裝後都會使分配一個獨立的空間(unique container),該空間的內容只有安裝的Device可以進行加/解密取得內容,
因此,當App被移動至external storage後,也一樣只能由原本被安裝的Device可以使用;
d. 使用者可以仍移動App到internal storage;
[注意] 當將App安裝於external storage後,當Android手機與電腦連接選擇「磁碟機」或卸載SD後,安裝過的App將無法被使用。
〉往下兼容:
由於android:installLocation屬性僅支援Android 2.2(API Level 8)以上,因此,如果該屬性設定比API Level 8以下的話,該屬性會自動被忽略。
〉那些應用不應該安裝於Eexternal Storage?:
1. Services
由於External Storage的可能會清除或卸離,將可能造成服務無法正常執行。但可以配合ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
的Boardcast Intent,讓App被安裝於external storage之後還可以正常使用。
2. Alarm Services
當App被安裝於external storage之後,原註冊於AlarmManager的alarms將被取消。必需在App被安裝於external storage之後,
重新向AlarmManager進行註冊。
3. Input Method Engines
輸入法建議是安裝於internal storage之中,可以讓手機重新啟動時直接載入取代原有的輸入法。
4. Live Wallpapers/Live Folders
動態桌布安裝之後會取代原有的桌布,然而該桌布的讀取如果安裝於external storage時,其設定的參數與保留的桌布,
隨著每次external storage準備或重啟時,有可能遺失值的出現,需特別注意。
5. App Widgets
App Widgets安裝於external storage後,較接近重新安裝,每次啟動時需要重新設定。需注意。
6. Account Managers
安裝external storage後,原註冊於AccountManager的帳號會消失,需要重新設定才能正常使用。
7. Sync Adapters
該Adapter的功能註冊於AbstractThreadedSyncAdapter之中,但移植到external storage後,原有的功能
將會失效,需要重新設定與安裝App才能正常運作,但這樣會影響App控制的內容。
8. Device Administrators
DeviceAdminReceiver,如果開發的App需與該元件進行合作,移植至external storage其功能將會失效。
9. Broadcast Receivers listening for "boot completed"
如果App需使用到系統提供的ACTION_BOOT_COMPLETED 廣播(boardcast),那App安裝於external storage
其功能將無法啟用。
10. Copy Protection
如果App需要使用到Android Market's Copy Protection的特性,那App將無法安裝於SD卡裡,需要與Device
進行溝通直接安裝於internal storage之中。如果使用的Android Market’s Application Licensing,那麼App
將"可能"支援被安裝於internal或external storage之中。
======
以上是簡單介紹如何設計與開發讓App支援external storage安裝的概念,開發App時,其實除了考量App是否
支援裝於internal/external storage的問題之外,另外需考量針對App裡使用到的額外資料要安裝在那裡,由於
這些資料可能隨著App移除時,需要進行移除,那麼直接將重要的資料放入external storage那將會需要更多的
功夫來處理這些資料。因此,我比較建議是把App裡用的一些額外的資料,例如:圖示、字型等比較不會影響
App運作的資料或是占整個App比較大的資源項目可以搬過去之外,比較像Database的東西就建議放置於內部
儲存區(internal storage)之中。
如果該篇有寫錯的地方,也歡迎大家給予指導。謝謝。
References:
‧Android 2.2: Install Android Apps to SD Card
‧How to Install Apps to the SD Card by Default on Android 2.2 Froyo
‧How to Install Android Apps to SD Card
‧Intents List: Invoking Google Applications on Android Devices