[Description]
如何将一个app 设置为常住app, 不被low memory kill 关闭
[Keyword]
app 持久 persistent
[Solution]
1. 将app 的manifest.xml 中的 application 中添加属性
android:persistent="true"
2. 对这个APP 使用platform 的签名
3. 放置在system/app 下面
注: 一个app 被设置为 persistent 后,将很难被low memory kill 杀掉(oom_adj=-12),请在设置之前仔细确认是否必须,否则将浪费掉memory。
2.[FAQ10559]如何更新LMK Low Memory Killer 的
阈值
[Description]
如何更新LMK Low Memory Killer 的阈值
[Keyword]
LMK Low Memory Killer 阈值 Threshold adj
[Solution]
Low Memory Killer 的阈值分成两个数组,一个是adj 数组,描述process 所对应的oom_adj,另外一个是minfree 数组,描述process 所对应的memory 的阈值。
上层可以直接通过读写:
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller/parameters/minfree
来进行调整.minfree 以KB 为单位
在JB 以后版本,AMS 起到后,将根据屏幕分辨率以及内存大小调整默认的LMK 的阈值,对应的具体的代码在:
frameworks/base/services/java/com/android/server/am/ProcessList.java#updat
eOomLevel
可以修正这个updateOomLevel 来调整LMK 的这两个参数
注意, 从JB9.MP 后,LMK 自动将oom_adj 转换成 oom_score_adj ,即写入时依旧是
按照oom_adj 写入,而读取出来时,则是oom_score_adj.
if oom_adj = 15 then oom_score_adj = 1000;
else oom_score_adj = oom_adj * 1000/17;
简单的oom_adj 与oom_score_adj 的转换表格:
oom_adj oom_score_adj
-16 -941
-12 -705
0 0
1 58
2 117
4 235
6 352
9 529
15 1000
问题3:清除掉已经被kill的应用的资源
JAVACRASH on system.server java.lang.OutOfMemoryError at android.os.FileUtils.readTextFile
WindowManagerService: Cleanup the starting window resources
When an application dies very early after being launched, some resources ViewRootImpl are left in system_server.
This patch removes those resources when the window is removed from WindowManagerService.
public void removeWindowLocked(Session session, WindowState win) { ...
if ( (win.mAppToken != null) && (win.mAppToken.startingView != null) ) {
View view = win.mAppToken.startingView;
win.mAppToken.startingView = null;
mPolicy.removeStartingWindow(null, view);
}
...