Android 如何避免(降低)后台程序被杀?

为防止某些进程被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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的后台进程被白名单是指一些特定的应用程序或服务,在设备内存不足时也不会被系统自动终止。这些应用程序或服务被认为是重要的,需要保持运行状态以便能够继续提供其功能或服务。 在Android系统中,后台进程的终止是为了释放内存资源,以便给前台应用程序提供更好的运行环境。但是,一些应用程序或服务可能需要长时间运行,例如即时通讯、音乐播放器、下载器等,这些应用程序或服务需要在后台保持运行,以便用户能够随时使用它们。 为了满足这些需求,Android系统引入了后台进程被白名单的概念。这个名单中的应用程序或服务被认为是重要的,即使设备内存不足时也不会被系统自动终止。通过将应用程序或服务添加到后台进程被白名单,可以确保它们能够保持运行,并且能够继续提供其功能或服务。 但是,需要注意的是,过多地将应用程序或服务添加到后台进程被白名单可能会导致设备内存不足,从而降低整体性能。因此,仅应将那些确实需要在后台持续运行的关键应用程序或服务添加到该白名单中。 总之,Android后台进程被白名单可以确保一些重要的应用程序或服务不会被系统自动终止,从而保持其长时间运行和提供功能或服务的能力。这样,用户可以随时使用这些应用程序或服务,而不需要担心它们会因设备内存不足而被终止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值