为防止某些进程被low memory意外杀掉,可以将其加入白名单,降低误伤的概率;

一般,low memory killer会首先选择adj value徘徊在9~15的process去结束生,所以这个主要就是通过提高adj value的值来降低被杀概率;

  private final boolean updateOomAdjLocked(ProcessRecord app, int hiddenAdj,            int clientHiddenAdj, int emptyAdj, ProcessRecord TOP_APP, boolean doingAll) {        app.hiddenAdj = hiddenAdj;        app.clientHiddenAdj = clientHiddenAdj;        app.emptyAdj = emptyAdj;         if (app.thread == null) {            return false;        }         final boolean wasKeeping = app.keeping;         boolean success = true;        boolean isWLProc = false;                    boolean isThirdPartyAppWhiteProcess =  false;     //add                   int mThirdPartyAdj = ProcessList.HIDDEN_APP_MIN_ADJ;         computeOomAdjLocked(app, hiddenAdj, clientHiddenAdj, emptyAdj, TOP_APP, false, doingAll);         if (app.curRawAdj != app.setRawAdj) {            if (wasKeeping && !app.keeping) {                BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();                synchronized (stats) {                    app.lastWakeTime = stats.getProcessWakeTime(app.info.uid,                            app.pid, SystemClock.elapsedRealtime());                }                app.lastCpuTime = app.curCpuTime;            }             app.setRawAdj = app.curRawAdj;        }         if (app.curAdj != app.setAdj) {            /// M: LTK @{            if (FeatureOption.MTK_MEMORY_COMPRESSION_SUPPORT) {                if(app.curAdj > app.setAdj && (app.curAdj >= ProcessList.PREVIOUS_APP_ADJ) && app.hasShownUi) {                    try {                        IAmsPlus amsplus = MediatekClassFactory.createInstance(IAmsPlus.class);                        amsplus.afterAdjAdjustment(mMainStack.convertProcessRecord(app),                                                   app.setAdj,                                                   app.curAdj,                                                   mMainStack.convertLaunchRecord(mMainStack.topRunningActivityLocked(null)));                    } catch (Exception e) {                        Log.w(TAG, Exception thrown during afterAdjAdjustment failed:", e);                    }                }            } //add 如下的code                                        if(FeatureOption.MTK_LCA_RAM_OPTIMIZE)            {                                 if (mThirdPartyAppWhiteList.length != mThirdPartyAppAdj.length)                                     {                                               throw new Exception("mThirdPartyAppWhiteList is not match mThirdPartyAppAdj");                                     }                                for(int num = 0; num <= mThirdPartyAppWhiteList.length -1 ;num++)                {                    if(mThirdPartyAppWhiteList[num].equals(app.processName) &&                        app.curAdj > mThirdPartyAppAdj[num])                    {                        isThirdPartyAppWhiteProcess = true;                                                        mThirdPartyAdj = mThirdPartyAppAdj[num];                                          }                }            }//add code  end                                       if(isWLProc)            {                if (Process.setOomAdj(app.pid, ProcessList.HIDDEN_APP_MIN_ADJ)) {                    if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(                        TAG, "Set " + app.pid + " " + app.processName +                        " adj " + ProcessList.HIDDEN_APP_MIN_ADJ + ": " + app.adjType);                    app.setAdj = ProcessList.HIDDEN_APP_MIN_ADJ;                } else {                    success = false;                    Slog.w(TAG, "Failed setting oom adj of " + app + " to " + ProcessList.HIDDEN_APP_MIN_ADJ);                }            }//添加如下的判断:                            else if(isThirdPartyAppWhiteProcess)                            {                                                        if (Process.setOomAdj(app.pid, mThirdPartyAdj)) {                    if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(                        TAG, "Set " + app.pid + " " + app.processName +                        " adj " + mThirdPartyAdj + ": " + app.adjType);                    app.setAdj = mThirdPartyAdj;                } else {                    success = false;                    Slog.w(TAG, "Failed setting oom adj of " + app + " to " + mThirdPartyAdj);                }                                                      }                                      else            {                if (Process.setOomAdj(app.pid, 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;                } else {                    success = false;                    Slog.w(TAG, "Failed setting oom adj of " + app + " to " + app.curAdj);                }            }            /// @}        }        if (app.setSchedGroup != app.curSchedGroup) {            app.setSchedGroup = app.curSchedGroup;            if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG,                    "Setting process group of " + app.processName                    + " to " + app.curSchedGroup);            if (app.waitingToKill != null &&                    app.setSchedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE) {                Slog.i(TAG, "Killing " + app.toShortString() + ": " + app.waitingToKill);                EventLog.writeEvent(EventLogTags.AM_KILL, app.userId, app.pid,                        app.processName, app.setAdj, app.waitingToKill);                app.killedBackground = true;                Process.killProcessQuiet(app.pid);                success = false;            } else {                if (true) {                    long oldId = Binder.clearCallingIdentity();                    try {                        Process.setProcessGroup(app.pid, app.curSchedGroup);                    } catch (Exception e) {                        Slog.w(TAG, "Failed setting process group of " + app.pid                                + " to " + app.curSchedGroup);                        e.printStackTrace();                    } finally {                        Binder.restoreCallingIdentity(oldId);                    }                } else {                    if (app.thread != null) {                        try {                            app.thread.setSchedulingGroup(app.curSchedGroup);                        } catch (RemoteException e) {                        }                    }                }            }        }        return success;    } 


更多相关文章

  1. Android(安卓)Studio 3.x.x降低compileSdkVersion的SDK版本
  2. Android(安卓)7.1 32位apk导致的系统库找不到问题
  3. Android实现电量控制降低耗电
  4. 降低android应用程序耗电量的解决方案
  5. Android如何降低service被杀死概率
  6. 【MTK】修改开机重启概率性BUG——无法正常读取SIM卡联系人
  7. android 应用生命周期 及应用重要性
  8. [Android(安卓)性能优化系列]降低你的界面布局层次结构的一部分
  9. Unity导出Android在高通骁龙800以上CPU概率性崩溃解决方法研究

随机推荐

  1. android 应用在启动后进行全局的的初始化
  2. Android实现签名涂鸦手写板
  3. android webview 设置
  4. AndroidStudio打包apk出现的问题 `Error:
  5. react-native开发实例之替换默认logo——
  6. textview scroll
  7. Android Studio如何引用外部Library工程
  8. Android开发(一)拨打电话程序
  9. AndroidStudio用gradle编译中文乱码
  10. Android JNI和NDK学习(3)--Android.mk分