2014年8月22日 星期五

[翻譯文]第一篇正式的翻譯文,是Android的喔!!

原文:http://developer.android.com/guide/topics/data/install-location.html

廢話文先說在前頭,其實我是在找「為什麼Android有些程式能移動到SD,有些又不行」的這個問題時找到這份官方救星文的,希望能給其他因為這問題而苦惱的人一些解答。

------------------------------------------------以下是翻譯文--------------------------------------------

App安裝路徑

只要是Android 2.2(API Level 8)以上的版本,你(開發者)可以選擇讓你的應用程式安裝在外部記憶體裡(例如說,裝置的SD卡)。這是個可以選用的功能,你能在manifest檔(譯註:*.apk檔中必有的像是採購清單似的清單)中以宣布android:installLocation來定義。如果你不宣布此一定義,那你的程式將只能安裝於內部記憶體並且無法轉移到外部記憶體裡。

要讓系統允許你將程式安裝於外部記憶體,只要於<manifest>加入android:installLocation的屬性,以及"preferExternal"或者"auto"。

舉例來說:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >
如果你宣布了"preferExternal",就表示會優先安裝到外部記憶體,但如果外部記憶體空間不足,系統仍會安裝到內部記憶體裡,使用者亦可以在上述兩種儲存空間中做切換(當然,儲存空間要夠)

如果你宣布了"auto",這就表示有可能會安裝到外部記憶體,但你(開發者)並沒有設定安裝到哪的優先權。系統將會以幾個要素為基點判斷是否要安裝到哪一個儲存空間。同上,假如儲存空間足夠,使用者亦可以在上述兩種儲存空間中做切換。

當你的應用程式被安裝於外部記憶體時:

  • 只要外部記憶體仍在掛載狀態,此應用程式的表現並不會受到影響。
  • .apk檔會被儲存於外部記憶體中,但所有個人使用者的檔案、資料庫、優化過的 .dex 檔、以及被解壓的"原生碼"(原文:extracted native code)會被儲存於設備的內部記憶體裡。
  • 儲存你的程式的容器會以一種只能由原本安裝的設備解密的隨機亂數密碼加密。因此,安裝於SD卡的應用程式只能用於一台設備上。
  • 使用者可以透過系統設定來移動你的應用程式至內部記憶體。
警告當使用者啟用USB大量儲存空間(譯註:即有些手機與電腦連接時,會出現的"隨身碟"選項,使用此模式會將外部記憶體卸除)與電腦分享檔案或從系統設定中卸除SD卡時,
外部記憶體會從設備上被卸除,以及其他安裝於外部記憶體的應用程式會馬上被關閉。

向下之相容性(對舊版的相容性)

將你的應用程式安裝於外部記憶體是只有在Android 2.2(API Level 8)以上的版本才有的功能。
在Android 2.2(API Level 8)以前設計的程式只能安裝於內部記憶體而且不可移動至外部記憶體
(即使是在Android 2.2(API Level 8)的設備上使用)。然而,假如你的程式被設計支援API Level
低於 8的系統,你可以選擇使用這個功能給Android 2.2(API Level 8)以上的版本使用,而且仍能與使用API Level低於8的設備相容(譯註:雖然2.2以下還是不能移動的意思)。

想允許安裝於外部記憶體又維持與API Level低於8(Android 2.2以下)的相容性,可以這樣作:

  1. <manifest>中加入"android:installLocation"屬性,以及附帶"auto" 或 "preferExternal"。
  2. 你的"android:minSdkVersion"屬性設定低於8,並確認你的應用程式碼只使用與前述設定的API相容的Level。
  3. 為了要編譯你的程式,把你的Build Target改成API Level 8(Android 2.2)。這是必須要做的,因為在舊版Android函式庫不瞭解"android:installLocation"敘述;並且當此敘述出現時,將不會編譯你的程式。
當你的應用程式被安裝於Android 2.2(API Level 8)以下的設備,"android:installLocation"敘述將會自動被忽略,並且安裝於內部記憶體裡。

警告雖然像是這樣的XML標記在舊版本上會被忽略,除非你的程式會有向下的相容性,當你的"minSdkVersion"屬性低於8時,你還是必須注意不要使用API Level 8(Android 2.2)才出現的程式API。

不該安裝於外部記憶體的應用程式

當使用者啟用USB大量儲存空間(譯註:樓上有解)與電腦分享檔案或卸除外部記憶體時,其他安裝於外部記憶體的應用程式會馬上被關閉。系統會變成無法知道應用程式直到USB大量儲存空間被關閉或者是外部記憶體重新被接回設備上。除了應用程式被關閉使得使用者無法使用之外,這樣(譯註:指卸除外部記憶體)可能會對某些種類的應用程式造成更嚴重的影響。為了使你的應用程式始終表現得如預期一樣,假如你的程式有使用到以下的功能,請不要讓你的應用程式安裝於外部記憶體上:(譯註:原文冒號前亦有一段,不過翻譯時不知放哪才好,原文: due to the cited consequences when the external storage is unmounted:)

服務

你正在執行的服務將會被停止,而且當你將外部記憶體重新接回設備上也不會被重啟。
然而,你可以註冊當安裝於外部記憶體的程式對系統而言可再使用時會你的提醒你的應用
程式的" ACTION_EXTERNAL_APPLICATIONS_AVAILABLE"廣播 Intent(譯註:其實我也不瞭解這是
什麼)。到了那個時候,你可以重啟你的服務。

鬧鐘服務

你以" AlarmManager"註冊的鬧鐘會被取消掉。當外部記憶體重新被接回設備上時,你必須以手動方式重新註冊任何鬧鐘。

輸入法引擎

你的輸入法會變回預設的輸入法。當外部記憶體重新被接回設備上時,使用者可以再度打開系統設定以啟用你的輸入法。

動態桌布

你正在執行的動態桌布會變回預設的動態桌布。同上,當外部記憶體重新被接回設備上時,使用者可以再度選擇你的動態桌布。

桌面小工具

你的桌面小工具將會從主畫面上移除。當外部記憶體重新被接回設備上時,你的桌面小工具將無法被使用者選擇,直到系統重設啟動器為止(通常不需要系統重啟)。

帳號管理(原文:Account Managers)

你以"AccountManager"建立的帳號會消失直到外部記憶體重新被接回設備上為止。

資料同步功能(原文:Sync Adapters)

你的"AbstractThreadedSyncAdapter"和它所有的同步功能都會停止直到外部記憶體重新被接回設備上為止。

設備管理(原文:Device Administrators)

你的"DeviceAdminReceiver"和它所有的管理能力都會停止,可能會對設備造成無法預知的後果,也許會持續到外部記憶體重新被接回設備上。

監聽"開機完成"通知(原文:Broadcast Receivers listening for "boot completed")

系統在外部記憶體被掛載之前傳送"ACTION_BOOT_COMPLETED"廣播。如果你的應用程式安裝於外部記憶體,它就永遠收不到這個廣播了。
(以上部分黑粗體字之翻譯來自於:AppMgr III (App 2 SD),而且這不是打廣告)

假如你的程式有使用到以上的功能,請不要允許讓你的應用程式安裝於外部記憶體上。
就預設而言,系統不會允許讓你的應用程式安裝於外部記憶體上,所以你不需為了你已存在的應用程式感到擔心。然而,假如你很確定你的應用程式不會被安裝於外部記憶體上,那麼,你應該以"android:installLocation"加上"internalOnly"來明確宣布這件事情。雖然這樣做不會影響預設的行為,不過它明確的聲明你的程式只能安裝於內部記憶體裡,而且可作為一個對你或其他開發者的提醒,說這已經被決定下來了。

應該(或可以?)安裝於外部記憶體的應用程式

簡而言之,沒有使用到上一章所述的功能的程式當安裝於外部記憶體時是安全的。
大型遊戲是更普遍應該允許安裝於外部記憶體的程式種類,因為那些遊戲通常在不使用時不會提供額外的服務。當外部記憶體無法使用、遊戲被關閉時,後來當外部記憶體又再次恢復、使用者亦重啟遊戲時,應該是不會有明顯的影響的(假設遊戲在它的正常生命週期
(原文:Activity lifecycle)中有正確儲存記錄)。

假如你的應用程式要花好幾MegaBytes(百萬位元組)來儲存APK檔,你應該小心的考慮是否要啟用將程式安裝於外部記憶體的這個功能,以便使用者們可以保留內部記憶體的容量。

-----------------------------------------------------翻譯結束--------------------------------------------

以下為後記

有一陣子沒來更新了呢,也許是最近都在玩艦隊收藏的關係吧,最近大概會想PO艦娘的文啊啊。(不知道艦隊收藏是啥的人自己找一下股夠(?)大神吧!!)
不過關於這篇翻譯文我越翻到後頭就覺得越難翻。啊,對了,我畢竟沒有碰觸過這類的東西到這種程度,所以有翻譯的不好的,敬請多多指教指教。(用留言指教就夠了。)

打完才發現我沒對這篇中的重點檔案<manifest>作詳細說明,不過我也不甚了解,所以只好請各位客倌點點連結看官方文,或自己再去拜一次股夠(?)大神吧(誤)

沒有留言:

張貼留言