android:persistent="true"相關--保證不被系統kill掉
轉自:http://blog.csdn.net/zmyde2010/article/details/6756368
總結:
1、必須是System/app/下面的應用
2、android:persistent="true"屬性必須設定。
3、檢視方法:adb shell cat proc/程序id/oom_adj
4、修改方法:
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15
write /sys/module/lowmemorykiller/parameters/minfree 2048,3072,4096,6144,7168,8192
5、在android中,程序的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該程序優先順序越低。檔案/init.rc中有以下屬性設定:
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
/init.rc中,將PID為1的程序(init程序)的oom_adj設定為SYSTEM_ADJ(-16):
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
檢視本機設定:
cat /sys/module/lowmemorykiller/parameters/adj
0,1,2,7,14,15
回收時機:
檔案/init.rc中:
setprop ro.FOREGROUND_APP_MEM 1536 // 6M
setprop ro.VISIBLE_APP_MEM 2048 // 8M
setprop ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop ro.HIDDEN_APP_MEM 5120 // 20M
setprop ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop ro.EMPTY_APP_MEM 6144 // 24M
這些數字也就是對應的記憶體閾值,一旦低於該值,Android便開始按順序關閉相應等級的程序。
注意這些數字的單位是page: 1 page = 4 kB。所以上面的六個數字對應的就是(MB): 6,8,16,20,22,24。
檢視現在的記憶體閾值設定:
cat /sys/module/lowmemorykiller/parameters/minfree
要想重新設定該值(對應不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/module/lowmemorykiller/parameters/minfree
這樣當可用記憶體低於90MB的時候便開始殺死"空程序",而當可用記憶體低於60MB的時候才開始殺死"內容供應節點"類程序。
有一種方法可以設定app永遠不會被kill,AndroidManifest.xml 中新增:
android:persistent="true"
適用於放在/system/app下的app
設定後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會遮蔽掉stop操作,
設定前 Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj
4
設定後 PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12
lowmemorykiller的操作規則比如為
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15
write /sys/module/lowmemorykiller/parameters/minfree 2048,3072,4096,6144,7168,8192
可以看到,設定persistent後, oom_adj=-12,永遠沒有機會被lowmemorykiller處理
android:persistent
Whether or not the application should remain running at all times — "true" if it should, and "false" if not. The default value is "false". Applications should not normally set this flag; persistence mode is intended only for certain system applications
程式碼
[java] view plaincopy
- 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;
- }
- if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
- mPersistentStartingProcesses.add(app);
- startProcessLocked(app, "added application", app.processName);
- }
- return app;
- }
可以看到同時符合FLAG_SYSTEM(/system/app目錄)及FLAG_PERSISTENT(android:persistent="true")
的app,設定app.maxAdj = CORE_SERVER_ADJ(-12),而adj=-12不會被lowmemorykiller處理