zoukankan      html  css  js  c++  java
  • Android 进程回收

    1.Android 进程回收策略

    众所周知,Android是基于Linux系统的。在Android进程回收策略中,Android进程与Linux进程根据OOM_ADJ阈值进行区分:

    • OOM_ADJ >= 4:比较容易被杀死的进程
    • OOM_ADJ 0 ~ 3:不容易被杀死的进程
    • OOM_ADJ < 0 :纯Linux进程,非Android进程
    当Android系统察觉设备内存不足时,会按照阈值从大到小杀死进程。
     
    具体的oom_adj值的意义我们可以查看AOSP中的com.android.server.am.ProcessList 文件(其中本人添加了一些中文注释):
    /** 
     * Activity manager code dealing with processes. 
     */  
    final class ProcessList {  
        ...  
      
        // OOM adjustments for processes in various states:  
      
        // Adjustment used in certain places where we don't know it yet.  
        // (Generally this is something that is going to be cached, but we  
        // don't know the exact value in the cached range to assign yet.)  
        // 未知进程,通常是用作缓存  
        static final int UNKNOWN_ADJ = 16;  
      
        // This is a process only hosting activities that are not visible,  
        // so it can be killed without any disruption.  
        // 拥有不可视的Activity的进程,可以不影响影响用户的情况下杀掉  
        static final int CACHED_APP_MAX_ADJ = 15;  
        static final int CACHED_APP_MIN_ADJ = 9;  
      
        // The B list of SERVICE_ADJ -- these are the old and decrepit  
        // services that aren't as shiny and interesting as the ones in the A list.  
        // 一些旧的服务进程  
        static final int SERVICE_B_ADJ = 8;  
      
        // This is the process of the previous application that the user was in.  
        // This process is kept above other things, because it is very common to  
        // switch back to the previous app.  This is important both for recent  
        // task switch (toggling between the two top recent apps) as well as normal  
        // UI flow such as clicking on a URI in the e-mail app to view in the browser,  
        // and then pressing back to return to e-mail.  
        // 用户使用的前一个进程  
        static final int PREVIOUS_APP_ADJ = 7;  
      
        // This is a process holding the home application -- we want to try  
        // avoiding killing it, even if it would normally be in the background,  
        // because the user interacts with it so much.  
        // 主界面进程  
        static final int HOME_APP_ADJ = 6;  
      
        // This is a process holding an application service -- killing it will not  
        // have much of an impact as far as the user is concerned.  
        // 持有应用服务的进程  
        static final int SERVICE_ADJ = 5;  
      
        // This is a process with a heavy-weight application.  It is in the  
        // background, but we want to try to avoid killing it.  Value set in  
        // system/rootdir/init.rc on startup.  
        // 重量级应用进程  
        static final int HEAVY_WEIGHT_APP_ADJ = 4;  
      
        // This is a process currently hosting a backup operation.  Killing it  
        // is not entirely fatal but is generally a bad idea.  
        // 执行备份操作的进程  
        static final int BACKUP_APP_ADJ = 3;  
      
        // This is a process only hosting components that are perceptible to the  
        // user, and we really want to avoid killing them, but they are not  
        // immediately visible. An example is background music playback.  
        // 拥有用户可感知组件的进程  
        static final int PERCEPTIBLE_APP_ADJ = 2;  
      
        // This is a process only hosting activities that are visible to the  
        // user, so we'd prefer they don't disappear.  
        // 拥有用户仅可见、不可交互的Activity的进程  
        static final int VISIBLE_APP_ADJ = 1;  
      
        // This is the process running the current foreground app.  We'd really  
        // rather not kill it!  
        // 前台运行的进程  
        static final int FOREGROUND_APP_ADJ = 0;  
      
        // This is a system persistent process, such as telephony.  Definitely  
        // don't want to kill it, but doing so is not completely fatal.  
        // 系统常驻进程  
        static final int PERSISTENT_PROC_ADJ = -12;  
      
        // The system process runs at the default adjustment.  
        // 系统进程  
        static final int SYSTEM_ADJ = -16;  
      
        // Special code for native processes that are not being managed by the system (so  
        // don't have an oom adj assigned by the system).  
        // 为native进程保留,他们不被系统管理  
        static final int NATIVE_ADJ = -17;  
      
        ...  
    }  

    2.Android 进程被杀死情况

    一般来说,Android进程被杀死有以下几种情况:
    1. 触发系统进程管理机制回收(Lowmemorykiller):这种方法会按照阈值从大到小进行清理
    2. 被没有进行Root的第三方应用杀死(使用killBackgroundProcess方法):这种方法只能杀死OOM_ADJ为4以上的进程
    3. 被进行Root的第三方应用杀死(使用force-stop或者kill):理论上来说可以杀死所有进程,但一般只会清理非系统关键进程和非前台可见进程
    4. 厂商的杀进程功能(force-stop或者kill):理论上来说可以杀死所有进程,包括Linux原生进程
    5. 用户主动“强行停止”进程(force-stop):只能停用第三方和非system/phone进程应用(停用system进程应用会造成Android系统重启)
  • 相关阅读:
    设置datagrid的背影及对单元格进行设置
    利用结果集更新记录
    安装sql2000提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作"解决办法
    xls.exe
    动态增加datagrid的行数
    Emergency Preparedness Resource Inventory(紧急预备资源列表系统)
    DataList中选择列的实现与数据的取得:
    Android中发送Http请求实例(包括文件上传、servlet接收)
    android文件上传到服务器
    C++获取程序执行时间
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7994757.html
Copyright © 2011-2022 走看看