首页 > 其他分享 >lmkd白名单方案的实现,避免应用被杀

lmkd白名单方案的实现,避免应用被杀

时间:2023-06-07 18:23:40浏览次数:38  
标签:CTRL int MAX PACKET lmkd 避免 白名单

1 如何避免app被lmk杀掉

公司的项目可能有一些核心app(java app或native app),不想因为low memory被lmk杀掉。

粗糙一些的做法是在lmkd中添加白名单,白名单的应用永远不会被lmkd杀死。

// lmkd.c
static int kill_one_process(struct proc* procp, int min_oom_score) {
    ...
    taskname = proc_get_name(pid);
    if (!taskname) {
        goto out;
    }

    tasksize = proc_get_size(pid);
    if (tasksize <= 0) {
        goto out;
    }
    // 自己实现的is_in_white_list函数
    if (is_in_white_list(taskname)) {
        ALOGI("%s (%d) in the white list.", taskname, pid);
        goto out;
    }
    ...
out:
    pid_remove(pid);
    return result;
}

上面代码是使用白名单的位置。

2 动态添加lmkd白名单

我的平台是Android 10的版本。

遵循第1节的思路,还是添加白名单。但是要求动态添加,就需要lmkd暴露一个接口。

参考原生Android的实现,java层是通过ProcessList这样一个class和lmkd,通过local socket进行通信的。

所以我添加了一个新的cmd,从ProcessList向lmkd发送字符串(包名,即白名单)。

这里说一下lmkd中init的时候,使用了epoll的机制,我的理解就是epoll会向内核注册,内核负责监听fd(如socket的fd),fd有变化了才会通知lmkd。

这里就有一个问题:

// lmkd.h
/*
 * Max number of targets in LMK_TARGET command.
 */
#define MAX_TARGETS 6

/*
 * Max packet length in bytes.
 * Longest packet is LMK_TARGET followed by MAX_TARGETS
 * of minfree and oom_adj_score values
 */
#define CTRL_PACKET_MAX_SIZE (sizeof(int) * (MAX_TARGETS * 2 + 1))

/* LMKD packet - first int is lmk_cmd followed by payload */
typedef int LMKD_CTRL_PACKET[CTRL_PACKET_MAX_SIZE / sizeof(int)];


// lmkd.c
static void ctrl_command_handler(int dsock_idx) {
    LMKD_CTRL_PACKET packet;
    int len;
    len = ctrl_data_read(dsock_idx, (char *)packet, CTRL_PACKET_MAX_SIZE);
    ...
}

简单来说,问题就是,原生用于读socket的buffer size太小了,

buffer size = 4 *(6 * 2 + 1) = 52 字节

减去同于标识cmd的int的大小,最多可以用的pay load的大小就是48字节,用来传递包名有可能就不够用。

而epoll机制又要求你只能read一次fd,如果想第二次read,内核不通知fd有变化,read函数就会一直阻塞。

经过分析代码,可以对数据结构LMKD_CTRL_PACKET进行扩容:

#define MAX_TARGETS_EXT 16
#define CTRL_PACKET_MAX_SIZE (sizeof(int) * (MAX_TARGETS_EXT * 2 + 1))

这样方案是可行的。

另外,动态白名单我想用支持动态扩容的容器存放。但是Android 10中,lmkd的源码是.c的后缀,没办法用c++的set容器。这里需要从c代码调到cpp代码。Android 12,lmk使用c++写的,可能不存在这个问题。

标签:CTRL,int,MAX,PACKET,lmkd,避免,白名单
From: https://www.cnblogs.com/yulisuo/p/17464204.html

相关文章

  • Python写文件时加锁,避免写入过程中被读取
    问题:Linux上有个Python2脚本每天定时生成一些数据,并覆盖写入文件A,文件内容是每行一个Json字符串。有一个乙方的采集器程序(类似filebeat)需要读取文件A,但发现读取的数据有截断,导致解析失败。怀疑是因为采集器读取文件A的时候,文件A写入还未结束。解决:由于采集器程序是乙方自研的,属......
  • FX110网:5月下半月外汇黑平台有哪些?共109家避免踩雷(上)
    在外汇交易中,投资者要学的东西很多,但对于一个新手投资者来说,最先要学的不是如何交易,而是如何防止被骗,第一步就是要学会鉴别平台。我们不知道下一家黑平台是哪一家,但对于FX110网曝光过的虚假平台,一定要远离!5月上半月,FX110网已曝光黑平台85家,而在下半月,新曝光的黑平台数目更大,竟高达......
  • 如何避免僵尸进程(转)
    父进程中调用wait()等待回收子进程两次fork()来避免僵尸进程   在父进程fork()之前安装SIGCHLD信号处理函数,并在此handler函数中调用waitpid()等待子进程结束在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号杀死父进程,这样子进程就由init进程......
  • 死锁的产生及避免
    资料什么是死锁?死锁的产生条件及解决办法什么是死锁,死锁的原因及解决办法(含四个必要条件)死锁的产生原因与解决方法Java实例-死锁及解决方法实例产生死锁的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2、不可抢占,资源请求者不能强制从资源占有者手......
  • 猪场高温跳闸致5千头猪死亡!物联网技术推广能否避免重演?
    近日高温不断加剧,在这种情况下,特别是那些需要大量能源消耗的场所,也面临着巨大的挑战。据报道,近日在江苏南通的一家养猪场,由于夜间跳闸,养猪场内空气不流通,导致5000头猪在高温下被闷死。由于猪价低,老板没有请人值夜班,直到第二天早上才发现情况不对,估计老板损失近千万!随着物联网技术在......
  • Java并发(八)----使用线程避免cpu占用100%
    1、sleep实现在没有利用cpu来计算时,不要让while(true)空转浪费cpu,这时可以使用yield或sleep来让出cpu的使用权给其他程序while(true){  try{ Thread.sleep(50); }catch(InterruptedExceptione){    e.printStackTrace(); }......
  • EFF-POST:如何避免低级错误
    晒张图(一个非常离谱的错误)常见问题数组/值域/数据类型没有开到给定的范围(通常是因为对范围没有估计/估计错误而非不小心)卡精度(有多种应对方法,如divisible,fraction)变量名出问题(集中在n和m搞混这种问题)边界问题(DP转移,etc.)多测没清空(纯SB)注意这都是平时做题时突出的......
  • JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应
    JavaScript内存管理&垃圾回收机制标记清除js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离......
  • 【外汇天眼】外汇交易中的智慧:避免过早止损的关键策略!
    外汇交易市场的波动性和风险使得止损成为交易者保护自身资金的重要手段。然而,过早止损可能会导致交易者错失潜在盈利机会。本文将介绍一些关键策略,帮助交易者避免过早止损,并特别介绍波动点止损法,以提高交易效果。1.设定合理的止损水平:合理设置止损水平是避免过早止损的第一步。交......
  • 服务质量_QOS【管制和拥塞避免机制】
    服务质量_QOS【标记和队列】:https://www.cnblogs.com/good-study/p/16160592.html1.1区分服务模型配置步骤:分类classfication/标记Marking管制Policing/整形Shaping      限速拥塞避免机制REDWRED  防止尾丢弃队列Queuing:PQ、CQ、WFQ、FIFO、CB、WFQ......