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

Android Framework 常见解决方案(22)防应用被LowMemoryKillerDaemon(LMKD)杀掉

1 原理说明

LMKD 借助 Linux 内核的 OOM(Out of Memory)机制来管理内存。当系统内存不足时,OOM 触发器会发送信号给LMKD,通知其进行内存管理。LMKD根据预先定义的策略和优先级,选择性地终止一些进程,以释放内存。

LMKD运行流程如下:

  1. 监测内存使用:LMKD 定期检查系统内存使用情况,包括各个进程的内存占用和系统总体内存压力。
  2. 内存压力评估:根据内存使用情况,LMKD 会计算出当前的内存压力指数,以判断是否需要进行内存管理。
  3. 内存压力事件处理:当内存压力指数超过一定阈值时,LMKD 触发内存压力事件,并根据预先配置的策略进行相应的处理。
  4. 进程终止:LMKD 根据策略和优先级,选择性地终止一些进程。通常,LMKD 会优先终止那些占用内存较多、优先级较低或者处于后台运行的进程。
  5. 释放内存:通过终止进程释放的内存会被回收,从而使系统内存得到释放,缓解内存压力。
  6. 日志记录和统计:LMKD 记录终止的进程信息和释放的内存量,并将其记录到系统日志中,以供后续分析和优化。

这里选择运行到第4步时进行进程终止过滤,即使用包名进行过滤。

2 修改方案(Android R S)

修改文件为:AOSP/system/memory/lmkd/lmkd.cpp,不同可能lmkd.cpp的位置不同,本质上都是修改kill_one_process的实现,过滤掉包名,具体代码修改如下:

static int kill_one_process(struct proc* procp, int min_oom_score, struct kill_info *ki,union meminfo *mi, struct wakeup_info *wi, struct timespec *tm,struct psi_data *pd) {int pid = procp->pid;int pidfd = procp->pidfd;uid_t uid = procp->uid;char *taskname;int r;int result = -1;struct memory_stat *mem_st;struct kill_stat kill_st;int64_t tgid;int64_t rss_kb;int64_t swap_kb;static char buf[PAGE_SIZE];
+    //AGS add start
+    char packageName[128] = {""};
+    //AGS add endif (!read_proc_status(pid, buf, sizeof(buf))) {goto out;}if (!parse_status_tag(buf, PROC_STATUS_TGID_FIELD, &tgid)) {ALOGE("Unable to parse tgid from /proc/%d/status", pid);goto out;}if (tgid != pid) {ALOGE("Possible pid reuse detected (pid %d, tgid %" PRId64 ")!", pid, tgid);goto out;}// Zombie processes will not have RSS / Swap fields.if (!parse_status_tag(buf, PROC_STATUS_RSS_FIELD, &rss_kb)) {goto out;}if (!parse_status_tag(buf, PROC_STATUS_SWAP_FIELD, &swap_kb)) {goto out;}taskname = proc_get_name(pid, buf, sizeof(buf));// taskname will point inside buf, do not reuse buf onwards.if (!taskname) {goto out;}+    // AGS add start,添加包名过滤
+    strncpy(packageName, taskname,128);
+    //ALOGE("AGS-lmkd:packageName=%s,taskname=%s,strcmp=%d",packageName,taskname,strcmp(packageName,"com.xxx.xxx"));
+    if(!strncmp(packageName,"com.xxx.xxx",strlen("com.xxx.xxx")))
+    {
+        ALOGE("AGS add lmkd-whitelist:pkgname=%s",packageName);
+        return -1000;
+    }
+    //AGS add endmem_st = stats_read_memory_stat(per_app_memcg, pid, uid, rss_kb * 1024, swap_kb * 1024);//...
out:/** WARNING: After pid_remove() procp is freed and can't be used!* Therefore placed at the end of the function.*/pid_remove(pid);return result;
}

思考与扩展:这里实际上也可以根据自己的需要做成白名单和黑名单来解决该问题,但是其本质都是包名的过滤。

相关文章:

Android Framework 常见解决方案(22)防应用被LowMemoryKillerDaemon(LMKD)杀掉

1 原理说明 LMKD 借助 Linux 内核的 OOM(Out of Memory)机制来管理内存。当系统内存不足时,OOM 触发器会发送信号给LMKD,通知其进行内存管理。LMKD根据预先定义的策略和优先级,选择性地终止一些进程,以释放…...

Vue - 组件递归

目录 组件递归子组件父组件 组件递归 当要渲染一个目录时,因为可能有嵌套数据,并且组件的层级未知,可以使用组件递归来解决 注意点: 1,使用递归时必须提供 name,也就是通过组件的 name 递归自己。 2&am…...

微信小程序案例2-1:学生信息

文章目录 (二)准备图像素材(三)编写小程序页面结构 单击[确认] 清空页面结构文件index.wxml内容 修改页面配置文件index.json,不适用navigation-bar组件 删除全局配置文件app.json,删除渲染器配置&a…...

小程序如何设置余额充值

在小程序中设置余额充值是一种非常有效的方式,可以帮助商家吸引更多的会员并提高用户的消费频率。下面将介绍如何在小程序中设置余额充值并使用。 第一步:创建充值方案 在小程序管理员后台->营销管理->余额充值页面,添加充值方案。可…...

vue项目打包成H5apk中使用语音播放

利用浏览器语音播放api功能,在vue项目中调用api实现语音播报。 在mounted生命周期函数中获取浏览器的SpeechSynthesis API data() {return {speech: null,};},mounted() {if ("SpeechSynthesisUtterance" in window) {this.speech window.speechSynthesi…...

windows:批处理bat实例

文章目录 文件/文件夹管理实例批量更改文件名创建编号从0到9的10个文件自动循环运行某个程序显示批处理的完整路径信息将文件名更名为当前系统日期使用批处理命令自动接收用户输入的信息计算当前目录及子目录(中文件)所占硬盘空间自动删除当前目录及子目…...

websocket php教程

WebSocket 是 HTML5 提供的一种网络通讯协议,用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯,APP与服务器的实时通讯等场景。 相比传统HTTP协议请求响应式通讯,WebSocket协议可以做到实时的双向通讯,服务端可…...

【操作系统】调度算法的评价指标和三种调度算法

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 操作系统 一、调度算法的评价指标1.1 CPU利…...

CSS详细基础(三)复合选择器

前两章介绍了CSS中的基础属性,以及一些基础的选择器,本贴开始介绍复合选择器的内容~ ​ 在 CSS 中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基本选择器进行组合形…...

LeetCode【2251. 花期内花的数目】

给你一个下标从 0 开始的二维整数数组 flowers ,其中 flowers[i] [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi (都 包含)。同时给你一个下标从 0 开始大小为 n 的整数数组 people ,people[i] 是第 i 个人来看花的时间…...

大数据(九):数据可视化(一)

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…...

讲讲项目里的仪表盘编辑器(二)

应用场景 正常来说,编辑器应用场景应该包括: 编辑器-预览 编辑器 最终运行时 怎么去设计 上一篇推文,我们已经大概了解了编辑器场景。接下来,我们来看预览时的设计 编辑器-预览 点击预览按钮,执行以…...

文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题

八、用go语言,设 X[1…n]和 Y[1…n]为两个数组,每个都包含n个有序的元素。请设计一个 O(lgn)时间的算法来找出数组 X和Y中所有 2n 个元素的中位数。 文心一言: 要在 O(lgn) 时间内找出两个有序数组 X 和 Y 中所有元素的中位数,可…...

axios添加缓存请求,防止多次请求,单页面多个同一组件造成多次请求解决方案

在axios中,添加 const cacheMap {};响应拦截添加 try {// 删除缓存const api res.config.url.replace(process.env.VUE_APP_BASE_API, "");if (cacheMap.hasOwnProperty(api)) {delete cacheMap[api];}} catch (err) {}创建两个请求方法 /*** Get缓存…...

Java包装类与自动拆箱装箱

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是 Java 包装类和自动拆箱装箱? Java 中的基本数据类型(如 int、cha…...

基于SpringBoot网上超市的设计与实现【附万字文档(LW)和搭建文档】

主要功能 前台登录: 注册用户:用户名、密码、姓名、联系电话 用户: ①首页、商品信息推荐、商品资讯、查看更多 ②商品信息、商品详情、评论、点我收藏、添加购物车、立即购买 ③个人中心、余额、点我充值、更新信息、我的订单、我的地址、我…...

二、C++项目:仿muduo库实现并发服务器之时间轮的设计

文章目录 一、为什么要设计时间轮?(一)简单的秒级定时任务实现:(二)Linux提供给我们的定时器:1.原型2.例子 二、时间轮(一)思想(一)代码 一、为什…...

计算机竞赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…...

蓝桥等考Python组别五级003

第一部分:选择题 1、Python L5 (15分) 表达式“a >= b”等价于下面哪个表达式?( ) a > b and a == ba > b or a == ba < b and a == ba < b or a > b正确答案:B 2、Python L5 (15分) 当x是偶数时,下面哪个表达式的值一定是True?( …...

学之思项目第一天-完成项目搭建

一、前端 拉下前端代码执行 npm i 然后执行npm run serve就行了 二、后端 搭建父子模块 因为这个涉及到前台以及后台管理所以使用父子模块 并且放置一个公共模块&#xff0c;放置公共的依赖以及公共的代码 2.1 搭建父子工程 这个可以使用直接一个个的maven模块&#xff…...

Axolotl与LLaMA-Factory对比:架构与扩展性分析-方案选型对比

1. 问题背景与选型目标 在大型语言模型&#xff08;LLM&#xff09;落地的浪潮中&#xff0c;“微调”已从少数研究团队的实验行为&#xff0c;变为大量中小企业甚至个人开发者的刚需。业务团队不再仅仅使用 API 调用闭源模型&#xff0c;而是希望基于开源基座模型&#xff08;…...

Tiny AI Client:零依赖、轻量化的AI API调用库设计与实战

1. 项目概述与核心价值最近在折腾AI应用本地化部署和轻量化客户端时&#xff0c;发现了一个挺有意思的项目——piEsposito/tiny-ai-client。这名字起得就很直白&#xff0c;“tiny”意味着小巧&#xff0c;“ai-client”点明了它是一个AI客户端。乍一看&#xff0c;你可能会觉得…...

【研报 A110】物理AI时代的具身数据采集需求研究:国家级训练场落地,开源生态加速建设

摘要&#xff1a;物理AI时代&#xff0c;具身智能与世界模型的发展&#xff0c;推动具身数据采集成为下一代数据基建的核心浪潮。具身大模型对数据有着EB级的海量需求&#xff0c;同时对多模态、异构性与质量要求极高&#xff0c;当前数据缺口成为制约具身智能发展的核心瓶颈&a…...

markdownReader:终极Chrome插件,让本地Markdown文件阅读体验提升300%

markdownReader&#xff1a;终极Chrome插件&#xff0c;让本地Markdown文件阅读体验提升300% 【免费下载链接】markdownReader markdownReader is a extention for chrome, used for reading markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownReader …...

MATLAB 2018a/2023b实测:Libsvm安装后如何用自带数据集快速验证与跑通第一个模型

MATLAB 2018a/2023b实战&#xff1a;Libsvm安装后快速验证与模型跑通全流程 当你第一次在MATLAB中成功安装Libsvm后&#xff0c;那种兴奋感可能很快会被"接下来该做什么"的迷茫所取代。别担心&#xff0c;这篇文章将带你用Libsvm自带的heart_scale数据集&#xff0c;…...

41《CAN总线报文周期、抖动与实时性分析》

CAN总线基础:从物理层到数据链路层的核心概念 一、一个让我熬夜的CAN问题 去年调试某款车载ECU时遇到个诡异现象:同一批次的控制器,有的在-20℃低温下CAN通信完全正常,有的却频繁丢帧。示波器挂上去一看,显性电平的下降沿斜率明显变缓,从正常的15ns拖到了40ns。查了三天…...

WarcraftHelper:魔兽争霸3兼容性修复终极解决方案

WarcraftHelper&#xff1a;魔兽争霸3兼容性修复终极解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代Windows系…...

可口可乐AI印相私密工作流首次公开(含内部CMYK预置包、罐体反光建模提示词库与印刷出血校准表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;可口可乐AI印相私密工作流的起源与战略价值 可口可乐AI印相私密工作流并非源于通用大模型的简单套用&#xff0c;而是其全球数字创新实验室在2022年启动的“Project Chroma”中孵化出的端到端隐私增强…...

CANN/asc-devkit SPM缓冲区写入API

WriteSpmBuffer 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode…...

算法21,搜索插入位置

一道经典的二分查找应用题&#xff0c;通常被称为“搜索插入位置”。笔记中的思路非常清晰&#xff0c;下面为你整理这道题的具体解法、代码实现以及需要注意的细节。1. 题目理解题目描述&#xff1a;给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并…...