转自: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 plain copy
  1. ActivityManagerService.java  
  2.     final ProcessRecord addAppLocked(ApplicationInfo info) {  
  3.         ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);  
  4.   
  5.         if (app == null) {  
  6.             app = newProcessRecordLocked(null, info, null);  
  7.             mProcessNames.put(info.processName, info.uid, app);  
  8.             updateLruProcessLocked(app, truetrue);  
  9.         }  
  10.   
  11.         if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))  
  12.                 == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {  
  13.             app.persistent = true;  
  14.             app.maxAdj = CORE_SERVER_ADJ;  
  15.         }  
  16.         if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {  
  17.             mPersistentStartingProcesses.add(app);  
  18.             startProcessLocked(app, "added application", app.processName);  
  19.         }  
  20.   
  21.         return app;  
  22.     }  


可以看到同时符合FLAG_SYSTEM(/system/app目录)及FLAG_PERSISTENT(android:persistent="true")

的app,设置app.maxAdj = CORE_SERVER_ADJ(-12),而adj=-12不会被lowmemorykiller处理

更多相关文章

  1. Android(安卓)UI学习 - Tab的学习和使用
  2. android开发环境 国内镜像 及Android(安卓)SDK manager使用国内
  3. 【Android(安卓)开发教程】设置Activity的方向
  4. Android设置全局字体大小,实现小中大字体功能
  5. Android学习笔记——设置EditText只输入数字、字母
  6. Android(安卓)Binder异常传递流程分析
  7. Android(安卓)清理缓存、优化内存空间
  8. Android(安卓)Permission访问权限许可
  9. Android(安卓)进程间通信实现原理分析

随机推荐

  1. 基础IO(c标准IO接口库)
  2. 洋洋洒洒一万二千字,彻底讲清楚MySQL的优
  3. 扫雷游戏
  4. 新人
  5. 坚果云和亿方云相比较哪个好?
  6. 坚果云亿方云哪个比较好
  7. 坚果云和亿方云哪个更适合公司?
  8. Vue自学之路5-vue模版语法(v-text,v-html,
  9. DEFI去中心化金融的机会在哪里?
  10. 笔记本硬盘被格式化了的资料寻回办法