[DESCRIPTION]
lowmemorykiller 可能误杀一些进程,比如 测试测序,特别重要但占用内存比较大的程序等
可能使用到添加白名单的方法,避免被误杀
[SOLUTION]
(一)首先看是lowmemroy 还是 lmkd
查看方法看: 两种
(1)
▪/sys/module/lowmemorykiller/parameters/adj 里面的值
0,0,0,0,0,0 → lmkd //o版本是没有这个值的
0,100,200,300,900,906 → lowmemorykiller
(2)看“lowmemroykiller” 出现的位置
kernel log→ lowmemorykill
main log → lmkd
(二)
判断好了后根据两种方式加入白名单,也可以都加入:
注意更改方法是 o 版本的更改方法,其他版本稍有变化
LMKD
1.
\system\core\lmkd\lmkd.c
/* Kill one process specified by procp. Returns the size of the process killed */
static int kill_one_process(struct proc* procp, int min_score_adj, bool is_critical) {
int pid = procp->pid;
uid_t uid = procp->uid;
char *taskname;
int tasksize;
int r;
taskname = proc_get_name(pid);
/* MTK begin */
char packageName[20] = {""};
strncpy(packageName, taskname, sizeof("com.antutu"));
ALOGE("MTK_packageName=%s,taskname=%s,strcmp=%d",packageName,taskname,strcmp(packageName,"com.antutu"));
if(!strcmp(packageName,"com.antutu")){
return -1000;
}
/* MTK end */
2.\system\core\lmkd\lmkd.c
o版本
\system\core\lmkd\lmkd.c
static int find_and_kill_process(bool is_critical) {
int i;
int killed_size = 0;
int min_score_adj = is_critical ? critical_oomadj : medium_oomadj;
for (i = OOM_SCORE_ADJ_MAX; i >= min_score_adj; i--) {
struct proc *procp;
retry:
procp = proc_adj_lru(i);
if (procp) {
killed_size = kill_one_process(procp, min_score_adj, is_critical);
/* MTK begin*/
if(killed_size == -1000){
ALOGE("MTK_killed_size == -1000 and jump kill_one_process");
}else if (killed_size < 0) {
/* MTK end */
goto retry;
} else {
return killed_size;
}
}
}
p版本
由于p版本这个地方google进行了更新,可能部分版本可以参照上面的的方法,如果发现有更改则使用下面的更改方法
\system\core\lmkd\lmkd.c
static int find_and_kill_process(bool is_critical) {
..
break;
killed_size = kill_one_process(procp, min_score_adj, level);
/* MTK begin*/
if(killed_size == -1000){
ALOGE("MTK_killed_size == -1000 and jump kill_one_process");
continue;
}
/* MTK end*/
if (killed_size >= 0) {
#ifdef LMKD_LOG_STATS
if (enable_stats_log && !lmk_state_change_start) {
lmk_state_change_start = true;
stats_write_lmk_state_changed(log_ctx, LMK_STATE_CHANGED,
LMK_STATE_CHANGE_START);
}
lowmemroykiller
3.18/drivers/staging/android/lowmemorykiller.c
rcu_read_lock();
for_each_process(tsk) {
struct task_struct *p;
short oom_score_adj;
//lowmem_print(1,"mtk jump lowmemorykiller_1 tsk->comm=%s",tsk->comm);
/* mtk begin */
if(tsk->comm){
if((strstr(tsk->comm,"tutu.ABenchMark")!=NULL)
||(strstr(tsk->comm,"ABenchMark:push")!=NULL)
||(strstr(tsk->comm,"benchmark:full")!=NULL))
||(strstr(tsk->comm,"chMark:refinery")!=NULL)){
lowmem_print(1,"mtk_lowmemorykiller jump kill 'tutu.ABenchMark' 'ABenchMark:push' 'benchmark:full' \n");
continue;
}
}
/* mtk end */
添加白名单的名字是如何确定的?
搜索关键字lowmemorykiller , killing 的 apk name 就添加到上面的代码中就可以了
11-30 11:08:03.668 <6>[10425.252789] (3)[92:kswapd0]lowmemorykiller: Killing 'android.vending' (23456) (tgid 23456), adj 100,
11-30 11:08:03.839 <6>[10425.423820] (2)[92:kswapd0]lowmemorykiller: Killing 'magazineservice' (9338) (tgid 9338), adj 100,
11-30 11:08:03.868 <6>[10425.452692] (1)[92:kswapd0]lowmemorykiller: Killing 'dboxed_process0' (16792) (tgid 16792), adj 100,
11-30 11:08:03.904 <6>[10425.488277] (1)[92:kswapd0]lowmemorykiller: Killing 'hbox:interactor' (9455) (tgid 9455), adj 100,
11-30 11:08:04.112 <6>[10425.696791] (3)[92:kswapd0]lowmemorykiller: Killing 'ssion.appupdate' (9323) (tgid 9323), adj 100,
11-30 11:08:04.222 <6>[10425.807027] (3)[92:kswapd0]lowmemorykiller: Killing 'android.smspush' (9561) (tgid 9561), adj 100,
11-30 11:08:04.370 <6>[10425.955053] (1)[92:kswapd0]lowmemorykiller: Killing 'MainThread-UE4' (18741) (tgid 18741), adj 0,