Android - 開發可以安裝於SD Card的App

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中。接下來詳細說明如何來開發:

 

android:installLocation

該屬性設定於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:

App Install Location

強制程式安裝至 SD Card

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

 

Dotblogs Tags: