网上关于lowmemorykiller的文章一大把,总结一下,系统会不断更新进程的adj值,然后在内存紧张的情况下,adj越大的应用越可能被杀,那么我们要防止被杀,要么是给我们的应用设置比较小的adj值,要么是要杀的时候过滤我们的应用,因为杀进程是比较偏底层做的,不太熟悉.所以优先考虑,系统计算adj值的时候直接给我们的应用adj值赋为-1.
直接说方法,系统计算过adj之后会通过下属方法写adj的值,我们只要在其中判断我们有应用的包名,然后更改adj的值就可以,该方法在AMS中
private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
long nowElapsed) {
boolean success = true;
int changes = 0;
if (app.curAdj != app.setAdj) {
String[] packages = app.getPackageList();
if(packages != null){
for(String p : packages){
if(p.equals("你的包名")){
//android.util.Log.d(TAG_OOM_ADJ, "set usettings adj -1");
app.curAdj = -1;
break;
}
}
}
ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG_OOM_ADJ,
"Set " + app.pid + " " + app.processName + " adj " + app.curAdj + ": "
+ app.adjType);
app.setAdj = app.curAdj;
app.verifiedAdj = ProcessList.INVALID_ADJ;
}
}