我们知道android lowmemorykiller机制有两套执行方案,在N之前的版本都是采用的kernel的lowmemorykiller.c里面的方式。最近查看了Android Go的代码结构发现,Android Go采用的是native的lmkd service的方式来起到lowmemorykiller的作用。具体实现流程如下:
我们知道kernel lowmemorykiller启动杀进程的条件是file_page-shmem-swapcache(-unevictable)的值低于AMS所预设的minfree的各档的阈值。这里如果是采用的lmkd的方式,则采用的是另外一套机制启动lmkd来杀进程。
首先讲一下lmkd的执行流程,其主要代码位于/system/core/lmkd/lmkd.c,其执行流程如下:
int main(int argc __unused, char **argv __unused) {
struct sched_param param = {
.sched_priority = 1,
};
………………
if (!init())//启动init()初始化函数
mainloop();//进入mainloop,检测是否有所监听的事件发生变化,如有,则调用event poll回调函数
ALOGI("exiting");
return 0;
static int init(void) {
struct epoll_event epev;
int i;
int ret;
………………
ctrl_lfd = android_get_control_socket("lmkd");//lmkd socket通信,获取AMS设置的minfree和adj的值
if (ctrl_lfd < 0) {
ALOGE("get lmkd control socket failed");
return -1;
}
ret = listen(ctrl_lfd, 1);
if (ret < 0) {
ALOGE("lmkd control socket listen failed (errno=%d)", errno);
return -1;
}
epev.events = EPOLLIN;
epev.data.ptr = (void *)ctrl_connect_handler;//epoll callback,当socket里面有数据变化是调用此函数
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, ctrl_lfd, &epev) == -1) {//将ctrl_lfd添加到epollfd中去,当其有变化是,启东callback函数
ALOGE("epoll_ctl for lmkd control socket failed (errno=%d)", errno);
return -1;
}
maxevents++;
has_inkernel_module = !access(INKERNEL_MINFREE_PATH, W_OK);
use_inkernel_interface = has_inkernel_module && !is_go_device;//后面用来判断是否采用kernel的lowm