短视频软件开发Android增加系统白名单,防止重要应用低内存时被误杀

在资源受限的设备上,如工控或POS系统,低内存情况可能导致重要应用被系统误杀。本文探讨了开发者如何通过设置前台服务、双服务心跳机制及与设备厂商合作等方式,确保应用在低内存环境下稳定运行。特别介绍了通过动态调整adj值的方法,为特定应用提供系统级保护。

有些读者会说现在手机动辄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.ums.assitance.updater");//智能桌面升级助手
+        add("com.ums.tss.mastercontrol.daemon");//智能桌面守护进程
+        add("com.ums.tss.mastercontrol");//智能桌面
+        add("com.ums.upos.uapi");//银商U架构
+    }};  
+    
+    //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;
+           //paxsz 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的值,防止误杀重要的应用或者系统级别的服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值