HTC Jで複数のROMを端末だけで切り替える

HTC Jでfastbootを使ったり、CWMを使ったりせずにサクっとROMを切り替えるアイデア。
デメリット等々もありますが、毎回バックアップとってROM焼いて..という手順からは解放されます。

本当は最小限の構成でLinuxをブートした後、メニュー画面出すか、ボタン操作によってブートROMを決定して、
そこからAndroidを起動するのが最善だと思うのですが、カーネル違ったり、そんな技術が無いということで断念…

今回は、ddを使ってブートイメージを起動中に直接書き換えることで、
再起動すれば、(外部)SDカード等に保存してある別ROMでブートできるという手法にします。
この記事では1つの方法を公開するので、興味のある方は記事を読んでもらって
応用して好きなように構築してくださればと思います。

相変わらず、分かる人向けに書いてます。

お約束ですが、ROM焼きは自己責任でお願いします。
記事の内容により端末が壊れたりしても責任は負いません。

今回は、以下の様な環境を想定して書いています。

  • (勿論)ブートローダーUnlock済み
  • ブートパーティションに純正ICSが焼かれている
  • 純正ICSにSuperuser導入済み
  • リカバリパーティションにCWM導入済み

とりあえず、この環境に香港ROMを導入することにします。

まずはSDカードのパーティションを切ります。
私は16GBのSDカードを購入し、1stに10GB(データ領域)と2stに6GB(ROM領域)としました。
パーティションの切り方は各自で調べて欲しいのですが、Linux上でfdiskを使うかGPartedを使うのが楽でしょう。
今回はGPartedを利用しました。GUIで簡単に操作できます。
1stはFAT32、2ndはext4でフォーマットしてください。

次に、香港ROMを入手します。
RUUから boot.imgとsystem.imgを抜き出します。
そして、 system.imgをSDカードの2ndパーティションに保存します。
ファイル名は他ROMとの混同を防ぐため、HKsystem.imgとでもしておきましょう。

そして、香港ROM用のdata領域を作成します。
これは、SDカード上に作成すると著しくパフォーマンスが低下するため、内蔵メモリに格納します。
今回は純正ICSが使用する/dataの下に専用のディレクトリを作ります。

純正ICSを起動したら、adbでシェルに入り、

$ su
# mkdir /data/ROMS/HK
# mkdir /data/ROMS/HK/data
# mkdir /data/ROMS/HK/cache
# mkdir /data/ROMS/HK/devlog

このように香港ROMで起動した時に用いるディレクトリを作成しておきます。

今度は、SDカード上に保存したROMを読み込むように、また上記で作成したディレクトリを使用するように
ブートイメージを改変します。
まず、RUUに入っていたboot.imgを解体します。
unpack-bootimg.pl等を使ってもらえれば良いと思います。
解体したら、init.valentewxc9.rcのon emmcセクションを編集します。

on emmc
    mkdir /system
    mkdir /data 0771 system system
    mkdir /cache 0770 system cache
    mkdir /devlog 0700 root root

    mkdir /host_data 0771 root system
    devwait emmc@userdata
    mount ext4 emmc@userdata /host_data nosuid nodev barrier=1 noauto_da_alloc discard
    chown root system /host_data
    chmod 0771 /host_data

    mkdir /host_system
    devwait emmc@system
    mount ext4 emmc@system /host_system ro barrier=1

    devwait /dev/block/mmcblk1p2
    mkdir /SD_secondary
    mount ext4 /dev/block/mmcblk1p2 /SD_secondary

    rmdir /data
    symlink /host_data/ROMS/HK/data /data
    chmod 0771 /host_data/ROMS/HK/data

    mount ext4 loop@/SD_secondary/HKsystem.img /system
    mount ext4 loop@/SD_secondary/HKsystem.img /system ro barrier=1

    rmdir /cache
    symlink /host_data/ROMS/HK/cache /cache
    chmod 0770 /host_data/ROMS/HK/cache
    chown system cache /host_data/ROMS/HK/cache

    rmdir /devlog
    symlink /host_data/ROMS/HK/devlog /devlog
    chmod 0770 /host_data/ROMS/HK/devlog
    chown root root /host_data/ROMS/HK/devlog

    mkdir /vendor               0771 system system
    mkdir /vendor/firmware      0771 system system

/host_systemは今回マウントする必要が無いかもしれません。
しかしCM10の開発などでは、シンボリックリンクを貼るなどの活用法があるかもしれません。
先ほど作ったSDカードの2ndパーティションが、/dev/block/mmcblk1p2としてマウントできます。

ファイルを編集したら、Repackして新しいブートイメージを生成してください。
ブートイメージは端末が読み込める場所であれば、どこに保存されてても良いです。
私は内部SDに保存しています。

最後に、端末上の操作で簡単にROMが切り替えられるようにスクリプトを組みます。
まずPlayストアから、GScript Liteをインストールして起動してください。
起動したら、メニューからAdd scriptと進みます。
NameにはHKromとでも入力しておきます。自分の分かりやすい名前でOKです。
Needs SU?のチェックボックスはONにしておきます。
スクリプトを記述する部分には、以下のように記述します。

dd if=/sdcard/BOOTIMG/HKboot.img of=/dev/block/mmcblk0p21
sync
sync
sync
busybox reboot -f

もちろん、ブートイメージまでのパスは各自のもので置き換えてください。
最後に、Saveボタンを押して保存しましょう。

後は、保存したスクリプトを実行すれば、香港ROMで起動します。
香港ROMで起動したら、同様にGScriptを導入し、純正ICSに戻るためのスクリプトを記述すれば良いでしょう。
これで、簡単にROMを切り替えることが出来るようになります。
CM10も同様の方法で導入すれば、トリプルブートも実現できます。

●メリット

  • 手軽にROMを切り替えることが出来る
  • 毎回CWMを起動して、ROMを焼く必要がない
  • CWMでバックアップすれば、各種ROMのdata領域もバックアップできる

●デメリット

  • 毎回bootに書き込むため、NANDフラッシュメモリが痛みそう(気にする程でない?)
  • CWMで毎回data領域がバックアップされてしまう(上述のメリットでもある)
  • 他ROMからsystem領域をいじるのが非常に面倒
  • この方法で導入されたROMはCWM用に作られたパッチなどが適用できない

CWMでバックアップを行うと、正規の方法で書き込まれているROMの/dataに加えて、
各種ROMのdataが/data/ROMS下にあるために一緒にバックアップされます。
これはメリットでもありますが、時間が余分に掛かるためデメリットだと考える人もいるでしょう。
そういった場合は、/dataの下ではなく、 内部SDに保存するように
変更するなどの対策をすれば良いのではないでしょうか。
上述しましたが、外部SDにdataパーティションを作成すると
著しくパフォーマンスが低下するためお勧めしません。

他ROMやCWMからsystem領域を変更したい場合は、まず外部SDの2ndパーティションをマウントして
さらに、その中に入っているsystemイメージを

mount -o loop -t ext4 /sd_2nd/HKsystem.img /hoge

などとしてマウントする必要があります。
なので、できることならsystemの改変は起動中に行ったほうがよさそうです。
ただ、suを仕込んだりする場合はこのような方法が必要ですね…

リカバリに焼いてあるCWMを捨てれば、いつも使うROMはbootパーティションに焼いておき、
この方法で香港ROMやCM10をリカバリに焼いて使うといったこともできますし、
外部SDにROMを保存せず、内部SD等に保存しても良いでしょうし、
自分の使いたいようにカスタマイズしてもらえれば、と思います。

もっとこうした方が良いとか、間違いなどご指摘がありましたら、
コメント欄かTwitter(@tako0910)までお願いします!

[`evernote` not found]

  1. コメントはまだありません。

  1. トラックバックはまだありません。