Android 如何避免后台音乐被low memory结束生命 M

转载 2013年12月02日 16:10:21

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDN
http://www.csdn.net
         雨季o莫忧离:http://blog.csdn.net/luckkof

正文

 

为防止某些进程被low memory意外杀掉,可以将其加入白名单,降低误伤的概率;
一般来说,low memory killer会首先选择adj value徘徊在9~15的process去结束生命;
 
1.在ActivityManagerService.java 增加如下代码:
static final String[] mThirdPartyAppWhiteList = { "android.process.media"};
static final int [] mThirdPartyAppAdj = {7};
 
2.在ActivityManagerService.java修改如下代码:
  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; /// M: ALPS00497111 [Volunteer free] LCA Memory Optimized
                   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) {
                // This app is no longer something we want to keep.  Note
                // its current wake lock time to later know to kill it if
                // it is not behaving well.
                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, "[LTK] Exception thrown during afterAdjAdjustment failed:", e);
                    }
                }
            }
            /// @}
 
            /// M: ALPS00497111 [Volunteer free] LCA Memory Optimized @{
            if(FeatureOption.MTK_LCA_RAM_OPTIMIZE)
            {
                for(int num = 0; num <= WL_PROCNAME.length -1 ;num++)
                {
                    if(WL_PROCNAME[num].equals(app.processName) &&
                        app.curAdj > ProcessList.HIDDEN_APP_MIN_ADJ)
                    {
                        isWLProc = true;
                        break;
                    }
                }
            }
 
//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;
    }


[Audio app]如何避免后台音乐被low memory结束生命

[DESCRIPTION] 如何避免后台音乐被low memory结束生命       [SOLUTION] 为防止某些进程被low memory意外杀掉,可以将其加入白名单,...
  • andylao62
  • andylao62
  • 2016年03月28日 18:23
  • 457

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

为防止某些进程被low memory意外杀掉,可以将其加入白名单,降低误伤的概率; 一般,low memory killer会首先选择adj value徘徊在9~15的process去结束生,所以这个...
  • jinlu7611
  • jinlu7611
  • 2016年04月05日 19:14
  • 1387

tomcat 7内存调大也起不来

类似 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Timer-0...
  • laokaizzz
  • laokaizzz
  • 2017年01月11日 01:12
  • 2730

linux内核的high memory概念详解

32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。linux一般把这个4G的地址空间划分为两个部分:其中0~3G为用户...
  • acs713
  • acs713
  • 2013年02月07日 11:12
  • 8492

Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

本篇是Android后台杀死系列的第三篇,前面两篇已经对后台杀死注意事项,杀死恢复机制做了分析,本篇主要讲解的是Android后台杀死原理。相对于后台杀死恢复,LowMemoryKiller原理相对简...
  • happylishang
  • happylishang
  • 2017年01月13日 15:03
  • 1821

Android源码解析(二十五)-->onLowMemory执行流程

上篇文章中我们分析了Activity的onSaveInstanceState方法执行时机,知道了Activity一旦执行了onStop方法就会执行onSaveInstanceState方法,具体的信息...
  • qq_23547831
  • qq_23547831
  • 2016年05月22日 00:41
  • 9925

实现音乐播放器后台Service服务一直存在的解决思路

最近实现一个音乐播放器的小项目,实现后台播放歌曲的功能,即使退出程序也可以一直播放歌曲,服务不被停止。  实现这个功能的过程中遇到了有两个问题:  问题1、退出程序之后,service播放歌曲的服...
  • syusikoku
  • syusikoku
  • 2016年09月11日 18:32
  • 839

Android实现音乐后台播放

Service是一个生命周期长且没有用户界面的程序,当程序在各个activity中切换的时候,我们可以利用service来实现背景音乐的播放,即使当程序退出到后台的时候,音乐依然在播放。 实现代码如...
  • u013010115
  • u013010115
  • 2015年07月04日 12:08
  • 2306

实现音乐播放器后台Service服务一直存在的解决思路

最近实现一个音乐播放器的小项目,实现后台播放歌曲的功能,即使退出程序也可以一直播放歌曲,服务不被停止。 实现这个功能的过程中遇到了有两个问题: 问题1、退出程序之后,service播放歌曲的服务在...
  • u010156024
  • u010156024
  • 2015年08月15日 11:08
  • 5807

我所理解的high memory

一: 为什么需要high memory 32位的CPU,最大寻址范围2^32-1, 也就是虚拟内存空间的范围为0~4G。 Linux一般吧0~3G划分为用户地址空间,3G到4G为内核地址空间。 图...
  • u012547807
  • u012547807
  • 2013年11月22日 15:39
  • 1217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 如何避免后台音乐被low memory结束生命 M
举报原因:
原因补充:

(最多只允许输入30个字)