
Получите root на эмуляторе Android Studio, пропатчив его ramdisk с помощью Magisk — на чистом Go.
Получите root на эмуляторе Android Studio, пропатчив его ramdisk с помощью Magisk — на чистом Go.
avdroot превращает AVD из холодного запуска в рабочую root-оболочку одной
командой. Всё происходит на хосте: ramdisk распаковывается, перезаписывается
так, чтобы init от Magisk заменил /init, и сжимается обратно. Для сборки образа
не нужны ни shell-скрипт, ни 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)
- [Перехват HTTPS из Chrome](#capturing-https-from-chrome)
- [Поддержка платформ](#platform-support)
- [Язык вывода](#output-language)
- [Разработка](#development)
- [Благодарности и лицензия](#credits-and-licence)
## Почему ещё один
[rootAVD](https://github.com/newbit1/rootAVD) был первопроходцем в этой области и до сих пор
является эталоном для данной техники, но он не поспевает за последними релизами Android и
Magisk. Запуск его против AVD с Android 17 наглядно демонстрирует проблемы,
и каждая из них здесь исправлена:
| Поведение 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 может потребоваться снять атрибут карантина:```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`, и `dyld` в macOS 26 отказывается запускать такой бинарник. 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/
Вам также понадобится Android SDK с adb и эмулятором, а также системный образ google_apis или AOSP. Образы Play Store нельзя рутировать таким способом: они отклоняют 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, когда существует только один, запрашивает
подтверждение один раз и полностью пропускает вопрос, когда 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] | Подробности для одной цели, включая 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 | Объяснить, как был найден каждый путь |
Цель — это имя AVD, путь к системному образу или путь к ramdisk.img.
avdroot <command> --help показывает примеры для каждой команды.
Они применяются к каждой команде: