手把手教你玩转 MagiskBoot:内核解包打包全流程
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
MagiskBoot
MagiskBoot 是 Magisk 项目的一个核心子组件,专门用于 解包、修改、重打包 Android 的 boot 镜像(boot.img)。
编译 MagiskBoot
编译环境准备
- Windows下 启用开发者模式,因为需要 symbolic link 支持(编译过程中需要使用到符号链接)
Symbolic Link(符号链接),也叫 软链接,是一种特殊类型的文件,它 指向另一个文件或目录,本身不保存数据,只起到“快捷通道”的作用。
类似于 Windows 中的 快捷方式(.lnk 文件),但更底层、更透明,对程序来说就像访问真实文件一样。
出于安全原因,Windows 默认不允许普通用户创建符号链接,防止恶意程序引导系统或用户操作到错误位置 。
- 安装 python3.8+,并配置PATH环境变量
# 查看python版本信息
py --version
# 查看所有已安装的 Python 解释器路径
py -0p
- git 启用 symbolic links
# 启用 symbolic links
git config --global core.symlinks true
# 查看 git 配置
git config --global --list
安装 Android Studio ,设置环境变量 ANDROID_HOME 为 Android SDK 文件夹的路径。该路径可以在 Android Studio 的设置中找到。
下载 Magisk 源码
# 下载 Magisk 源码
git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
# 如果子模块克隆失败,可以手动克隆这些子模块。进入对应的子模块路径,然后执行以下命令
git submodule update --init --recursive
- 运行 ./build.py ndk,下载并安装 NDK。
py .\build.py ndk
开始编译
# 编译 native 模块,包括 magiskinit magisk magiskboot magiskpolicy
py .\build.py native
# 编译所有模块
py .\build.py all
编译成功后,在 Magisk\native\out\arm64-v8a 目录下可以看到 magiskboot 文件已经生成
使用 magiskboot 解包和打包内核
# 解包 boot.img
./magiskboot unpack boot.img
# 重新打包 img,得到一个 new-boot.img
./magiskboot repack boot.img
在 Windows 下使用 magiskboot
由于编译出来并没有 Windows 版本的 magiskboot 可执行文件。
可以在 magiskboot_build 上下载预编译后的 magicskboot.exe。
比如:下载 magiskboot-e159716-release-windows-mingw-w64-msvcrt-i686-standalone.zip 并解压到 D:\App\magiskboot 目录下
新建 unpack.bat,扩展 magiskboot 使其可指定解压目录
@echo off
:: 检查是否提供了 IMG_PATH 参数
if "%~1"=="" (
echo 请提供boot.img文件的路径作为参数!
exit /b 1
)
:: 获取当前批处理文件所在的目录
set "SCRIPT_DIR=%~dp0"
:: 将相对路径转换为绝对路径
for %%I in ("%~1") do (
set "IMG_PATH=%%~fI"
set "OUTPUT_DIR=%%~dpI%%~nI"
)
:: 创建输出目录(如果不存在)
if not exist "%OUTPUT_DIR%" (
mkdir "%OUTPUT_DIR%"
)
:: 解包 boot.img 到输出目录
cd "%OUTPUT_DIR%"
"%SCRIPT_DIR%magiskboot" unpack "%IMG_PATH%"
echo 解包完成,文件已解包到 "%OUTPUT_DIR%" 目录中。
新建 repack.bat,根据指定解压目录重新打包 img,并把 new-boot.img 存放在解压目录下
@echo off
:: 检查是否提供了解包目录路径作为参数
if "%~1"=="" (
echo 请提供解包目录的路径作为参数!
exit /b 1
)
:: 获取当前批处理文件所在的目录
set "SCRIPT_DIR=%~dp0"
:: 将相对路径转换为绝对路径并获取解包目录名称
for %%I in ("%~1\.") do (
set "UNPACK_DIR=%%~fI"
set "UNPACK_NAME=%%~nxI"
)
:: 检查是否成功获取目录名称
if "%UNPACK_NAME%"=="" (
echo 无法获取解包目录的名称!
exit /b 1
)
:: 获取 UNPACK_DIR 的父目录路径
for %%I in ("%UNPACK_DIR%\..") do (
set "PARENT_DIR=%%~fI"
)
:: 设置新的 BOOT_IMG 路径,位于 UNPACK_DIR 的父目录
set "BOOT_IMG=%PARENT_DIR%\%UNPACK_NAME%.img"
:: 切换到解包目录
cd "%UNPACK_DIR%"
:: 打包回 boot.img
"%SCRIPT_DIR%magiskboot" repack "%BOOT_IMG%"
echo 打包完成,新的 "%BOOT_IMG%" 已生成并存放在 "%UNPACK_DIR%"。
将 magiskboot 解压路径添加到系统 Path 环境变量
# 解包 boot.img
unpack .\boot.img
# 重新打包 img,得到一个 new-boot.img 在 boot 目录下
repack .\boot\
完整源码
开源地址:https://github.com/CYRUS-STUDIO/MagiskBootWindows
相关链接: