文章目录
一、oom_adj 值对应的进程优先级
二、oom_adj 值动态改变
1、正常运行时的 oom_adj 值
2、按下 Home 键后的 oom_adj 值
3、按下回退键后的 oom_adj 值
二、进程保活优化方向
一、oom_adj 值对应的进程优先级
oom_adj 值对应的进程优先级 : 优先级从上到下越来越高 , 最下面的优先级最高 , 最上面的优先级最低 ;
UNKNOWN_ADJ = 16 : 缓存进程 ;
CACHED_APP_MAX_ADJ = 15 : 不可见进程的 oom_adj 最大值 ;
CACHED_APP_MIN_ADJ = 9 : 不可见进程的 oom_adj 最小值 ;
SERVICE_B_ADJ = 8 : 在 B 列表中的 Service 服务 , 这些服务比较老 , 再次使用的可能性较小 ;
PREVIOUS_APP_ADJ = 7 : 上一个应用程序进程 , 即上一次按下返回键退出的应用 , 缓存应用中的第一个应用 ;
HOME_APP_ADJ = 6 : Home 应用所在的进程 , 不能杀 ;
SERVICE_ADJ = 5 : 服务进程 ;
HEAVY_WEIGHT_APP_ADJ = 4 : 后台的重量级继承 , 启动时在 system/rootdir/init.rc 配置中设置 ;
BACKUP_APP_ADJ = 3 : 进入后台的进程 , 按下 Menu 键可查看 , 备份进程 , 可唤醒 ;
PERCEPTIBLE_APP_ADJ = 2 : 可感知进程 , 如后台播放音乐 , 铃声 , 震动 , 闪光灯 等除视觉外的其它可感知效果 ;
VISIBLE_APP_ADJ = 1 : 可见进程 ;
FOREGROUND_APP_ADJ = 0 : 前台进程 ;
PERSISTENT_SERVICE_ADJ = -11 : 系统或持久化进程绑定的进程 ;
PERSISTENT_PROC_ADJ = -12 : 系统持久化进程 , 如电话进程 ;
SYSTEM_ADJ = -16 : 系统进程 ;
NATIVE_ADJ = -17 : 本地进程 , 不受系统控制 ;
打印出来的值是上述值 , 不是常量中定义的值 ;
这些 ADJ 值都在 frameworks/base/services/core/java/com/android/server/am/ProcessList.java 源码中以常量形式记录 :
/** * Activity manager code dealing with processes. */ public final class ProcessList { // 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 = 800; // 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 = 700; // 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 = 600; // 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 = 500; // 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 = 400; // 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 = 1001; // This is a process only hosting activities that are not visible, // so it can be killed without any disruption. static final int CACHED_APP_MAX_ADJ = 906; static final int CACHED_APP_MIN_ADJ = 900; // 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 = 300; // 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 = 300; // 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 = 200; // This is a process only hosting activities that are visible to the // user, so we'd prefer they don't disappear. static final int VISIBLE_APP_ADJ = 100; // 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 process that the system or a persistent process has bound to, // and indicated it is important. static final int PERSISTENT_SERVICE_ADJ = -700; // 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 = -800; // The system process runs at the default adjustment. static final int SYSTEM_ADJ = -900; // Special code for native processes that are not being managed by the system (so // don't have an oom adj assigned by the system). static final int NATIVE_ADJ = -1000; // Memory pages are 4K. static final int PAGE_SIZE = 4*1024; }
参考源码 : frameworks/base/services/core/java/com/android/server/am/ProcessList.java