KernelSUを使い、root化のために必要なboot.imgを取り出す方法を紹介します。
bootを焼かずに一時root化が可能
Androidスマホをroot化する際は、一般的にはboot (もしくはinit_boot) パーティションのイメージファイルを入手してMagiskでパッチする必要があります。
ただ、どんな機種でもROMのZIPファイルが配布されているわけではないため、配布されていない場合はDSU Loaderを使って端末自身から取り出す必要がありました。
DSU Loaderがなかった頃はぶっつけ本番でroot化済みGSIを焼いて取り出すなど大変な作業が必要でした。
今回紹介するKernelSUを使うと、DSU Loaderの準備をすることなく簡単にbootイメージを取り出せるようになります。
機種によっては焼かずに起動のみさせることもできるため、元々のパーティションを汚すことなく一時root化できます。
汎用カーネルイメージ (GKI) の仕組みを利用
KernelSUはカーネル側での実装でroot権限を利用できるようにするものです。
ユーザースペース側で動作するMagiskよりもroot化状態の検出が難しくなっており、カーネルのメモリにアクセスしたりシステムコールを改変したりすることもできます。
Android 11以降で搭載された汎用カーネルイメージ (GKI)、特にAndroid 12以降のGKI 2.0のおかげで機種毎にカーネルをビルドする必要がなくなり、ビルド済みのKernelSUのイメージをダウンロードするだけで済みます。
GKI 2.0に準拠しないAndroid 12以降の端末は存在しないはずなので、Bootloader UnlockさえできればKernelSUでどんな機種でもroot化できるというわけです。
KernelSUはGKI 1.0採用端末でも動作するものの、その場合はカーネルのビルドが必要です。
アプリで対応可否を簡単チェック
まずはKernelSUのReleasesページより、KernelSUのAPKをダウンロードしてインストールしてください。
「Assets」のところにある「Show all xx assets」を押すとファイル一覧が出てきます。
KernelSU_v(バージョン)-release.apkをダウンロードして、スマホへコピーしてファイル管理アプリで開いてインストールしてください。
KernelSUアプリを開くと、「未インストール」と表示されます。
ここが「非対応」だとGKI 2.0非対応ということなのでKernelSUは使えません。DSU Loaderを使ってください。
「カーネル」の部分の数字を確認して、KernelSUのReleasesページで同じバージョンのものを探してください。
あくまでもカーネルイメージのバージョンなので、Androidバージョンは関係ありません。
下の画像だと5.10.101-android12なので、v0.4.0の時点だとksu-10672-Image-android12-5.10.101_2022-05-boot.img.gzが必要なファイルです。
機種によってはboot-lz4やboot-gzと書かれたものを選ばないといけませんが、大抵は通常版で大丈夫です。
7zipなどのアプリでgzファイルを展開して中身のimgファイルを取り出します。
スマホ側で開発者向けオプション→USBデバッグを有効化し、PC側でコマンドウインドウを開いてadb reboot bootloader
を実行してBootloaderモードへ再起動してください。
fastboot boot (ファイル名).img
を実行して起動します。(先ほどの例だとfastboot boot ksu-10672-Image-android12-5.10.101_2022-05-boot.img
)
fastboot bootに対応している機種であれば、そのまま起動されます。
非対応機種だと起動できないためfastboot flash boot (ファイル名).img
で焼かないといけないのですが危険なので、その場合はDSU Loaderを使った方が安全です。
KernelSUが動作していれば、KernelSUアプリで「動作中」と表示されます。
KernelSUはモジュール機能も開発されているものの、Magiskモジュールとは互換性が無いようです。
スーパーユーザー権限を使わせる許可を与えるため、下部中央の「スーパーユーザー」タブを開いて右上のメニューで「システムアプリを表示」を押します。
「シェル」を探してオンにしてください。
これでadb shellでsuコマンドを利用できるようになります。
adb shell
su
を実行してコマンドの先頭部分が#になれば、こちらのコマンドを使ってイメージをすべてバックアップできます。
bootだけ欲しければdd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot.img
のようにすれば取り出せます。(パスは適宜変更してください)
_a、_bの2つがある場合はgetprop ro.boot.slot_suffix
コマンドで今どちらのパーティションを使っているか確認できます。
Android 13カーネルを搭載した端末 (ほぼすべてのAndroid 13プリインストール端末) からは、boot.imgの代わりにinit_boot.imgの取り出しが必要です。
Android 12以降プリインのスマホをroot化したいけれどStock ROMの配布先が見つからない、という場合にぜひKernelSUを使ってみてください。