本文档描述了 Magisk 项目的自动化持续集成和持续部署(CI/CD)流水线。它涵盖了 GitHub Actions 工作流、构建过程、测试基础设施和伪影管理,以确保代码质量并促进可靠的发布。
有关如何手动从源代码构建 Magisk 的信息,请参阅 从源代码构建。有关通用构建系统架构的详细信息,请参阅 构建系统。
Magisk CI/CD 流水线使用 GitHub Actions 来自动执行跨多个平台和 Android API 级别的构建和测试。流水线由推送到 master 分支、拉取请求到 master 或手动分派触发。
来源:.github/workflows/build.yml1-127
CI/CD 流水线定义在 .github/workflows/build.yml 文件中。当影响构建的关键路径发生更改时,该文件会被触发。
当更改推送到 master 分支中的文件时,工作流会自动运行
app/** - Android 应用程序代码native/** - 本地 C++ 和 Rust 组件buildSrc/** - 构建系统实用程序build.py - 主构建脚本gradle.properties - 构建配置gradle/libs.versions.toml - 依赖版本.github/workflows/build.yml - 工作流本身工作流包含三种主要类型的作业
来源:.github/workflows/build.yml3-16
在构建之前,工作流使用自定义 GitHub Action 来设置必要的环境。
环境设置处理
此设置发生在 .github/actions/setup/action.yml 文件中,该文件在所有作业中重复使用。
来源:.github/actions/setup/action.yml1-107 .github/actions/setup/sccache.sh1-26
主构建作业使用 build.py 脚本执行多个构建任务。
-vr all 标志构建发布版本-v all 标志构建调试版本构建过程产生两组伪影
主伪影位于 out 目录中
app-debug.apk - 调试 APKapp-release.apk - 发布 APKtest.apk - 测试应用程序调试符号和映射文件
来源:.github/workflows/build.yml19-56
为确保 Magisk 在不同的操作系统上正确构建,工作流包含一个在 Windows 和 Ubuntu 上运行的测试构建作业。
此作业验证代码是否能在不同平台上无错误地构建,但不生成伪影。它使用 .github/ci.prop 中指定的最小配置,将构建限制为仅 arm64-v8a ABI 以加快执行速度。
来源:.github/workflows/build.yml58-78 .github/ci.prop1-2
Magisk 使用两种模拟器类型进行自动化测试
AVD 测试在从 23 到 36(Android 6.0 到 16.0)的各种 Android API 级别上验证 Magisk 功能。它为 64 位和 32 位架构运行单独的测试矩阵。
AVD 测试过程
对于 API 级别 23-35,它测试标准的 x86_64 架构。对于 API 级别 23-30,它还测试 32 位 x86 架构。对于 API 36,它测试标准和 16k 页面的变体。
来源:.github/workflows/build.yml80-167 scripts/avd_test.sh1-203 scripts/test_common.sh1-80
Cuttlefish 测试提供比标准 AVD 更接近 AOSP 的环境。
Cuttlefish 测试过程
Cuttlefish 测试目前使用最新的 AOSP 发布分支 (aosp-android-latest-release) 和 aosp_cf_x86_64_only_phone 设备配置。
来源:.github/workflows/build.yml169-210 scripts/cuttlefish.sh1-121
测试套件通过仪器化测试来验证 Magisk 功能的各个方面。
| 测试类别 | 描述 | 测试类 |
|---|---|---|
| 应用功能 | 核心 Magisk 应用功能 | MagiskAppTest |
| 应用隐藏 | 测试 Magisk 应用的隐藏/恢复 | AppMigrationTest |
| 附加测试 | 附加功能测试 | AdditionalTest |
测试执行顺序
所有测试均通过 Android 仪器框架使用 am instrument 命令执行。
来源:scripts/test_common.sh30-79
虽然未在工作流文件中明确定义,但 Magisk 项目通过以下机制将 CI 流水线用于持续部署
版本信息配置在 gradle.properties 中
magisk.versionCode - 数字版本代码(例如,28103)magisk.stubVersion - 用于更新的存根 APK 版本(例如,40)此信息在构建过程中作为注释编码在 APK 中,这使得应用能够确定是否有可用更新。
来源:gradle.properties31-34 buildSrc/src/main/java/Setup.kt348-355
CI/CD 流水线采用高效的缓存来加速构建
使用三种类型的缓存
这些缓存使用 GitHub Actions 缓存功能进行存储和恢复,具有不同的缓存键,具体取决于缓存的内容。
来源:.github/actions/setup/action.yml27-103 .github/workflows/build.yml44-56
CI/CD 流水线与整体 Magisk 构建系统集成,如 构建系统中所述。它利用模块化构建结构来生成 Magisk 的各种组件。
构建过程会编译:
这些组件随后由测试作业用于验证功能。
来源: build.gradle.kts1-8 native/build.gradle.kts1-33 app/build.gradle.kts1-6
Magisk 的 CI/CD 流水线提供了一个全面的系统,用于构建、测试和部署 Magisk 应用程序及其组件。它确保了在发布给用户之前,可以跨多个 Android API 级别和设备配置对更改进行彻底测试。
该流水线利用 GitHub Actions、高效的缓存和自动化测试来维护代码质量并促进快速开发。通过在 AVD 和 Cuttlefish 模拟器上进行测试,它提供了对不同 Android 环境的良好覆盖。