広告あり
Dynamic System Updates (DSU) を使って、システムイメージを壊さずにGSI・カスタムロムを起動させる方法を紹介します。
データは残したままデュアルブートできる
AndroidでカスタムROMを使いたいときは、これまでだとfastboot flash system system.img
などで直接システムイメージを上書きしてしまわないと起動ができませんでした。
ある程度開発が進んでいるならこの方法でも良いのですが、「標準ROM (Stock) のイメージが配布されていない」「ちょっとだけ試したい程度」という時には文鎮化のリスクやデータ初期化の手間があります。
そこで今回は、Android 10から搭載されたDynamic System Updates (DSU) を使って、システムイメージを焼かずにカスタムROMを起動させる方法を紹介します。
DSUを使う方法ならユーザーデータもそのままで、初期化する必要はありません。
なお、Android 11では開発者向けオプションにあるDSU Loaderを押せばGoogle製のAOSPイメージをダウンロード & インストールできます。
DSUでのGSIインストールが楽になるアプリDSU Sideloaderがリリース。root化済みならPCなしでできる – AndroPlus
Android 12以降プリインストールの端末では、KernelSUを使って一時root化する方が楽です。
【前提条件】
- Android 10以降
- Bootloader Unlock済み
- Linux、Windows Subsystem for Linux (WSL)、MinGWいずれかの環境
(下記の手順ではPowerShellとWSLを利用すると仮定して説明します) - Magisk をインストールしている場合は23018以上のバージョンを使う (古いと互換性問題があるため)
- 元のシステムよりも新しいセキュリティパッチレベルのGSI (例:Android 12搭載端末でAndroid 11のGSIは使用不可)
- microSDカード対応デバイスの場合は、microSDカードを抜いておく
システムイメージの準備
まずはGSIのシステムイメージを準備します。
GSIのイメージはこちらのサイトにいくつかまとまっています。TrebleDroid AOSP GSIだとUSBデバッグが最初から有効化されていてroot権限が使えるのでおすすめです。
デバイスに合うイメージをダウンロードしてください。
パーティションタイプはAndroid 9以降ではA/B方式に統一されているので、パーティションがAしかないデバイスでもA/B向けを選んでください。
Snapdragon SoC搭載デバイスであれば大抵はarm64・A/B向けイメージ (例:lineage-18.1-20210512-UNOFFICIAL-treble_arm64_bvS.imgなど) を選べば大丈夫です。
次に、simg2imgコマンドを使ってシステムイメージをDSUで使えるよう変換します。
simg2imgはAndroidのSDKか、ここのソースコードでビルドできます。
ダウンロードしたGSIイメージをsystem.imgなどと名前を変更して、simg2img system.img system_raw.img
を実行してください。
Invalid sparce~、Bad magicなどと出た場合は変換の必要がないので、system.imgのままで大丈夫です。以降のコマンドはファイル名を読み替えてください。
デバイスへコピーする
イメージのダウンロード・変換が済んだら、次はデバイス側のDSUの機能フラグを有効にします。
PowerShellで
adb shell setprop persist.sys.fflag.override.settings_dynamic_system true
を実行してください。
問題なく実行できたら何も表示されないので、次に進んでください。
変換したイメージを圧縮し、端末へコピーします。
変換したsystem_raw.imgがあるフォルダでShift + 右クリックしてLinux シェルを開き
gzip -c system_raw.img > system_raw.gz
を実行した後、PowerShellで
adb push system_raw.gz /storage/emulated/0/Download/
を実行してデバイスのDownloadフォルダへイメージをコピーします。
インストールする
いよいよインストールです。
system_raw.imgを右クリックしてプロパティを開き、「ディスク上のサイズ」に書いてあるバイト数をコピーしてください。
その数値を下記コマンドのXXXXXXXXXXの部分にカンマなしで入れてください。(もしくはWSL上でdu -b system_raw.img|cut -f1
を実行すれば同じ数値が出ます)
デバイスの画面を点灯してロック解除した後、PowerShellでadb shell
を実行して
am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE XXXXXXXXXX \
--el KEY_USERDATA_SIZE 34359738368
を実行してください。
KEY_USERDATA_SIZEがDSUで起動したカスタムROM環境で使えるユーザーデータのサイズで、上の例だと32GBです。単位はbitなので、こちらのサイトなどで計算してください。
なお、インストール終了後に自動でDSUへ再起動させるには、
am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE XXXXXXXXXX \
--el KEY_USERDATA_SIZE 34359738368
--ez KEY_ENABLE_WHEN_COMPLETED 1
のように–ez KEY_ENABLE_WHEN_COMPLETED 1を追加してください。
コマンドを実行するとロック解除が求められた後、このようにインストールが始まります。
インストールに失敗しましたと出る場合はユーザーデータのサイズを小さくすると通る場合があります。
しばらくすると「動的システムの準備ができました。使い始めるには、デバイスを再起動してください。」と通知が出るので、再起動します。
うまく起動するGSIであれば、ブートアニメーションが始まり起動します。
例ではXiaomi POCO F3を使っていますが、この通りクセのあるMIUIからでも問題なくDSUを使ってGSIを起動できています。
あくまでGSI (Generic System Image) なので全ての機能が使えるわけではありませんし、明るさの自動調整などがうまく動かないことが多いですが、大抵はWi-FiやBluetooth、モバイルデータなどは正常に動きます。
Phh-Trebleベースなら一部デバイス向けにカスタマイズ・修正されていることがありますし、自分でMagiskモジュールを作って継ぎ足ししても構いません。
もちろんこれを機会にGSIのカスタムROMをビルドしても良いでしょう。
このままだと再起動時に元のシステムイメージに戻ってしまいますが、
adb shell gsi_tool enable
を実行すれば「スティッキー モード」になり、再起動後もGSIで起動します。
adb shell gsi_tool disable
adb shell gsi_tool enable -s
adb shell gsi_tool disable
を実行すれば戻ります。
Stock ROMのイメージ保存にも使える
カスタムROMのお試しとして便利なDSUですが、他の使い道もあります。
LineageOSのGSIなどroot権限を使えるGSIをDSUで起動すれば、こちらのコマンドを使ってStockのイメージを取り出してしまえます。
これまではStock ROMが配布されていないデバイスでbootイメージを手に入れるにはroot化かTWRPをビルドしないといけない、でもそのためにはbootイメージが必要…という卵が先か、鶏が先かという状況でしたが、DSUを使えばサクッと手に入れられます。
一時root化やQFILなど特殊な手段がなくても手に入れられるのは良いですね。
なお、ブートループ状態で取り出す場合は/sdcardを使えないので、下記のように/data/local/tmpを使うと良いです。パスは端末によって異なるので適宜変えてください。
adb shell
su
dd if=/dev/block/by-name/boot of=/data/local/tmp/boot.img
chown shell.shell /data/local/tmp/boot.img
- (adb shell終了後)
adb pull /data/local/tmp/boot.img
ユーザーデータやシステムイメージに影響を与えることなくカスタムROMを使えますし、Bootloader Unlock済みでAndroid 10以降のデバイスを持っている方は一度DSUでの起動をしてみてはいかがでしょうか。