当前位置: 首页 > article >正文

Android 缓存应用冻结器(Cached Apps Freezer)

一、核心功能与原理

1. 功能概述
  • 目标:通过冻结后台缓存应用的进程,减少其对 CPU、内存等系统资源的消耗,优化设备性能与续航。
  • 适用场景:针对行为不当的后台应用(如后台偷偷运行代码、占用 CPU),强制其进入“休眠”状态。
2. 技术实现
  • 基于内核 cgroup v2 冻结器:通过将应用进程迁移到 冻结的 cgroup(控制组),暂停进程执行,保留内存状态(类似“挂起”)。
  • 效果
    • 减少活跃缓存应用的 CPU 消耗(包括活跃和空闲状态)。
    • 降低内存占用优先级,系统可优先回收冻结进程的内存。

二、启用与停用方法

1. 通过开发者选项启用
  • 操作路径:设置 → 开发者选项 → 勾选“暂停执行已缓存的应用”。
2. 通过 ADB 命令配置(需 root 或调试权限)
  • 启用命令
    adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot
    
  • 停用命令
    adb shell device_config put activity_manager_native_boot use_freezer false && adb reboot
    
3. 检查状态
  • 启用后,系统会通过 cgroup v2 冻结器管理后台缓存进程。

三、API 与开发注意事项

1. 系统 API(隐藏接口)
  • 主要接口
    • setProcessFrozen:手动冻结/解冻进程。
    • enableFreezer:控制冻结器全局开关。
  • 参考代码:可查看 ActivityManager 中的 Process.javaActivityManagerService 相关实现。
2. 自定义功能的兼容性问题
  • 问题场景:若应用依赖后台缓存进程执行特定功能(如后台定位、周期性任务),冻结后可能导致功能异常。
  • 解决方案
    • 将需要运行的进程状态改为 非缓存状态,例如:
      • 绑定前台服务(BFGS,Foreground Service)。
      • 将进程提升为前台状态(如显示通知)。
    • 示例代码逻辑
      // 在需要后台运行时,启动前台服务避免冻结
      Intent serviceIntent = new Intent(context, MyBackgroundService.class);
      context.startForegroundService(serviceIntent);
      

四、测试与验证方法

1. 命令行工具检查
  • 查看冻结进程列表
    adb shell dumpsys activity | grep "Apps frozen:"
    
    • 输出结果会列出当前被冻结的应用包名。
2. 内核 cgroup 状态检查
  • 查看冻结器文件
    ls /sys/fs/cgroup/uid_0/cgroup.freeze
    
    • 若文件存在且值为 1,表示冻结器已启用。
3. 日志监控
  • 通过 Logcat 追踪冻结事件
    adb logcat | grep -i "\(freezing\|froze\)"
    
    • 典型日志示例:
      ActivityManager: Freezing process com.example.app (pid=12345)
      ActivityManager: Froze process com.example.app after 100ms
      

五、典型应用场景与效果

场景冻结前行为冻结后行为
后台社交应用持续刷新消息、轮询服务器、占用 CPU/网络进程暂停,不再执行代码,网络请求挂起
新闻类应用缓存进程后台预加载内容、定期更新数据库预加载停止,数据库操作暂停
未激活的多任务应用多个进程同时运行,内存占用高非前台进程逐步冻结,仅保留必要系统进程活跃
存在后台漏洞的应用利用后台漏洞执行恶意代码(如挖矿、偷跑流量)代码执行完全停止,阻断资源滥用

六、注意事项

  1. 兼容性限制

    • 仅支持搭载 cgroup v2 内核的设备,部分旧机型可能不适用。
    • 冻结器功能可能与部分系统优化工具(如内存清理软件)冲突。
  2. 开发者适配建议

    • 避免依赖后台缓存进程执行关键任务,优先使用系统允许的后台模式(如前台服务)。
    • 通过 onTrimMemory() 等回调处理内存紧张场景,而非依赖后台持续运行。
  3. 用户体验平衡

    • 冻结器可能略微增加应用冷启动时间(需从内存恢复状态),但优于强制杀进程后的重新加载。

ps:内容基于 Android 11 QPR3 及更高版本的特性:

http://www.lryc.cn/news/2395472.html

相关文章:

  • 初学者如何微调大模型?从0到1详解
  • 西瓜书第十一章——降维与度量学习
  • Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
  • NanoGPT的BenchMarking.py
  • 测试用例及黑盒测试方法
  • CentOS 7 环境下部署 LAMP
  • vscode实用配置
  • React 项目中封装 Excel 导入导出组件:技术分享与实践
  • 【PhysUnits】15.1 引入P1后的加一特质(add1.rs)
  • 【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来
  • python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名
  • Vue-2-前端框架Vue基础入门之二
  • CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面
  • ubuntu20.04.5-arm64版安装robotjs
  • [网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)
  • 【数据分析】Matplotlib+Pandas+Seaborn绘图
  • NLP学习路线图(十五):TF-IDF(词频-逆文档频率)
  • [Redis] Redis命令在Pycharm中的使用
  • openpnp - 给M4x0.7mm的直油嘴加油的工具选择
  • Azure Devops 系列之三- vscode部署function app
  • EasyExcel复杂Excel导出
  • 1,QT的编译教程
  • C++基础算法————深度优先搜索(DFS)
  • React 第五十节 Router 中useNavigationType的使用详细介绍
  • 【笔记】在 MSYS2(MINGW64)中安装 Python 工具链的记录
  • npm install命令都做了哪些事情
  • Linux 学习-模拟实现【简易版bash】
  • 【中国・珠海】2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭!
  • 企业级安全实践:SSL/TLS 加密与权限管理(二)
  • Java面试:从Spring Boot到分布式系统的技术探讨