android端末にカスタムROMを焼く

android icon

カスタムROMは、数年前に何度か焼いたことがあるぐらいで、改めてやると全く覚えていなかったのと、そもそも随分様相が変わったようだ。これはその時に書いた備忘録に色々書き加えたもの。

ちなみに、私はandroidに詳しいわけではないので、内容に間違いが含まれているかもしれない。

なお、お決まりですが、 この記事を参考にして作業した結果、スマートフォンが使用不可になったり(所謂"文鎮"化)、その他なんらかの不利益が貴方に生じても私は責任を負いませんので、もし参考にする場合は自己責任でお願いします。そして、メーカーの補償は一切効かないものと覚悟してください。

また、覚悟を決めて作業をする場合は、このページでも他でもそうですが、作業する前に一通り読み切って理解してから作業を始めたほうが良いです。途中で詰まって引き返したくなっても引き返せなくなる可能性があるので。

まえがき

androidはGooglが立ち上げたスマートフォン用OSのオープンソースプロジェクトである。各携帯メーカー(ベンター)は、このオープンソースプロジェクトに、各端末でそのOSが動くように手を加えて、端末の中にインストールして、市販の"スマートフォン"として販売している。

ベンダーが手を加えて端末にインストールするandroidベースのOS、謂わば"Official"のように扱われるそれは、StockROMと呼ばれる。その一方で、有志が集まって作ったOSもある。それらがCustomROMと呼ばれる。

このカスタムROMだが、例えばPCのOSでいうとubuntuのようなもののように感じられ、記憶領域にOSを焼きこめばすぐに動くように感じるが、スマートフォンの場合はPCと違ってそう簡単な話ではない。

もともと、ベンダーが提供しているROMはGoogleが提供しているAOSP(AndroidOpenSourceProject)(StockROMのベースになるもの)に手を加えたもので、AOSPとベンダーの実装部分が密になっていた。(ベンダーの実装部分を含めて一つのOSとして機能していたというイメージだと思う)そのため、AOSPがアップデートされたからといって、StockROMがすぐに対応できるわけではなかった。

そしてこのことが、様々なバージョンのandroidを様々な人が使うような自体に陥ってしまった。これは不味いぞということになった。

この問題を解決すべく、Android 8.0(oreo)から、ProjectTrebleという名前のプロジェクトが立ち上がった。目的は、簡単にOSをアップデート出来るようにすることである。

今回は、このProjectTreble対応機にカスタムROMを焼いた手順を残す。(PC側のOSはubuntu)

ProjectTreble

ユーザーが使用しているandoridのバージョンがあまりにもまばらである問題を根本から解決すべく立ち上がったのがこのProjectTrebleである。どうやって解決するのかというと、OS部分(AOSP)とベンダーの実装部分を分離することで解決を図ろうというのがこのプロジェクトである。

ProjectTrebleはベンダーに向けたインターフェースを提供する。ベンダーはこのインターフェースとデバイスを繋ぐ実装部分を用意する。これにより、OSが取っ替えられても接続部分がつながりさえすればOSは動く、というイメージなのだと思う。

用語

Android廻りで見かける用語。

AOSP

AndroidOpenSourceProject。Googleが作る、androidのベースになるプロジェクト。

GSI

GenericSystemImage。ProjectTreble対応機はOSを取っ替えやすく作られていると書いた。この 取っ替えられる 部分がGSIだと思えば良いと思う。

イメージファイル

拡張子がimgのファイル。ディレクトリ構造などをそのまま記録したファイル。コレを展開するとシステムの本体(ディレクトリ構造とその中に入れられた各ファイル群)が出てくる。例えば好きなCustomROMをダウンロードするなどと説明にあれば、基本的にはsystemパーティションに焼くためのOSのイメージファイルをWebサイトからダウンロードするのだと思えば良い。これは別にandroidに限った用語ではない。

ツール群

ROM焼き時にお世話になるツール群。

adb

AndroidDebugBridge。OSを立ち上げた状態で使用できる。PCから端末にandroid用のコマンドを送信できるツールだと思えば良い。

$ sudo apt install adb

でインストールできる。

例えば端末に接続されたshellをPC上で起動したければ、

$ adb shell

で端末に入った状態のshellを起動できる。ここで、例えば権限の関係でエラーが出て操作ができなくなったりしたときは、adbサーバーがsudoで起動されなかったせいだったりするので、一旦殺して立ち上げ直せば解決することがある(下記のように)。

$ adb kill-server
$ sudo adb start-server

fastboot

fastbootモード(bootloaderで止まっているような状態)時に使用できる。PCから端末にROMの領域を上書きしたり消したりする命令を送るのに使う。

$ sudo apt install fastboot

でインストール出来る。

fastbootでよく使うのはflasheraseだ。flashはパーティションを指定してROM上にイメージを書き込む時に使うコマンド(上書きされる)。eraseはキャッシュなど、パーティションを指定してROM上のデータを消したい時に使うコマンド。

ROM焼きにおいては、端末保護のためにflashやeraseを禁止(lock)されているのを最初に外す必要がある。その後、このflashやeraseのお世話になる。

ちなみに、flashingのlockを解除するときもこのfastbootのお世話になるし、後述するTWRPをROMに焼いたり一時的に端末で使ったりするときにもお世話になる。ROM焼きの大事な操作の殆どはこのfastbootによって行われる。

TWRP

TeamWinRecoveryProject。

Androidには通常のOSを起動するモードとは別に、リカバリーモードというモードがあり、このモードを利用することでROM上のデータを操作したり出来る。工場出荷時の状態に戻すファクトリーリカバリーなどをよく使うことになると思う。

プリセットでもリカバリーモード起動時のプログラムははいっているが、機能が限定的である。そのため、リカバリーモードで色々な操作を 出来るようにと作られたのがこのTWRPである。これはCustomRecoveryと呼ばれる。

fastboot flash recovery <twrp>で直に端末に焼きこむことも出来るが、現在使っているROMのフルバックアップとそのデータを使って復旧したいだけであればfastboot boot <PC上のtwrpイメージファイル>で一時的にTWRPを端末で起動できる。

twrpは、端末に合ったものを使う必要があるので、使いたい端末ごとに検索をかけて探す必要がある。

androidのパーティション

手順を説明するのは簡単だが、結局のところProjectTreble対応機においてROM焼きとは ProjectTrebleによって分離されたsystemパーティションを好きなイメージファイルで上書きする 行為である。また、その間もfastbootを使ってrecovery領域を上書きしたり、cache領域を削除したりするので、android端末の記憶領域がどうなっているのか(どこに何が入れられて、どこを上書き、削除する必要があるのか)を知っておくことは重要である。(全て書くわけではない)

boot

通常起動モード時にOSの中核になるシステム。つまりkernel。
androidファイルシステム上ではルートディレクトリ直下に/bootとしてマウントされる。

recovery

リカバリー起動モード時に立ち上がるシステム。
androidファイルシステム上ではルートディレクトリ直下に/recoveryとしてマウントされる。

system

通常起動モード時にOSとなる部分。プリセットのアプリもここに入る。今回はここを上書きする行為がメイン。
androidファイルシステム上ではルートディレクトリ直下に/systemとしてマウントされる。

userdata

個人設定や、ユーザーが追加でインストールしたアプリがここに入る。ファクトリーリセットは、この領域を削除する行為。

cache

アプリ用のキャシュ。

ROM焼き

やっとROM焼きの手順。途中で書いたが、ProjectTreble対応機種では system領域を好きなイメージで書き換えることが目標。

大まかな手順は

  1. flasingのロック解除
  2. 現状の保存(リカバリー)
  3. ROMを選ぶ
  4. ROMを焼く

である。

0. 基本的な操作

ROM焼き中に行う基本的な操作を説明しておく。

端末をfastbootモードにする

2つの方法がある。USBデバックを許可した端末のOS起動中に、adbコマンドを使って起動する方法と、端末の物理キーを使用して起動する方法。

adbを使う場合
Developer optionsから、USBデバックを許可し、PCにUSBで繋いだ後、PCの端末を開いて
$ adb reboot fastboot
とコマンドを打てば良い。

物理キーを使う場合
一度端末の電源を落とした後、電源ボタン音量を下げるボタンを同時押し(長押し)していれば起動する。

1. flasingのロック解除

目的がsystem領域を好きなイメージで書き換えること(この操作をflashingと呼ぶ)であるが、通常はユーザーがROMを書き換えるようなことはしないはずなので、端末保護のためにロックがかかっている。これを最初に解除してやる必要がある。

Webで検索を欠けるのであれば、OEMアンロックブートローダーアンロックflasing unlockなどのワードで検索をかけると良い。

肝心の方法だが、残念ながらどの端末でも共通というわけにはいかない。Webで検索をかけ、すぐに見つかる手順でアンロックできれば良いが、メーカーによっては解除用のシークレット(パスワードみたいなもの)をメーカーから教えてもらう必要があったりもする。そのあたりも最初に調べたほうが良い。

ただ、何のヒントもないと困るので、大まかな説明として、

  1. fastboot flasing unlock
  2. fastboot oem unlock
  3. OS立ち上げ時にsetting->Developer options->OEM unlock

あたりの(それっぽい)操作によってアンロックを行い、fastbootモード起動時の画面のステータス内に

  1. flasing unlocked
  2. oem unlocked

などのステータスが確認できれば、flashingのロックが解除に成功したと思って良い。

2. 現状の保存(リカバリー)

何か起きた時に端末を救えるように、現状のリカバリーを取っておく。ここで、TWRPが出てくる。

TWRP + 端末名で検索し、合うものをダウンロードする。

イメージをダウンロードしたら、イメージのある場所でターミナルを開き、fastbootモード状態の端末をPCにUSBでつなぎ、

$ fastboot boot <twrpのイメージファイル>

でTWRPを起動できる。(以降、必要であればsudoをつける)
これは一時的なもので、この方法だとTWRPを立ち上げるたびにそのイメージファイルのある場所でターミナルを開いて、同じようにコマンドを打つ必要がある。もし、恒久的にリカバリー起動モード時にTWRPを立ち上げさせたい場合は、

$ fastboot flash recovery <twrpのイメージファイル>

でROMにTWRPのイメージを焼くことが出来る。

ここで、注意が必要。もしTWRPをROMに焼いている場合、再び端末のブートローダーをロックすると、次からアンロックが出来なくなる。 個人的に試していないが、そうらしいので注意。

端末にSDカードを入れて、TWRPを起動してそこにROMのフルリカバリーを焼いておけば安心。リカバリーの操作は画面の表示に従えば良い。それほど難しい操作ではないはず。

3. ROMを選ぶ

下記ページにまとめられているので、好きなものを選ぶ。ここで、下記ページに飛んだ先にある表内の、Partition Styleについて説明をする。

https://github.com/phhusson/treble_experimentations/wiki/Generic-System-Image-%28GSI%29-list

Partition Style
androidでは、7.0あたりからseamless updateという計画が始まっている。 これは、記憶領域をA/Bの2つの大きなパーティションに分けて、交互に利用しようとする計画だ。
 
例えば、A/Bの2つにパーティションが分けられた端末で、現在Aのパーティションをユーザーが使っていたとする。そのOSに新しいアップデートが来ると、現在使用していないBのパーティションにそのアップデートされたOSを焼く。アップデートに成功すれば、次回立ち上げ時に今度はBのパーティションをユーザーは使用し、Aは、その又次のアップデート時に使う場所となる。
 
これにより、例えばアップデートに失敗しても、使っていないパーティション内でのトラブルなので、現在使っているシステムに影響を与えないし、現在使っていない領域の内容を書き換えるため、アップデート中も端末を使用することが可能(だから シームレス アップデート)。
 
ここで、PartionStyleの意味が分かる。A/Bはシームレスアップデート対応の端末。A (A-only)は従来通り、パーティションを分けていない端末。
 
メリットが多そうなシームレスアップデートだが、ProjectTrebleと違って対応に強制力はなく、対応端末は現状少ないらしい。
 
自分の端末がシームレスアップデートに対応しているかどうかは、adbコマンドからプロパティを出力することで確認できる。
 
$ adb shell getprop ro.build.ad_update  
結果がtrueでなければ、端末はシームレスアップデートには対応していない。

4. ROMを焼く

flasing(ブートローダー)をアンロックして、ROMをダウンロードしたら、いよいよ、ROMを焼く。

ROMを焼くにはfastbootflashコマンドを使用する。ここで、A/B (seamless update対応端末)A-only (seamless update非対応端末)、で打つコマンドが変わるので注意。

A-only

$ fastboot erase system

$ fastboot flash system <カスタムROMのイメージファイル>

$ fastboot -w

$ fastboot reboot

A/B

手元にA/B対応の端末がないので試せていません。別の記事を調べてください。

以上で、上手くいけば差し替えたOSが動き出すはずだ。

その後(Googleに端末を登録)

カスタムROMを入れ、いざ端末を立ち上げて初期設定画面に進むと、「この端末は登録されていない」旨の警告が出て進めなくなると思う。これは、Googleが決めたことで、ある時からGoogleAppsを使用するにはGoogleの登録を受けることが必要になったためだ。

登録は、PCでGoogleのHPに赴いて指示に従えばよいだけ。Googleアカウントを使って登録することになる。内容としては、端末固有のIDをGoogleに知らせるだけで済む。この固有のIDの取得方法も、そのページに書かれているはず。下記のようなコマンドを打つ。

$ adb root
$ adb shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"'

初期設定時、警告が出ている状態の端末をPCに繋いて、上記コマンドを打つ。コピペで良い。そうすると、20桁?ぐらいの数字が出てくるので、それを登録する。

反映まで少し時間がかかることもあるので、気長に待つ。登録できれば、端末の初期設定が先に進むはずだ。

だん(DONE)

その他

GApps

カスタムROMは、ものによっては必要最低限のものしかあえて入れていないものもある。GooglePlayさえ無ければ、アプリを入れるのも大変なので。最低限コレぐらいはほしい。

そんな時に、ある程度 お決まりの アプリをパッケージングしてくれるサイトがあると便利。それが、GApps。

https://opengapps.org/

TWRPがあるととても簡単にダウンロードしたアプリをインストールできる。