欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android增加系统白名单,防止重要应用低内存时被误杀

程序员文章站 2022-03-07 11:37:31
    Android增加系统白名单,防止重要应用低内存时被误杀前言  在前面的篇章Lowmemkill问题分析我们详细介绍了系统在低内存的时候杀应用的原因。也许有些读者会说现在手机动辄6G+128G的存储了,还会存在低内存杀应用的可能?那么这个就是饱汉不知饿汉饥的苦了,在一些特殊行业譬如工控或者pos行业,依然存在着512M+8G的配置,你所这种配置会不会存在系统内存紧张然后干掉一些系统认为......

     Android增加系统白名单,防止重要应用低内存时被误杀

前言

   在前面的篇章Lowmemkill问题分析我们详细介绍了系统在低内存的时候杀应用的原因。也许有些读者会说现在手机动辄6G+128G的存储了,还会存在低内存杀应用的可能?那么这个就是饱汉不知饿汉饥的苦了,在一些特殊行业譬如工控或者pos行业,依然存在着512M+8G的配置,你说这种配置会不会存在系统内存紧张然后干掉一些系统认为不重要但是其实非常重要的应用或者服务。遇到这种情况,应用开发者的应对方法无外乎如下两种:
(1).普通玩家:这里指的普通玩家就是一般的开发者,可以通过将服务设置为前台服务,或者通过双服务心跳机制来防止杀死,这类方法比较多,大概率就是和系统斗智斗勇增加存活几率,当然这其中也存在一些流氓手段,就不一一举例了。

(2).高阶玩家:这里的高阶玩家一般就指那些大厂的开发应用了,譬如腾讯的微信,QQ啊,这种一般设备终端厂商会将这些特殊的应用放进系统白名单,防止系统被杀。这个很容易理解吗,这种玩家一般给点赞助费啥的给终端厂商,终端厂商也乐于此吗。不然如果出现这种国民级别的应用不能在自己终端上面愉快的玩耍,你说大众是认为应用不行还是终端有问题呢。


Android 增加白名单防止重要应用低内存时被误杀

   前面说了那么多,对于系统Rom开发者来说也需要这么一个白名单,防止重要应用被杀,那么这里我介绍一种方法通过动态控制adj的值来做到。具体修改如下:

+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -18056,6 +18056,24 @@ public final class ActivityManagerService extends ActivityManagerNative
         }
     }
 
+    //特权应用,防止被lowmemkill掉 
+    final List<String> mUmsPrivilegedApplication = new ArrayList<String>(){{
+        add("com.xxx.xxx.updater");//
+        add("com.xxx.xxx.xxx.daemon");//
+        add("com.xxx.xxx.mastercontrol");//
+        add("com.xxx.xxx.uapi");//
+    }};  
+    
+    //List是有序的
+    final List<Integer>mUmsPrivilegedApplicationAdj = new ArrayList<Integer>(){
+        {
+          add(ProcessList.PREVIOUS_APP_ADJ); 
+          add(ProcessList.PREVIOUS_APP_ADJ); 
+          add(ProcessList.PREVIOUS_APP_ADJ); 
+          add(ProcessList.PREVIOUS_APP_ADJ); 
+        }
+    };
+
     private final boolean applyOomAdjLocked(ProcessRecord app,
             ProcessRecord TOP_APP, boolean doingAll, long now) {
         boolean success = true;
@@ -18067,11 +18085,37 @@ public final class ActivityManagerService extends ActivityManagerNative
         int changes = 0;
 
         if (app.curAdj != app.setAdj) {
-            ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);
-            if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
-                TAG, "Set " + app.pid + " " + app.processName +
-                " adj " + app.curAdj + ": " + app.adjType);
-            app.setAdj = app.curAdj;
+           boolean isUmsAppWhiteProcess = false;
+           int mThirdPartyAdj = ProcessList.CACHED_APP_MIN_ADJ;
+           //xxx 2018.12.17 add
+           if(mUmsPrivilegedApplication.size() == mUmsPrivilegedApplicationAdj.size()){
+               for(int i = 0; i < mUmsPrivilegedApplication.size(); i++){
+                   if((mUmsPrivilegedApplication.get(i).equals(app.processName)) && (app.curAdj > mUmsPrivilegedApplicationAdj.get(i)))
+                    {
+                          isUmsAppWhiteProcess = true;
+                          mThirdPartyAdj = mUmsPrivilegedApplicationAdj.get(i);
+                          break;
+                    }
+               }
+           }
+           if(isUmsAppWhiteProcess){
+               ProcessList.setOomAdj(app.pid, app.info.uid, mThirdPartyAdj);
+               if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
+                   TAG, "Set " + app.pid + " " + app.processName +
+                   " adj " + mThirdPartyAdj + ": " + app.adjType);
+               app.setAdj = mThirdPartyAdj;
+           }else{
+               ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);
+               if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
+                   TAG, "Set " + app.pid + " " + app.processName +
+                   " adj " + app.curAdj + ": " + app.adjType);
+               app.setAdj = app.curAdj;
+           }
         }

通过上面的修改,可以做到动态调整adj的值,防止误杀重要的应用或者系统级别的服务。


总结

   如上是一种比较通用的白名单的做法,方法可能有许多但是最终的目的就是动态调整adj的值防止系统在低内存的时候误将一些重要的应用kill了。

本文地址:https://blog.csdn.net/tkwxty/article/details/103061478