下载镜像
首先选择镜像,我一开始尝试的是成 CM 的 7.0 镜像但由于是全虚拟的系统,这个版本的系统开启 ADB 后,虽然可以开启网络端口监听,但无法首次就用网络连接(无法 auth)。PrimeOS 也是遇到同样的问题甚至无法直接开启网络 ADB。后来换用 Android x86 9.0 版本,自带 root 权限,默认开启 ADB 且支持首次网络连接。
镜像下载:https://mirrors.tuna.tsinghua.edu.cn/osdn/android-x86/。
折腾完发现有打好 Magisk 的镜像,https://androidx86magisk.osdn.io/,如果早点看到本文完结。
提取 boot.img
- 从 ISO 镜像中复制出
kernel
和ramdisk.img
这两个文件
mkdir -p /mnt/temp
mount -t iso9660 -o loop android.iso /mnt/temp
cp /mnt/temp/kernel .
cp /mnt/temp/ramdisk.img .
umount /mnt/temp
- 安装工具软件
mkbootimg
、abootimg
(在 Linux 开发系统,如以下命令以 Debian 系为例)
apt install android-tools-mkbootimg abootimg
- 将
kernel
和ramdisk.img
打包成boot.img
mkbootimg --kernel kernel --ramdisk ramdisk.img -o boot.img
mkbootimg
是 Android 系统中一个用于创建内核镜像文件的工具,常见用法和参数说明如下:mkbootimg \ --kernel <kernel-image> \ [--ramdisk <ramdisk-image>] \ [--second <second-image>] \ [--dtb <dtb-image>] \ [--cmdline <kernel-command-line>] \ [--base <address>] \ [--pagesize <size-in-bytes>] \ [--ramdisk_offset <address>] \ [--tags_offset <address>] \ [--ivt_offset <address>] \ [--os_version <version>] \ [--os_patch_level <yyyy-mm-dd>] \ [--header_version <version>] \ -o <image-output-file>
参数说明:
--kernel
: 指定内核镜像文件路径。--ramdisk
: 可选参数,指定 RAM disk 镜像文件路径。如果在cmdline
中指定将使用另外一个 ramdisk-image。--second
: 可选参数,指定第二阶段启动器镜像文件路径。--dtb
: 可选参数,指定设备树二进制文件路径。--cmdline
: 内核命令行,指定内核启动参数。--base
: 可选参数,指定内存基址,为一个 16 进制数。--pagesize
: 页面大小,指定内存页面大小,默认为 2048。--ramdisk_offset
: RAM disk 镜像文件在内存中的 offset。--tags_offset
: Tag 信息在内存中的 offset。--ivt_offset
: IVT 信息在内存中的 offset。--os_version
: 操作系统版本号。--os_patch_level
: 操作系统补丁等级,格式为yyyy-mm-dd
。--header_version
: Boot image header 版本号,默认值为 1。-o
: 输出镜像的文件路径。除了上述参数外,还有其他较少用到的参数,如
--hash
等。根据实际情况需要设置不同的参数。
开启 ADB
- 在 系统 - 关于 中多次点击版本号,直到开启开发者模式
- 开发者选项 中开启ADB
- 在 关于 - 状态 中查看当前 IP
- 通过 ADB 连接
adb connect 192.168.100.1
给 boot.img
补丁
- 在 PVE 中创建虚拟机(如下图参数,不添加额外 EFI 盘),用上面步骤下载的 ISO 安装系统(如果有现有的 Android 系统,安装 Magisk 即可用来打补丁)
引导菜单进入 ISO 启动菜单,选择
Advence Options
,然后选择自动安装(此次安装系统只是为了打补丁,并不用于实际运行)。进入系统后,安装 Magisk APK。用 ABD 将
boot.img
传输到 Android 系统中
adb push ./boot.img /storage/self/primary/Download/
- 在 Magisk 中点击安装,选择并修补一个文件(选择
boot.img
)
- Magisk 补丁后将会在相同目录生成一个 img 文件
magisk_patched-xxx.img
,使用 ADB pull 将文件下载到本地。
打包新系统镜像
abootimg -x patched_boot.img
先解压 patched_boot
,然后将 zImage
重命名为 kernel
,initrd.img
重命名为 ramdisk.img
# 新建临时处理文件夹
mkdir -p /tmp/original_iso
mkdir -p /tmp/new_iso
# 挂载原始镜像 android.iso
mount -t iso9660 -o loop ./android.iso /tmp/original_iso
# 复制 ISO 中所有文件到新的镜像临时目录
cd /tmp/original_iso && tar cf - . | (cd /tmp/new_iso; tar xfp -)
# 放入新的 patched 文件
cp ./kernel /tmp/new_iso
cp ./ramdisk.img /tmp/new_iso
# 重新打包为 EFI 可引导 ISO
xorriso -as mkisofs -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -o ./androidx86-patched.iso /tmp/new_iso
处理完毕后解除挂载 umount /tmp/original_iso
Windows 系统使用 UltraISO 打开原始 Android x86 镜像,将补丁后的
kernel
和ramdisk.img
拖进去,导出新镜像。
安装
用上述提到的 PVE 参数新建虚拟机(或者复用上述现有虚拟机),ISO 镜像选择导出的新镜像。启动虚拟机,选择普通安装模式。
进入 gdisk 分区界面
- 选择 New 创建 EFI 分区(起始位置默认,大小
250Mb
,分区类型ef00
) - 再次选择
New
创建系统分区(起始位置默认,大小默认全部,分区类型默认8300
) - 选择 Write 写入
将系统分区格式化为 ext4
,第一个分区(EFI)将会默认格式化为 vfat
。
将 /system
设置为可读写(下图选择 yes)
启动 & 使用
安装系统后,启动 Android,并安装 Magisk 可以看到已经是安装好的状态。
问题
由于 x86 官方镜像里已带有 su,打开 Magisk 检测到多个 su 则会提示:不属于Magisk的su文件异常状态怎么办
开发机内# adb root
开发机内# adb shell
android 内# su root
android 内# rm /system/xin/su
另外此种方式安装的 Magisk 每次启动都会如下图提示,但功能不受影响。
安装 Lsposed
首先安装 riru,从 Github 下载 riru-xxx-release.zip
,使用 adb push 上传到 Andorid 中,然后在 Magisk 模块中选择 从本地安装。
然后下载 LSPosed-xxx-riru-release.zip
,使用 adb push 上传到 Andorid 中,然后在 Magisk 模块中选择 从本地安装。重启系统即可。