• 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系统重启)
  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7994757.html
Copyright © 2020-2023  润新知