前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )

【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )

作者头像
韩曙亮
发布2023-03-29 09:24:44
1.6K0
发布2023-03-29 09:24:44
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、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 源码中以常量形式记录 :

代码语言:javascript
复制
/**
 * 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

二、oom_adj 值动态改变


1、正常运行时的 oom_adj 值

一个程序的 oom_adj 值是不断动态改变的 , 当程序处于前台时 , 该前台进程的 oom_adj 的值为 0 ,

运行程序 ,

在这里插入图片描述
在这里插入图片描述

在 Android Studio 中 , 可以看到该运行的程序的进程号 PID 为

30856

,

在这里插入图片描述
在这里插入图片描述

进入 adb shell 命令行 , su 获取 root 权限 , 使用如下命令 , 查询指定 PID 的 oom_adj 值 ;

代码语言:javascript
复制
cat /proc/30856/oom_adj
在这里插入图片描述
在这里插入图片描述

2、按下 Home 键后的 oom_adj 值

点击 Home 键 , 程序退出 , 显示 Home 程序 ,

在这里插入图片描述
在这里插入图片描述

此时查询该 PID 为

30856

的 oom_adj 值为

12

, 不可见进程范围是

9

~

15

, 此时的状态是不可见状态 ;

在这里插入图片描述
在这里插入图片描述

3、按下回退键后的 oom_adj 值

在这里插入图片描述
在这里插入图片描述

如果是按下回退键退出界面 , 此时查询该 PID 为

30856

的 oom_adj 值为

16

, 此时进程的状态是缓存进程 , 随时都可能被杀掉 ;

在这里插入图片描述
在这里插入图片描述

二、进程保活优化方向


优先级越高 , oom_adj 值越小 , 越不能被杀死 ;

如果想要使得进程尽可能长的保留在内存中 , 那么就要减小 oom_adj 的值 ;

在 oom_adj 值相同时 , 内存占用量越大的进程 , 被杀的几率就越高 , 因此这里还要尽可能降低进程占用尽可能少的内存 ;

总结一下就是 ① 降低 oom_adj 值 , ② 减小内存占用 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、oom_adj 值对应的进程优先级
  • 二、oom_adj 值动态改变
    • 1、正常运行时的 oom_adj 值
      • 2、按下 Home 键后的 oom_adj 值
        • 3、按下回退键后的 oom_adj 值
        • 二、进程保活优化方向
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档