Cgroup Freezer V2 冻结机制详解 - NoActive 推荐方案
Cgroup Freezer V2 概述
Cgroup Freezer V2 是 Linux unified cgroup v2 控制器中的一项功能,是 Google 在 Android 中采用的官方进程冻结机制。
V2 技术原理
Cgroup 概念
Cgroup(Control Groups)是 Linux 内核的资源隔离机制。每个进程可以归入一个 cgroup,管理员可以对 cgroup 中的进程统一施加资源限制。
Freezer 控制器
Freezer 是 cgroup v2 的一个控制器,它可以暂停和恢复 cgroup 中所有进程的调度:
- 当 cgroup 的
cgroup.freeze设为 1 时,cgroup 中的所有进程暂停执行 - 当设为 0 时,所有进程恢复执行
为什么 V2 比信号好
| 对比 | 信号暂停(Kill) | Cgroup Freezer V2 |
|---|---|---|
| 暂停范围 | 单个进程 | 整个 cgroup 所有进程(父子进程自动覆盖) |
| 资源占用 | 进程仍占据 CPU 调度队列 | 进程被移出调度队列,CPU 完全空闲 |
| 可靠性 | 应用可捕获信号 | 内核级强制暂停 |
| Android 支持 | 需自测有效性 | 官方 API 支持 |
NoActive 的 V2 实现
内核模块桥接
由于系统权限限制,NoActive Xposed 模块本身无法直接操作 Cgroup Freezer V2 接口。ReKernel 系列内核模块提供了用户态到内核态的桥接能力。
两种 V2 调用方式
NoActive 的 V2 模式实际包含两种实现:
方式一:Android Process.setProcessFrozen
Android 在高版本提供了 Process.setProcessFrozen() 系统 API,直接调用 Cgroup Freezer V2。NoActive 可以在有权限时直接调用。
方式二:NoActive 实现封装
通过内核模块,NoActive 自行封装了 Cgroup Freezer V2 的调用逻辑,兼容性更广。
冻结流程示例
以应用切换为例:
- 用户从应用 A 切换到应用 B
- NoActive Hook 到应用切换事件
- 应用 A 被标记为后台
- 等待 3 秒(事件驱动延迟)
- NoActive 通过内核模块调用 Cgroup Freezer V2 冻结应用 A 的所有进程
- 应用 A 的进程从 CPU 调度队列移除
- 用户切回应用 B
- NoActive Hook 到前台切换事件
- 立即解冻应用 B
- 应用 B 进程恢复调度
V2 模式的局限性
部分厂商定制 ROM 的干扰
MIUI、HyperOS、RealmeUI、ColorOS 等厂商定制 ROM 对 4.19 内核的 Cgroup Freezer V2 做了修改,可能导致 V2 不生效。
内核版本检测问题
由于 System 权限限制,NoActive 无法可靠检测 Cgroup Freezer 版本,只能通过 Hook 系统是否支持"暂停执行已缓存"来间接判断。
V2 vs V1
| 对比 | V2 | V1 |
|---|---|---|
| 进程覆盖 | 父子进程全冻结 | 只冻结父进程 |
| 内存泄露 | 无 | 可能有 |
| 兼容性 | 5.0+ 内核 | 厂商定制 4.19 |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐ |
→ 继续 V1 与 Kill 冻结方式