菜单

原生组件构建

相关源文件

本文档解释了 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

Rust 和 C++ 集成

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可执行文件
magiskpolicySELinux 策略修补程序C++/Rust可执行文件
resetprop系统属性操作C++/Rust可执行文件
libbase所有组件的通用实用程序C++静态库
libpolicySELinux 策略处理C++静态库

来源:native/src/Android.mk7-140

构建依赖

Magisk 依赖于多个外部库和工具,其中大部分作为 Git 子模块包含在内。

来源:.gitmodules1-28 native/src/external/Android.mk1-249

多架构支持

Magisk 支持为 Android 使用的多种 CPU 架构进行构建。

来源:build.py63-72 build.py722-733

构建 CLI 命令

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

NDK 设置流程

构建系统包含下载和设置特定于 Magisk (ONDK) 配置的 Android NDK 的功能。

来源:build.py513-531 build.py312-320