NoActive 中文文档 下载 App

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 中所有进程的调度:

为什么 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 的调用逻辑,兼容性更广。

冻结流程示例

以应用切换为例:

  1. 用户从应用 A 切换到应用 B
  2. NoActive Hook 到应用切换事件
  3. 应用 A 被标记为后台
  4. 等待 3 秒(事件驱动延迟)
  5. NoActive 通过内核模块调用 Cgroup Freezer V2 冻结应用 A 的所有进程
  6. 应用 A 的进程从 CPU 调度队列移除
  7. 用户切回应用 B
  8. NoActive Hook 到前台切换事件
  9. 立即解冻应用 B
  10. 应用 B 进程恢复调度

V2 模式的局限性

部分厂商定制 ROM 的干扰

MIUI、HyperOS、RealmeUI、ColorOS 等厂商定制 ROM 对 4.19 内核的 Cgroup Freezer V2 做了修改,可能导致 V2 不生效。

内核版本检测问题

由于 System 权限限制,NoActive 无法可靠检测 Cgroup Freezer 版本,只能通过 Hook 系统是否支持"暂停执行已缓存"来间接判断。

V2 vs V1

对比V2V1
进程覆盖父子进程全冻结只冻结父进程
内存泄露无可能有
兼容性5.0+ 内核厂商定制 4.19
推荐度⭐⭐⭐⭐⭐⭐⭐

→ 继续 V1 与 Kill 冻结方式