本文档解释了 Magisk 的原生 C++ 和 Rust 组件如何构建。它涵盖了构建系统架构、原生二进制文件的编译过程以及 Rust 和 C++ 代码之间的集成。有关 Android 应用构建过程的信息,请参阅Android 应用构建。
Magisk 的原生组件使用混合构建系统构建,该系统结合了用于 C++ 代码的 NDK-Build 和用于 Rust 代码的 Cargo。该系统由 Python 构建脚本(build.py)协调,该脚本负责配置、编译和构件收集。
来源:build.py146-221 build.py226-274
Magisk 的原生组件包含多个二进制文件和库,它们由 C++ 和 Rust 源代码混合构建而成。每个组件通常会在两种语言中都有实现,Rust 负责更多现代功能,而 C++ 则保持与 Android NDK 的兼容性。
来源:native/src/Android.mk1-164 native/src/Cargo.toml1-63 native/src/external/Android.mk1-249
构建过程包括几个阶段,从配置开始,到构件收集结束。build.py脚本协调这些阶段,并处理 Rust 和 C++ 的编译。
构建之前,系统会从config.prop加载配置,并设置相应的环境,包括确定要构建的架构。
来源:build.py642-734 build.py825-834
Rust 和 C++ 组件的编译过程不同,但由同一个构建脚本协调。
来源:build.py336-340 build.py230-275 build.py186-221
Magisk 使用cxx crate 提供的 Rust 和 C++ 代码之间的桥梁。这允许两种语言之间的双向调用。
Rust 和 C++ 之间的接口使用桥模块进行定义,这些模块指定了可以在语言之间共享的函数、类型和常量。
来源:native/src/boot/lib.rs25-80 native/src/Cargo.toml10-51
构建系统编译的每个原生组件都在 Magisk 系统中起着特定作用
| 组件 | 目的 | 语言 | 输出类型 |
|---|---|---|---|
| magisk | 主守护进程和命令行工具 | C++/Rust | 可执行文件 |
| magiskinit | 系统初始化和补丁 | C++/Rust | 可执行文件 |
| magiskboot | 启动镜像操作工具 | C++/Rust | 可执行文件 |
| magiskpolicy | SELinux 策略修补程序 | C++/Rust | 可执行文件 |
| resetprop | 系统属性操作 | C++/Rust | 可执行文件 |
| libbase | 所有组件的通用实用程序 | C++ | 静态库 |
| libpolicy | SELinux 策略处理 | C++ | 静态库 |
Magisk 依赖于多个外部库和工具,其中大部分作为 Git 子模块包含在内。
来源:.gitmodules1-28 native/src/external/Android.mk1-249
Magisk 支持为 Android 使用的多种 CPU 架构进行构建。
来源:build.py63-72 build.py722-733
该build.py脚本提供了用于构建原生组件的多个命令
| 命令 | 描述 |
|---|---|
python build.py native | 构建默认的原生二进制文件 |
python build.py native magisk | 仅构建 magisk 二进制文件 |
python build.py native magiskinit | 仅构建 magiskinit 二进制文件 |
python build.py native magiskboot | 仅构建 magiskboot 二进制文件 |
python build.py native magiskpolicy | 仅构建 magiskpolicy 二进制文件 |
python build.py native resetprop | 仅构建 resetprop 二进制文件 |
python build.py all | 构建所有 Magisk 组件(原生 + 应用) |
python build.py clean | 清理所有构建输出 |
来源:build.py737-822 build.py444-482 build.py483-487
编译后,原生二进制文件会组织成特定的目录结构
来源:build.py179-184 build.py395-402
构建系统包含下载和设置特定于 Magisk (ONDK) 配置的 Android NDK 的功能。