参考:http://blog.csdn.net/windskier/article/details/6560925
http://blog.csdn.net/zmyde2010/article/details/6756368
http://blog.sina.com.cn/s/blog_514048cb0100wi2j.html
方法:
对于放在
/system/app下的应用,需要在其Manifest.xml文件中设置persistent属性,如应用程序'Phone'的AndroidManifest.xml文件:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
设置后app提升为系统核心级别,任何情况下不会被kill掉,
settings->applications里面也会屏蔽掉stop操作。
这样设置前的log:
Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj
4
设置后的log:
PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12
# 这是CORE_SERVER_ADJ
注:init进程的oom_adj为-16(即SYSTEM_ADJ):
cat /proc/1/oom_adj
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代码:
final
ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName,
info.uid);
if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}
if
((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
{
app.persistent =
true;
app.maxAdj =
CORE_SERVER_ADJ;
// 这个常数值为-12。
}
if (app.thread == null &&
mPersistentStartingProcesses.indexOf(app) < 0)
{
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application",
app.processName);
}
return app;
}
可见要想成为core service (即app.maxAdj =
CORE_SERVER_ADJ(-12)),应用程序需要FLAG_SYSTEM和FLAG_PERSISTENT两个标志,FLAG_SYSTEM指的是应用位于/system/app下,FLAG_PERSISTENT就是指persistent属性。
而对于frameworks/base/services/java/com/android/server/SystemServer.java,则调用