一、核心功能与原理
1. 功能概述
- 目标:通过冻结后台缓存应用的进程,减少其对 CPU、内存等系统资源的消耗,优化设备性能与续航。
- 适用场景:针对行为不当的后台应用(如后台偷偷运行代码、占用 CPU),强制其进入"休眠"状态。
2. 技术实现
- 基于内核 cgroup v2 冻结器 :通过将应用进程迁移到 冻结的 cgroup(控制组),暂停进程执行,保留内存状态(类似"挂起")。
- 效果 :
- 减少活跃缓存应用的 CPU 消耗(包括活跃和空闲状态)。
- 降低内存占用优先级,系统可优先回收冻结进程的内存。
二、启用与停用方法
1. 通过开发者选项启用
- 操作路径:设置 → 开发者选项 → 勾选"暂停执行已缓存的应用"。
2. 通过 ADB 命令配置(需 root 或调试权限)
-
启用命令 :
bashadb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
-
停用命令 :
bashadb shell device_config put activity_manager_native_boot use_freezer false && adb reboot
3. 检查状态
- 启用后,系统会通过 cgroup v2 冻结器管理后台缓存进程。
三、API 与开发注意事项
1. 系统 API(隐藏接口)
- 主要接口 :
setProcessFrozen
:手动冻结/解冻进程。enableFreezer
:控制冻结器全局开关。
- 参考代码 :可查看
ActivityManager
中的Process.java
和ActivityManagerService
相关实现。
2. 自定义功能的兼容性问题
- 问题场景:若应用依赖后台缓存进程执行特定功能(如后台定位、周期性任务),冻结后可能导致功能异常。
- 解决方案 :
-
将需要运行的进程状态改为 非缓存状态 ,例如:
- 绑定前台服务(BFGS,Foreground Service)。
- 将进程提升为前台状态(如显示通知)。
-
示例代码逻辑 :
java// 在需要后台运行时,启动前台服务避免冻结 Intent serviceIntent = new Intent(context, MyBackgroundService.class); context.startForegroundService(serviceIntent);
-
四、测试与验证方法
1. 命令行工具检查
-
查看冻结进程列表 :
bashadb shell dumpsys activity | grep "Apps frozen:"
- 输出结果会列出当前被冻结的应用包名。
2. 内核 cgroup 状态检查
-
查看冻结器文件 :
bashls /sys/fs/cgroup/uid_0/cgroup.freeze
- 若文件存在且值为
1
,表示冻结器已启用。
- 若文件存在且值为
3. 日志监控
-
通过 Logcat 追踪冻结事件 :
bashadb logcat | grep -i "\(freezing\|froze\)"
-
典型日志示例:
ActivityManager: Freezing process com.example.app (pid=12345) ActivityManager: Froze process com.example.app after 100ms
-
五、典型应用场景与效果
场景 | 冻结前行为 | 冻结后行为 |
---|---|---|
后台社交应用 | 持续刷新消息、轮询服务器、占用 CPU/网络 | 进程暂停,不再执行代码,网络请求挂起 |
新闻类应用缓存进程 | 后台预加载内容、定期更新数据库 | 预加载停止,数据库操作暂停 |
未激活的多任务应用 | 多个进程同时运行,内存占用高 | 非前台进程逐步冻结,仅保留必要系统进程活跃 |
存在后台漏洞的应用 | 利用后台漏洞执行恶意代码(如挖矿、偷跑流量) | 代码执行完全停止,阻断资源滥用 |
六、注意事项
-
兼容性限制:
- 仅支持搭载 cgroup v2 内核的设备,部分旧机型可能不适用。
- 冻结器功能可能与部分系统优化工具(如内存清理软件)冲突。
-
开发者适配建议:
- 避免依赖后台缓存进程执行关键任务,优先使用系统允许的后台模式(如前台服务)。
- 通过
onTrimMemory()
等回调处理内存紧张场景,而非依赖后台持续运行。
-
用户体验平衡:
- 冻结器可能略微增加应用冷启动时间(需从内存恢复状态),但优于强制杀进程后的重新加载。
ps:内容基于 Android 11 QPR3 及更高版本的特性: