TShopping

 找回密碼
 註冊
搜索
查看: 400|回復: 0

[教學] setInstallLocation 設定如何影響程式安裝於內部 ROM 或外部記憶

[複製鏈接]
發表於 2013-9-25 01:30:53 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
緣起

Desire 之前刷了非官方的 Froyo (android 2.2) ROM 後,看到網友說

adb shell pm setInstallLocation 2

可以將程式裝到 SD 卡去。當初也沒想太多就直接這樣設了。後來雖然有一點小問題,
但並沒有聯想到跟這個設定有關。

最近 Desire 官方 2.2 ROM 發佈出來後,又看到網友在討論這個設定的問題。在網路上
爬了一下文並做一些實驗後,想將一些心得與大家分享。因為我自己只用過官方的
App2SD,沒試過另劃一塊 Ext3/Ext4 的分割區,故以下說明僅限於官方 App2SD 的用法。

基本概念說明

就我所知, Android 程式的安裝位置在 <=2.1 的版本裡只能灌在 ROM 中,所以
沒有所謂的灌在內部或外部的問題,除非你用 App2SD+。App2SD+ 與 Google 官方
App2SD 的目的都一樣,是要讓程式可以灌在外部 SD,但做法有些不同。

App2SD+ 需要玩家自己在記憶卡中除了原有的 FAT32 分割區外,另劃一塊 Ext3/Ext4 的分割區,
之後在安裝程式時會自動把程式裝到記憶卡中,不佔用內部的 ROM。也就是這個 Ext 分割區會被
視為是內部 ROM 的延伸。

App2SD 不需要另劃 Ext 分割區,只需要原來的 FAT32 分割區。它的原理是在根目錄裡頭建
一個 .android_secure,並將 .apk 用該手機獨有的 key 加密成 .asec 後放到裡頭。加密之後,這個
程式拿到另一台同樣的機器也不能用,但同一台機器換一張 SD 是可以用的。和 App2SD+ 比較起來,
這個做法最大的好處就是可以無痛升級,但主要缺點是只有 .apk 被搬出去了,以下幾類資料還是得存在
內部 ROM

private user data
databases
optimized .dex files
extracted native code

因此你才會發現即使程式搬到外部 SD 後還是會佔一些內部 ROM 的空間,節省 ROM 的效果沒有 App2SD+ 好。詳細說明可以看以下 link。

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

App2SD+ 的優點是

1. 任何程式幾乎都可以完全裝到外部 SD,不會再有 ROM 爆掉的問題
2. mount 到 PC 後裝在 SD 的程式也不會失效,不像 App2SD

App2SD+ 的缺點是

1. 沒用到的 Ext 分區也不能拿來放資料。這個問題其實買張大一點的 SD 也就解決了。
2. 對一般使用者來說,使用上有點技術難度。

App2SD 的優點

1. 所有使用者都能輕易上手
2. 因為程式只是裝在 FAT32 中的一個資料夾,所以不會有 Ext 分區空間浪費的問題

App2SD 的缺點

1. 不是所有程式(像輸入法、小工具等)都能搬,後面會說明。
2. 只有 .apk 本身被搬到 SD 卡,很多資料還是放在內部 ROM。像我用的「青空讀手」搬到 SD 後程式只佔內部 ROM 444K,但資料(也許是字型)卻佔了 7.48MB!
3. mount 到 PC 後裝在 SD 的程式會失效。也就是你插著 PC 時就不能使用這些程式

感覺起來 App2SD+ 比較好用,但因為比較麻煩,所以我自己也沒用 :p

說完了 App2SD+ 與 App2D 後,讓我們回到 App2SD 的使用方式。Froyo 剛裝完後,系統預設
的程式安裝位置是「自動」。這個設定的學問就大了,也是我之前感到很困惑的地方。所謂的「自動」
到底是根據什麼樣的標準來判斷安裝位置的?這要先了解 Froyo 是怎麼知道程式能不能安裝在
外部 SD 的。

Froyo 支援 App2SD 的方式是讓程式自己告訴系統它能不能安裝在外部 SD。每個程式都會有一個
manifest file 記錄程式設定。從 Froyo 之後有一個新的設定叫 android:installLocation,記錄程式
的安裝位置。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... >

這個設定可以設為以下幾個值

"internalOnly": 只能裝在內部 ROM,如果內部 ROM 沒空間就不安裝。
"preferExternal": 可以裝在外部 SD,如果外部 SD 沒空間就裝內部 ROM。
"auto": 系統自行判斷要裝外部或內部,但預設是安裝在內部。使用者需要的話,得自行搬到外部。

關於此設定的詳細說明請參考

http://developer.android.com/guide/topics/manifest/manifest-element.html#install

以上是 Froyo 支援 App2SD 的方式。但除了支援 2.2 的程式之外,世界上還有千千萬萬只支援
<=2.1 的舊程式,這些並沒有特別支援 Froyo,那又要怎麼處理呢?答案很簡單,一律裝在內部!
這個行為也很容易理解,因為舊程式的程式作者一定沒測過 App2SD 能不能用,當然最安全的方式就
是裝在內部。

以上是程式本身的設定。但程式告訴 Froyo 它的安裝位置是 auto 或是什麼都沒講的舊程式,並不代裝
Froyo 就一定要把它裝在內部。咦?你前面不是說舊程式什麼都沒講就是裝在內部嗎?怎麼現在又變不
一定了?這就牽涉到 Froyo 本身 setInstallLocation 的設定了。這個設定值可以是以下幾個值

adb shell pm setInstallLocation [0/auto] [1/internal] [2/external]

系統剛裝好的預設值是 0(auto)。此時系統的行為就和我們剛剛解釋的一樣,舊程式就裝內部,說隨便
系統決定的程式也裝在內部。相信應該不會有人將它設為 1(internal) 放著好好的 SD 空間不用吧,所以
我就沒測試這個值。但如果我們將此設定設為 2(external) 的話,Froyo 會強制將所有程式都裝到 SD 去。
但真的是這樣嗎?這樣做安全嗎?以下是我做的一些實驗結果。

實驗結果

因為我不知道怎麼看程式的 manifest file,所以我就以 SDMove 這個程式的說明來猜測 manifest file
的設定。如果程式沒出現在 SDMove 的話,我就假設它是舊程式,而 SDMove 無從判斷就沒列進去了。
我猜這裡也是為什麼有些網友發現將 setInstallLocation 設為 2 之後,像 SDMove 之類的程式沒列出它
是否能裝到外部 SD,但在應用程式管理的設定中卻有「移至 SD 卡」的設定跑出來的原因吧?這類程式搬到
外部是有風險的,雖然大部份都可以搬走以節省空間。後面我們再來說明。

從 SDMove 來看,我發現以下幾個要測試的程式的設定是這樣的

SDWatch : manifest file 設為 internalOnly
Jorte : 沒出現在 SDMove,假設為舊程式
Handcent SMS : 沒出現在 SDMove,假設為舊程式

因為不知道怎麼看 manifest file 是設為 auto,所以沒做相關實驗。但我猜只要 setInstallLocation
設為 2 的話,應該是會裝到外部 SD 的。以下為實驗結果

1.jpg
從 SDWatch 的結果來看,即使將 setInstallLocation 設為 2 (External),但若 manifest file 設為 internalOnly 的話,程式還是會乖乖地被裝到內部 ROM,所以是安全的。

Handcent SMS 雖然是舊程式,不知道能不能裝到外部 SD。但因為它沒提供小工具,似乎也沒什麼特別的系統服務功能,所以搬到外部 SD 是安全的。這一種程式就是我們將 setInstallLocation 設為 2 能多省下來的空間。

唯一的問題就是像 Jorte 這類舊程式。它是個行事曆程式,所以也提供桌面小工具 (widget) 以供我們方便查詢每日行程,但也因為這樣,被強制裝到外部 SD 的時候,就會有奇怪的問題發生。例如小工具的列表就不會再出現 Jorte 相關的小工具,即使重開機也一樣。所以除非你不用它的小工具,不然還是要將程式裝到內部 ROM,以免找自己麻煩。這種情況下,將 setInstallLocation 設為 2 就會有問題了。

到底哪些程式不應該被裝到外部 SD?

依照 Google 官方說明,

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

程式有用到以下 9 種功能之一的話,就不應該裝到外部 SD。否則當 SD 被 unmount (就是 SD 控制權被轉移走,主要是接到 PC 當讀卡機時,PC 會取得 SD 控制權)後再 re-mount 回來時(就是將接 PC 的 USB 拔掉讓手機拿回控制權),會有一些功能失效。

Services
Alarm Services
Input Method Engines
Live Wallpapers
Live Folders
App Widgets
Account Managers
Sync Adapters
Device Administrators

裡面很多我不清楚是什麼,相信大部份的人也都不了解。我只就我了解的幾項說明 unmount 後會失效的功能

1. 系統服務:unmount 後會被結束掉,re-mount 後也不會再重新啟動。
2. 輸入法:unmount 後會被預設的 IME 取代。re-mount 後,要自行到系統設定中再加回來。
3. Live Wallpaper:unmount 後會被預設的 Live Wallpaper。re-mount 後,需要手動再加回來。
4. Live Folder:unmount 後會被從 home screen 中拿掉。re-mount 後需要手動再加回 home screen。
5. Widget (小工具):unmount 後會被從 home screen 中拿掉。re-mount 後也不會再出現,需要重新開機。

所以我建議安裝以下幾類程式時,應該裝到內部 ROM。也就是將 setInstallLocation 設為 0,等安裝完畢後再將 setInstallLocation 設回 2。

1. 系統相關服務的程式
2. 有提供小工具或本身就是小工具的程式
3. 輸入法,例如 LIME、嘸蝦米或 OpenWnn/Flick
4. 動態桌布

有比較方便切換 setInstallLocation 的方法嗎?

如果突然要安裝個小工具,還得將手機接到 PC 用 adb 把 setInstallLocation 改成 0,裝完後再改回 2,這樣實在很麻煩。我個人對 adb 不是很熟。之前在 root 時 un-revoked 說要將 HTC Sync 移除掉,我現在也不知道該不該裝回去。而且還要接 USB 線到 PC 實在很麻煩。後來發現 XDA 有位大大發表了一個可以直接切換 setInstallLocation 的程式,我試用過後是有用的,這裡是原 post 的連結

http://forum.xda-developers.com/showthread.php?t=720739

只不過它有以下幾個需求,最麻煩的就是要 root 過的機器才能用

* root
* froyo
* USB debugging (Menu -> Settings -> Applications -> Manage Applications -> Developement -> Check USB debugging. Thx pexon).

如果需要的話可以試試看。

結論

就我自己研究後的結果,我覺得平常可以將 setInstallLocation 設為 2,將所有可能搬到 SD 的程式都裝到 SD 去。除非發現安裝的是以下幾類程式

1. 系統相關服務的程式
2. 有提供小工具或本身就是小工具的擊式
3. 輸入法,例如 LIME、嘸蝦米或 OpenWnn/Flick
4. 動態桌布

才用 XDA 的大大提供的 SetInstallLocation 程式

http://forum.xda-developers.com/showthread.php?t=720739

將 setInstallLocation 設為 0 後再安裝。

程式安裝後發現有問題,也可以試著到「管理應用程式」中將程式搬回內部 ROM 後再試試看問題能不能解決。
當然,如果你的手機是 ROM 有幾 G 可以用的那種的話,就直接將 setInstallLocation 設為 0,不要找自己
麻煩啦。


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-10 13:14 , Processed in 0.064268 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表