安卓面试

Android进程优先级:等级低的就被Kill掉了

2017-10-11  本文已影响0人  Marker_Sky

一. 定义

二. Android系统中存在的进程

1.Zygote进程

Zygote,受精卵的意思...在Android系统中,所有的系统服务进程SystemServer以及应用程序进程都是由Zygote进程Fork(孕育)出来的。

2.App主进程

每一个App都是运行在一个独立的进程中,当然这个进程也是由Zygote进程Fork出来的。App的进程的名称就是包名,并由AMS(ActivityManagerService)管理,顺带提一下BroadcastReceiver的发送也是由AMS来完成的。

3.App辅助进程

一个App可以拥有多个进程,具体为在AndroidManifest.xml文件中为Activity或者Service进行配置android:process=""。同样,辅助进程也是由Zygote Fork出来并由AMS管理。

4.Native进程

Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。由NDK所Fork出的进程称之为Native进程。Native进程自由度较高可以不受AMS管理。另,NDK也可用来做进程保活。

三. Android系统中进程的优先级

Android系统中进程的优先级定义在com.android.server.am.ProcessList类中,这个类在SDK中可以找到。
主要有以下优先级定义(oom_adj值):

名称 说明
UNKNOWN_ADJ = 16 预留最低级别,缓存用可能设置为这个
CACHED_APP_MAX_ADJ = 15 持有不可见的Activity的进程,也就是后台进程,系统内存不足会被Kill
CACHED_APP_MIN_ADJ = 9 缓存进程,也就是空进程
SERVICE_B_ADJ = 8 不活跃的进程
PREVIOUS_APP_ADJ = 7 切换进程,切换应用程序时保存的之前的进程
HOME_APP_ADJ = 6 与Home交互的进程
SERVICE_ADJ = 5 包含Service的进程,一般来说Kill掉对用户影响不太大
HEAVY_WEIGHT_APP_ADJ = 4 高权重进程,在后台运行但是系统尽量不Kill掉
BACKUP_APP_ADJ = 3 托管备份的进程,Kill掉是一个bad idea
PERCEPTIBLE_APP_ADJ = 2 可被用户感知的进程,比如音乐播放器
VISIBLE_APP_ADJ = 1 可见进程,用户可以见到的进程,但不一定都是前台进程,有可能是被覆盖的Activity
FOREGROUND_APP_ADJ = 0 前台进程,运行在前台的App的进程
PERSISTENT_SERVICE_ADJ = -11 重要进程,系统或重要进程绑定的进程
PERSISTENT_PROC_ADJ = -12 核心进程,系统持续进程,如电话
SYSTEM_ADJ = -16 系统进程
NATIVE_ADJ = -17 不由系统管理的Native相关进程

查看进程优先级:

  //oom_adj的值就是进程的优先级
  //查看oom_adj值
  cat /proc/${pid}/oom_adj

四. Android系统中常见进程

优先级从高到低排列:

1. 前台进程(Foreground process)

满足以下几个条件被视为前台进程:

2. 可见进程(Visible process)
3 服务进程(Service process)
4 后台进程(Background process)
5 空进程

五. 提高进程优先级

参考资料:

Android平台App进程优先级
Android基础总结——进程优先级及提高优先级的方法(Service尽量不死之法)

上一篇 下一篇

猜你喜欢

热点阅读