DesireをHTC公式2.3.3にしてみた その3 A2SD篇

備忘録を兼ねているので説明はくどい。

Desireの唯一最大の弱点とも言える内蔵メモリの少なさ(ユーザ使用可能エリアは約150MB)を克服するためのハック。
ってほど大袈裟じゃないけど、本来は内蔵メモリにインストールされるアプリケイションをSDカードに移す。
Androd2.2で標準搭載された機能でもあるが、あれではごく一部のアプリケイションだけしか移動できないので、やっぱり容量が足りなくなるのだ。
そこで、SDカードにパーティションを切ってext3やext4でフォーマットし、内蔵メモリに見せかけてマウント。
そこにアプリケイションを移すというわけだ。
カスタマイズされたROMが配布されているので、それをインストールするのが手っ取り早いが、HTC公式2.3.3用のROMは見あたらない。
ちょっと面倒だが難しくはないし、自分で手作業でやったほうが理解が深まり、復元する際にも困らない。
というわけでやってみた。

Androdでは通常以下のディレクトリにアプリケイションインストールされ、キャッシュやデータが格納されている。

/data/app
/data/app-private
/data/dalvik-cache
/data/data

これらをいったんSDカードのext3(ext4)パーティションにコピーし、元のディレクトリは削除、そのかわりにシンボリックリンクを置く。
以下、手順。

1)

難易度は低いとはいえシステムに手を入れるのだから、バックアップをとっておく。
特にわたしのようなうっかり者には絶対必要だ。

Desireをシャットダウンし、Volume-キイ押しながら電源オン。
Revolutionaryのリカヴァリ・ツールが起動するので、backup & restore からバックアップを取る。
recovery → backup and restore → Backup

2)

Desireを外部メモリとして接続。
マウントしたSDカードを Gparted などでパーティショニングして新しい領域をext3でフォーマットする。

3)

ターミナルからadbシェルを起動する。
rootになって(デフォルトでパスワードは不要)から、まず読み込み専用でマウントされているsystemディレクトリを読み書き可で再マウント。
/system/data ディレクトリを作成し、SDカードのext3パーティションをマウントする。

# ./android-sdk-linux_x86/platform-tools/adb shell
$ su
# mount -o remount,rw /dev/block/mtdblock3 /system
# mkdir /system/disk
# mount -t ext3 -o nosuid,nodev /dev/block/mmcblk0p2 /system/disk

読み書きができるか確認しておく。
問題なければ次へ。

4)

起動時に常にSDカードのext3パーティションがマウントされるように、起動スクリプトに加える。
Androidは通常のLinuxとはかなり違うブートプロセスなのでよくわからないが、 /system/etc/install-recovery.sh というファイルが機能するらしい。
なければ作り、スクリプトを加える。
(引き続きadbシェルで作業)

# vi /system/etc/install-recovery.sh

#!/system/bin/sh
mount -t ext3 -onosuid,nodev /dev/block/mmcblk0p2 /system/disk
exit 0

:wq

#reboot

再起動して、/system/disk にSDカードのext3パーティションがマウントされていればよし。

5)

お次は、既存のアプリケイションをコピーする。

コピー後に属性を変更することも可能だが、特に /data/data はファイル毎に所有者が異なるので面倒。
コピー時に属性を維持するようオプションを指定する。
-a -p はどちらかひとつでもいいと思うが、Androidのコマンドはよくわからないので、一応両方つけておいた。
コピー後、念のため属性を確認する。

# ./android-sdk-linux_x86/platform-tools/adb shell
$ su
# cd /system/disk
# cp -r -p -a /data/app-private ./
# cp -r -p -a /data/app ./
# cp -r -p -a /data/dalvik-cache ./
# cp -r -p -a /data/data ./
# ls -l
drwxrwx--x system system 2011-10-08 07:45 dalvik-cache
drwxrwx--x system system 2011-10-08 07:45 app-private
drwxrwx--x system system 2011-10-08 07:44 data
drwxrwx--x system system 2011-10-08 07:45 app
drwxr-xr-x root root 2011-10-07 20:07 lost+found

/data/data は変更せずそのまま内蔵メモリに置いておいても動作に支障はないし、SDカードに移すデメリットもあるようだが、わたしの環境では100MBくらいは容量を喰うので移動してしまった。

6)

バックアップをとっているなら、このまま /data 以下の各ディレクトリを消去。
心配ならリネイムして様子を見る(自分も最初はそうした)。
SDカードからリンクを張る。
(引き続きadbシェルで作業)

# cd /data
# rm -r data
# rm -r app
# rm -r app-private
# rm -r dalvik-cache
# ln -s /system/disk/app app
# ln -s /system/disk/app-private app-private
# ln -s /system/disk/data data
# ln -s /system/disk/dalvik-cache dalvik-cache

変更前
# ls -l /data/
drwx------ system system 2011-10-08 07:44 secure
drwxr-x--- root log 2011-08-03 07:02 dontpanic
drwxr-xr-x system system 2011-10-08 07:44 tombstones
drwxrwx--x system system 2011-10-08 07:44 data
drwxrwx--x system system 2011-10-08 07:45 dalvik-cache
drwxr-xr-x root root 2011-10-08 07:58 htcfs
drwxrwx--x system system 2011-10-08 07:45 app-private
drwxrwx--t system misc 2011-10-08 08:00 misc
drwxrwxr-x system system 2011-10-08 07:45 anr
drwx------ system system 2011-10-08 07:59 backup
drwxrwxr-x system system 2011-10-08 08:03 system
lrwxrwxrwx root root 2011-10-08 07:45 drm -> /data/local
drwxrwx--x shell shell 2011-08-03 07:02 local
drwx------ root root 2011-10-08 08:03 property
drwxrwx--x system system 2011-10-08 07:45 app
drwxrwx--- root root 2011-08-03 07:02 lost+found

変更後
# ls -l /data/
lrwxrwxrwx root root 2011-10-08 08:59 dalvik-cache -> /system/disk/dalvik-cache
lrwxrwxrwx root root 2011-10-08 08:59 data -> /system/disk/data
lrwxrwxrwx root root 2011-10-08 08:59 app-private -> /system/disk/app-private
lrwxrwxrwx root root 2011-10-08 08:58 app -> /system/disk/app
drwx------ system system 2011-10-08 08:49 secure
drwxr-x--- root log 2011-08-03 07:02 dontpanic
drwxr-xr-x system system 2011-10-08 08:56 tombstones
drwxr-xr-x root root 2011-10-08 08:55 htcfs
drwxrwx--t system misc 2011-10-08 08:55 misc
drwxrwxr-x system system 2011-10-08 08:50 anr
drwx------ system system 2011-10-08 08:55 backup
drwxrwxr-x system system 2011-10-08 08:56 system
lrwxrwxrwx root root 2011-10-08 08:50 drm -> /data/local
drwxrwx--x shell shell 2011-08-03 07:02 local
drwx------ root root 2011-10-08 08:56 property
drwxrwx--- root root 2011-08-03 07:02 lost+found

再起動して、従前と変わりなければ成功。
いろいろとアプリケイションをインストールしたりアップデイトしても、常に内蔵メモリは140MB近く空いている。

ss1 ss2

また、OSの標準機能を使ってSDにインストールしていたアプリケイションも内蔵メモリ(実際はSD)に移動しておいたほうが、SDカードのマウント中もアプリケイションが使える、ウィジェットが使えるといったメリットがあるし、のちのち標準的な構成に戻す際など管理がしやすい。

もし失敗したら

実は(5)でわたしは大失敗している。
アクセス権や所有者を指定せず単にcpしただけで作業を終了してしまい、リブートしたらこんな画面に出くわしたのだ。

error

さらに言えばこの画面が出ることなく再起動を未来永劫繰り返したこともある。
3時間前の自分よ、ありがとう。
礼を言ってバックアップのDataをリストアし、作業はやり直し。
recovery → backup and restore → Advanced Restore → ファイル(日付・時刻)選択 → Restore Data

参考サイト

Android 端末 (Nexus One) でアプリを SDカードの ext3 パーティションにインストールする (Apps 2 SD)


d.hatena.ne.jp/jitsu102/20101211/1292079581
blog.kmckk.com/archives/3752376.html


2011/10/15追記
アプリケイションの立ち上がりが遅い、動作が不安定といった現象に見舞われたので、/data/dataはSDに置かず、本体メモリに戻した。
また、OS標準機能でSDに移動できるアプリケイションは、OS上でSDに移動した。

コメントを残す