AOSP CachedAppOptimizer 冻结方案

背景

Android 一直面临一个核心难题:如何优化进程对有限系统资源(如 CPU、电量)的使用,同时保证用户体验。

当进程进入后台后,它们虽不再贡献用户体验,却仍可能消耗资源。传统的杀后台方案虽然节省资源,但会导致用户抱怨(如影响多任务和启动速度)。如今,随着内存容量提升,进程冻结方案(苹果的墓碑机制)成为更优解——它既能保留后台进程(保障快速启动),又能严格限制其 CPU 和电量消耗。

原生方案开关

Google 在android 11 原生代码开始引入进程冻结方案,可能基于代码不稳定考虑,整个功能默认是关闭的,然后在android 12 重新做了一些修改后,默认是打开状态。

可以通过如下方式打开或者关闭原生进程冻结功能:

方式一 开发者选项 “Suspend execution for cached apps”。 可选项一共有三个, Device default, Enabled 和Disabled,android 11 default 是关闭,android 12 default 默认是打开

0

方式二 adb 命令: adb shell settings put global cached_apps_freezer

以上两种方式都需要重启手机生效

原生进程冻结方案框架图

0

Framework 上层主要由两个类控制, OomAdjuster 负责计算APP的oom_score_adj,一旦某个APP的adj大于等于CACHED_APP_MIN_ADJ,就会将冻结该进程的工作委托给CachedAppOptimizer去处理,后者跑在独立的线程,然后通过jni层接口调用到cgroup的native层。

cgroup抽象层编译成库libprocessgroup。抽象层通过往cgroup的文件节点写入相应的值,来触发kernel的回调,代码路径system\core\libprocessgroup,具体是往/sys/fs/cgroup///cgroup.freeze 节点写入1冻结,写入0解冻。

最终kernel cgroup机制的freezer控制子系统真正实现了冻结进程的功能,如下所示:

0

被冻结的进程,会在freeze_schdule中主动放弃CPU使用权限,将CPU让给当运行队列rq中的下一个任务执行,实现的用户进程的无感冻结。

原生冻结例子

应用A打开到前台,使用完后,退到后台,启动应用B,然后A变成前APP级别,adj变成700,然后再打开应用C,这时如果A没有启动服务或者接受广播之类的,就会变成cached级别应用,那么系统就会设置一个10分钟的超时,如果10分钟的时间内,adj的级别没有变化或者没有小于cached级别,系统就会触发冻结A,如果adj变化为小于cached级别,那么就会取消冻结A

0

原生框架流程

相关代码路径

frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.java frameworks/base/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp frameworks/base/core/java/android/os/Process.java frameworks/base/core/jni/android_util_Process.cpp

0

原生冻结细节

第一步,检查文件锁"/proc/locks"的状态。这是为了防止冻结进程持有文件锁引起死锁。考虑到一些特殊场景下,进程在被冻结的过程中拿住了文件锁,冻结成功后还会再检查一次,发现持有锁就立刻解冻。

第二步,freeze binder,先是处理当前待处理的binder通信请求,如果进程需要处理的binder请求过多导致在100ms内无法完成,则重新在10分钟后再次进行冻结流程。如果该过程在100ms内成功,后面禁掉该进程对同步binder请求的接收和处理,以及对异步binder请求的处理。

第三步,setProcessFrozen,调用抽象层提供的API冻结进程。

第四步,再次检查该进程有没有需要处理的binder请求,有则解冻进程,然后在10分钟后再次触发冻结。这个检查是为一些特殊场景下,进程在被冻结的过程中产生了binder请求。

原生方案不足

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下,实体店面临着前所未有的挑战,但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据,据相关统计&#xff…

Java求职面试:从Spring Boot到微服务的全面考核

Java求职面试实录:从Spring Boot到微服务的全面考核 第一轮:基础技术的考察 场景: 赵大宝走进了一家互联网大厂的面试间,面试官严肃地看着他。 面试官: 赵大宝,你好。我们先从简单的开始。请你解释一下J…

记录一个坑关于STM32 ARM Compiler Version

在用 Keil 进行 STM32 开发的时候,一开始下载,下载的 ARM 编译器是 Version6,他就不兼容老的代码,就很抽象。 所以必须要更换编译器。 可以去官网下载编译器 Downloads - Arm Developer ,也可以自己找资源哈&#xff…

PCIe体系结构学习入门——PCI总线概述(二)PCI总线的桥和配置

这里写目录标题 序言存储器域和 PCI 总线域HOST 主桥PCI 桥和 PCI 设备配置空间PCI 桥PCI 设备配置空间PCI 总线的配置非透明 PCI 桥序言 接续前章内容,本章继续讲述 PCI 总线概述的第二部分——PCI 总线的桥和配置。 如果需要进一步了解前一章节内容,可以访问:PCIe体系结构…

浔川代码编辑器v2.0(测试版)更新公告

浔川代码编辑器v2.0(测试版)更新公告 发布日期:** 2023年4月30日 我们很高兴地宣布浔川代码编辑器v2.0测试版即将上线!本次更新带来了多项功能改进和问题修复,旨在为用户提供更稳定、更强大的编程体验。 主要更新内容 1. **Bug修复与稳定性提…

微信小程序 tabbar底部导航栏

官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar 一、常规菜单格式 在app.json 文件中配置,其他关键点详见官方文档,后续更新不规则图标的写法

Spring 中@Autowired,@Resource,@Inject 注解实现原理

使用案例 前置条件: 现在有一个 Vehicle 接口,它有两个实现类 Bus 和 Car ,现在还有一个类 VehicleService 需要注入一个 Vehicle 类型的 Bean: public interface Vehicle {}Component public class Car implements Vehicle {}C…

【Rust结构体】Rust结构体详解:从基础到高级应用

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

《LightLLM:开启大语言模型推理新时代》

《LightLLM:开启大语言模型推理新时代》 大语言模型推理的困境与挑战 在当今人工智能飞速发展的时代,大语言模型(LLMs)无疑是最为耀眼的明星技术之一。从 OpenAI 的 GPT 系列到谷歌的 BERT,再到国内如百度文心一言、阿里通义千问等,大语言模型以其强大的语言理解和生成能…

【Python Web开发】02-Socket网络编程02

文章目录 1. 服务器端1.1 socket.socket()1.2 socket.bind()1.3 socket.listen()1.4 socket.accept()1.5 socket.recv()1.6 socket.send() 和 socket.sendall()1.7 socket.close() 2. 客户端2.1 socket.socket()2.2 socket.connect()2.3 socket.send() 和 socket.sendall()2.4 …

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化? 在两个月前,我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式,而事实上 Platform 和 UI 线程合并,确实为后续原生语言和 Dart 的…

蓝桥杯 1. 四平方和

四平方和 原题目链接 题目描述 四平方和定理(又称拉格朗日定理)指出: 每个正整数都可以表示为 至多 4 个正整数的平方和。 如果将 0 包括进去,则每个正整数都可以恰好表示为 4 个非负整数的平方和。 例如: 5 0 …

开发并发布一个属于自己的包(npm)

一、CommonJS规范导入require 创建一个npm包涉及几个步骤,包括设置你的项目结构、编写代码、编写文档、测试你的代码,以及发布到npm仓库。以下是一个基本的指南,帮助你从头开始创建一个npm包。 步骤 1: 初始化npm项目 创建项目文件夹&#x…

CRTP(Curiously Recurring Template Pattern)

C 中的 CRTP(奇异递归模板模式) CRTP(Curiously Recurring Template Pattern)是一种利用模板继承实现 静态多态(Static Polymorphism) 的设计模式。通过基类模板以派生类作为模板参数,CRTP 允许…

小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用

在视频格式转换需求日益多样的今天,小白工具网的在线视频转 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ )脱颖而出,凭借其出色特性,成为众多用户处理视频格式转换的优质选择。 从格式兼容性来看,它支…

银河麒麟系统离线安装nodejs

本篇文章我们介绍如何通过nvm(node版本管理工具)来实现离线安装nodejs 第一步:下载nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在页面找到【Source code(tar.gz)】下载 第二步:安装nvm 将下载好的tar.gz拷贝到银河麒麟系统文件夹下(加…

Go语言中包导入下划线的作用解析

在Go语言的代码中,有时会看到类似以下的导入语句: import _ "github.com/mattn/go-sqlite3"这种以下划线_开头的导入方式,显得有些特别,尤其是对于新手来说,可能会感到困惑,为什么要这样写&…

Winddows11官网下载安装VMware Workstation Pro17(图文详解)

Winddows11安装VMware17 1、官网下载2、安装3、总结 1、官网下载 官网地址 点击Products,滑到最下面,选择SEE DESKTOPP HYPERVISORS 选择 DOWNLOAD FUSION OR WORKSTATION 自动跳转到下面哪个服界面,注册 输入邮箱地址和图片下面的文字…

DeepSeek智能时空数据分析(二):3秒对话式搞定“等时圈”绘制

序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…