
Android StudioエミュレータのramdiskをMagiskでパッチしてroot化する — 純粋なGoで。
avdroot は、コールドスタート状態の AVD から、コマンド1つで動作する root シェルまでを実現します。すべての処理はホスト側で行われます。ramdisk は展開され、Magisk の init が /init を置き換えるように書き換えられ、再圧縮されます。イメージのビルドにはシェルスクリプトも busybox も magiskboot も不要で、エミュレータ内でのコード実行も必要ありません。```
$ avdroot root
==> Target
Pixel_10_Pro_XL (the only AVD)
==> Preparing Magisk's environment
Magisk's files are not unpacked yet; writing them for 31.0 now
ok 14 files written for Magisk 31.0, before the restart that will use them
==> Patching
preinit device: vdd1 (read from the running emulator)
==> Restarting the emulator
booting cold, because a snapshot would restore the pre-patch ramdisk
==> Installing the Magisk app
ok installed com.topjohnwu.magisk (Magisk 31.0)
==> Granting su to the adb shell
ok uid 2000 allowed
==> Verifying root
ok Magisk 31.0:MAGISK:R is running
ok su grants root
root: uid=0(root) gid=0(root) groups=0(root) context=u:r:magisk:s0
## 目次
- [なぜもう一つ必要なのか](#why-another-one)
- [インストール](#install)
- [クイックスタート](#quick-start)
- [コマンド](#commands)
- [仕組み](#how-it-works)
- [Magisk リリースの選択](#choose-a-magisk-release)
- [このツールが対処する落とし穴](#traps-this-tool-handles)
- [Chrome からの HTTPS キャプチャ](#capturing-https-from-chrome)
- [プラットフォームサポート](#platform-support)
- [出力言語](#output-language)
- [開発](#development)
- [クレジットとライセンス](#credits-and-licence)
## なぜもう一つ必要なのか
[rootAVD](https://github.com/newbit1/rootAVD) はこの手法を開拓し、今もなお
そのリファレンスであり続けていますが、最近の Android と
Magisk のリリースには追随していません。Android 17 の AVD に対して実行すると
問題が明らかになり、それぞれがここで修正されています:
| rootAVD の動作 | avdroot |
|---|---|
| `bash`、`busybox`、`unzip`、`xxd`、`strings`、`dd`、`cpio`、および GNU の `stat`/`sed`(macOS では異なる)を必要とする | 単一の静的 Go バイナリ。cpio、LZ4、gzip、xz はすべてプロセス内で実装 |
| スクリプトとバイナリをエミュレータにコピーし、そこで自身を実行する | イメージを完全にホスト上でビルドする |
| 実行のたびに `ramdisk.img` をバックアップするため、最初のパッチ適用後には「無傷の」バックアップ自体がパッチ済みとなり、`restore` でストックに戻せない | 一度だけバックアップし、上書きせず、既存のバックアップがパッチ済みであることが判明した場合は警告する |
| Magisk の古い `magisk32`/`magisk64` レイアウト向けにパッチを適用 | Magisk 26+(`magiskinit`、`magisk`、`init-ld`、`.backup/.rmlist`)を実装 |
| ramdisk のパスを引数として貼り付ける必要がある | SDK、AVD、イメージを自動検出し、`--sdk`/`--avd-home` で上書き可能 |
| 無条件に再起動して期待する | コールドブートを強制し、`su` が実際に `uid=0` を返すことを検証する |
## インストール
**ビルド済みバイナリ** — [Releases](https://github.com/ejfkdev/avdroot/releases) から
お使いのプラットフォーム用のアーカイブを取得してください:```sh
tar -xzf avdroot_linux_amd64.tar.gz
chmod +x avdroot_linux_amd64
sudo mv avdroot_linux_amd64 /usr/local/bin/avdroot
Windows および macOS のアーカイブには単一の実行ファイルが含まれています。macOS では、quarantine 属性をクリアする必要がある場合があります:```sh xattr -d com.apple.quarantine avdroot_darwin_arm64
すべてのリリースでは `SHA256SUMS.txt` も公開されています:```sh
sha256sum -c SHA256SUMS.txt --ignore-missing
Go を使用する場合(1.24 以降):```sh go install github.com/ejfkdev/avdroot@latest
Go 1.24 が最低要件である理由は、それ以前のツールチェーンは `LC_UUID` ロードコマンドを出力せず、macOS 26 の `dyld` がそのようなバイナリの起動を拒否するためです。Go 1.21 と 1.22 も同様に `minos 26.0` を刻印するため、両方の条件で失敗します。
**ソースから:**```sh
git clone https://github.com/ejfkdev/avdroot
cd avdroot
make build # host binary
make all # every release target into dist/
また、adb とエミュレータを含む Android SDK、および google_apis または
AOSP システムイメージが必要です。Play Store のイメージはこの方法では root 化できません。adb root を拒否するため、patch と root は数分後に失敗するのではなく、即座に拒否します。
avdroot list # what exists, and what state it is in avdroot root # patch, restart, install the app, grant su, verify
これで全体です。`root` は AVD が1つしか存在しない場合に AVD 名を必要とせず、一度だけ確認を求め、stdin がターミナルでない場合は質問を完全にスキップします:```sh
avdroot root Pixel_10_Pro_XL --yes # named AVD, unattended
一括ではなく段階的に行いたい場合:```sh avdroot patch # patch only; the emulator need not be running avdroot patch --dry-run # show what would change, write nothing
avdroot install && avdroot verify
元に戻すには:```sh
avdroot restore # restores ramdisk.img.backup
| コマンド | 説明 |
|---|---|
avdroot root [target] | パッチ適用、再起動、インストール、su 付与、検証 — 無人実行 |
avdroot patch [target] | ramdisk のみをパッチ; 書き込み前に確認 |
avdroot restore [target] | ramdisk.img.backup から復元 |
avdroot list | AVD、システムイメージとそのパッチ状態 |
avdroot status [target] | 1 つのターゲットの詳細 (preinit デバイスを含む) |
avdroot verify [target] | Magisk が動作し su が uid=0 を返すことを確認 |
avdroot install | 実行中のエミュレータに Magisk アプリをインストール |
avdroot magisk info | どのインストーラが使用されるか、およびその対応内容 |
avdroot magisk fetch | リリースをダウンロード (--list、--version、--prerelease) |
avdroot trust-chrome | Chrome に傍受 CA を信頼させる (--cert、--clear) |
avdroot doctor | 各パスがどのように特定されたかを説明 |
target とは、AVD 名、システムイメージのパス、または ramdisk.img へのパスのことです。
avdroot <command> --help で各コマンドの例を表示します。
これらはすべてのコマンドに適用されます:
| フラグ | 効果 |
|---|---|
--sdk PATH | Android SDK ルート (検出が誤ったものを選んだ場合) |
--avd-home PATH | AVD 定義が存在する場所 |
--serial SERIAL | 複数のデバイスが接続されている場合に使用するデバイス |
--magisk PATH | 特定の Magisk インストーラを使用 |
--abi ABI | 検出された ABI を上書き |
--compress FORMAT | ramdisk の圧縮形式を上書き (gzip、lz4_legacy、lz4、xz) |
--preinit DEVICE | preinit ブロックデバイスを上書き |
--lang | 出力言語 (en または zh)、システムロケールを上書き |
--no-adb | 実行中のエミュレータに接続しない |
--no-download | Magisk インストーラを自動的に取得しない |
| フラグ | コマンド | 効果 |
|---|---|---|
-y、--yes | root、patch | 確認プロンプトをスキップ |
--dry-run | patch | 計画を表示し、何も書き込まない |
--force | root、patch | すでにパッチ済みの ramdisk を再パッチ |
--no-install | root | Magisk アプリのインストールをスキップ; root 化はこれに依存しない |
--no-restart | root、trust-chrome | エミュレータまたはブラウザをそのままにする |
--timeout 10m | root | 起動を待つ時間 |
--keep-verity、--keep-forceencrypt | patch | どちらもデフォルトで有効; 無効にすると fstab オプションを削除 |
--recovery-mode | patch | リカバリ用にパッチ (API 28 では暗黙的に適用) |
--cert PATH | trust-chrome | 信頼する CA; 省略時は自動検出 |
--clear | trust-chrome | ブラウザの信頼を元に戻す |
--list | restore、magisk fetch | 実行せずに一覧表示 |
最新のシステムイメージの ramdisk.img は cpio newc アーカイブであり、
gzip、lz4、または xz で圧縮されています。Android 11 以降のイメージは、
1 つの圧縮ストリーム内に 2 つのアーカイブ — 汎用 ramdisk とベンダー ramdisk —
を連結していることがよくあります。パッチ適用とは、次のことを意味します: