在 Android 开发过程中,免不了要将应用丢到设备上测试。如果使用实体设备,每次都要配置 ADB 连接,非常麻烦;甚至在开发某些 Xposed 模块时,需要将设备反复重启,大大降低了调试效率。如果能将这些工作都转移到 AVD (Android Virtual Devices)上来完成,一切就都变得简单起来……

由于我的电脑是 Linux,部分操作细节可能会与 Windows 有所区别

  说干就干,根据 官方说明,首先需要将代码全部克隆到本地:

1
2
git clone --branch v24.2 --recurse-submodules https://github.com/topjohnwu/Magisk.git
cd Magisk

  这里的 v24.2 是版本的 tag,你也可以根据需要选择合适的 Magisk 版本。然后是 AVD 系统镜像的选择,截至撰写本文的时候,Magisk 构建脚本对于 Android R 的 patch 还不太稳定,因此建议选择 Android Q(API 29)的版本。

  构建脚本默认不会输出构建过程中的 log,这让人在漫长的等待中多少有点没底,无法确定是不是寄了,所以我们修改 build.py 中的 system() 函数,让它把日志打出来:

1
2
3
4
5
6
7
def system(cmd):
proc = subprocess.Popen(['sh', '-c', cmd], stdout=subprocess.PIPE, shell=False)
while proc.poll() is None:
line = proc.stdout.readline().decode()
print(line, end='')
return proc
# return subprocess.run(cmd, shell=True, stdout=STDOUT)

  然后是环境变量的配置,只有两条,分别是 Android Studio 使用的 jdk 路径和 Android SDK 路径:

1
2
export PATH="/snap/android-studio/current/android-studio/jre/bin:$PATH"
export ANDROID_SDK_ROOT="/home/mufanc/Android/Sdk"

  这两个路径都能在你的 Android Studio 设置中找到:

  接着下载 Magisk 所使用的 NDK,这一步非常简单,一条命令即可完成:

1
./build.py ndk

  一切准备就绪后,保持你的 AVD 为开启状态,然后开始构建 Magisk:

1
2
./build.py stub
./build.py avd_patch /home/mufanc/Android/Sdk/system-images/android-29/google_apis/x86_64/ramdisk.img

  注意将上述命令中的路径换成你的 ramdisk.img 路径。

  等待所有命令执行完成后,关闭 AVD 虚拟机,然后从下拉菜单中选择 Cold Boot Now,静静等待奇迹出现🙏

  当那熟悉的 Google 徽标再一次出现在屏幕上,代表着 Magisk 已经成功地安装到这台 AVD 中,接下来便是海阔凭鱼跃,天高任鸟飞……

  • 2022-09-21 补充:

  对于大多数情况,用 magisk 提供的 avd 脚本即可,它会通过 root 权限模拟 Magisk 的运行,使用方式也很简单,在保持 AVD 开启且能通过 adb 访问的状态下,执行:

1
2
3
4
5
git clone --branch <tag> https://github.com/topjohnwu/Magisk
cd Magisk
export ANDROID_SDK_ROOT="xxxxxxx"
./build.py ndk
./build.py emulator