NoActive 四种冻结方式总览 - V2 / V1 / API / Kill 原理与选型
Linux 进程冻结的技术基础
要理解 NoActive 的冻结方式选择,需要先了解 Linux 提供的进程暂停机制。
Linux 提供了以下几种进程暂停执行方式:
| 机制 | 类型 | 原理 |
|---|---|---|
| Kill -STOP (信号 19) | 信号 | 发送停止信号,进程进入 T 状态 |
| Kill -CONT (信号 18) | 信号 | 发送继续信号 |
| Cgroup Freezer V1 | Cgroup | 将进程加入 freezer cgroup,暂停调度 |
| Cgroup Freezer V2 | Cgroup | unified cgroup v2 控制 |
| 内核函数 cgroup_freeze | 内核 | 直接调用内核冻结接口 |
Google 在 Android 中使用 Cgroup Freezer V2 作为官方推荐方案。
NoActive 的四种冻结方式
V2(推荐)
NoActive 首选的冻结方式,使用 Cgroup Freezer V2 机制。
优点:兼容性最好,效果最统一,符合 Android 官方设计。
适用:所有 5.0 及以上内核,5.10+ 推荐首选。
V1
NoActive 实现的 Cgroup Freezer V1 封装。
缺点:冻结父进程不会冻结子进程,存在内存泄露风险。
适用:4.19 内核的 MIUI/HyperOS/RealmeUI/ColorOS 设备(因厂商定制,V2 可能不生效)。
API
暂停执行已缓存的 API 变量。
缺点:不推荐使用,机制不稳定。
Kill
通过信号暂停进程。
优点:任何内核都支持,兼容性最佳。
缺点:内存达到一定程度会触发全解冻。Kill -19 和 Kill -20 各有差异,需要自测哪个有效。
选择推荐
内核 5.10+
→ V2(首选)
内核 4.19 + MIUI/HyperOS/RealmeUI/ColorOS
→ V1
其他内核(4.19 及以下非厂商定制)
→ Kill
以上都不生效
→ 尝试 V2(可能设备支持)→ 再不行用 Kill
冻结方式与内核模块的关系
内核模块的作用是让 NoActive 用户态代码能够访问内核的 Cgroup Freezer 接口。没有内核模块:
- V1/V2 无法工作(用户态权限不足)
- Kill 方式可能有效(通过 Android Process.sendSignal 间接调用)
→ 深入了解 V2 冻结方式原理