Android 应用进程优先级

在 Android 系统中,应用进程停止运行有以下几个原因。

  • 用户主动退出。
  • Crash 异常退出。
  • 系统通过杀掉进程回收内存。

其中用户主动退出是合理行为,Crash 在前面分析过,这里不再重复分析。而系统通过杀掉应用进程回收内存,理论上这也是合理的形为。因为 Android 有一个淘汰机制,这个机制会根据应用的运行状态设置一个进程的优先级,然后根据系统整体内存使用状态进行调整,当内存占用达到一定阈值时,就需要把一些优先级低的进程杀掉,以保证其他进程能够有足够的内存使用。

但是杀掉应用进程对体验会有一些影响,比如杀掉后,用户再打开应用耗时会更长(冷启动),如果能从最大程序上提高应用进程的存活率,可以提高热启动的概率,减少冷启动的概率,让用户更快进入应用中,并且提高进程存活率在一些有后台服务进程的应用意义更加明显,比如播放器,如果在后台听歌过程中应用进程被杀,会中断歌曲播放。

应用进程优先级

在 Android 系统上,应用进程的优先级(oom_adj 值)分为以下等级,不同定义的进程系统采用了不同的管理机制。

  • NATIVE_ADJ=-17
    系统创建的 Native 进程。
  • SYSTEM_ADJ=-16
    系统进程,在运行的过程中永远不会杀掉,如果杀掉可能会导致严重问题。
  • PERSISTENT_PROC_ADJ=-12
    核心进程,系统不会杀掉这类进程,但即使杀掉,影响面也没有SYSTEM_ADJ 进程那么严重。
  • PERSISTENT_SERVICE_ADJ=-11
    正在运行的服务进程,一般不会被杀掉。
  • FOREGROUND_APP_ADJ=0
    前台进程,是指正在前台运行的应用,被杀概率不大。
  • VISIBLE_APP_ADJ=1
    可见进程,用户正在使用,或者有界面在显示,除非出现异常,否则系统不会杀掉这类进程。
  • PERCEPTIBLE_APP_ADJ=2
    可感知的进程,虽然不在前台,但应用进程还在状态,系统除非到内存非常紧张才会杀掉这类进程,比如播放音乐的应用。
  • BACKUP_APP_ADJ=3
    正在备份的进程。
  • HEAVY_WEIGHT_APP_ADJ=4
    高权重进程。
  • SERVICE_ADJ=5
    有 Service 的进程。
  • HOME_APP_ADJ=6
    与 Home 有交互的进程,比如有桌面部件和应用正在通信,widget 小挂件之类,一般尽量避免杀掉此类进程。
  • PREVIOUS_APP_ADJ=7
    切换进程,可以理解为从可见进程切换过来的进程的状态。
  • CACHED_APP_MIN_ADJ=8
    缓存进程,也就是空进程。
  • SERVICE_B_ADJ=9
    不活跃的进程。
  • HIDDEN_APP_MIN_ADJ=15
    缓存进程,空进程,在内存不足的情况下会被优先杀掉。
  • UNKNOWN_ADJ=16
    最低级别进程,只有缓存的进程,才有可能设置成这个级别。

当内存不足时,进程优先级低的(oom_adj 越大的)、占内存大的 App 进程将会被优先杀掉,系统杀进程的规则如下:

  • 进程优先级设置为 PERSISTENT_PROC_ADJ(-12)被杀概率较低。
  • 进程优先级 HEAVY_WEIGHT_APP_ADJ(4),这种是 Activity 仅次于主进程,系统认为是高权重进程。
  • 前台进程 FOREGROUND_APP_ADJ(0)不会被杀掉。
  • 当 Activity、Service 的生命周期发生变化时都会调整进程的优先级(oo_adj)。
  • 进程中没有任何 Activity 存在会优先被杀。
  • 空进程最容易被杀。

Android 系统进程管理机制的出发点是很好的,将一些空进程和挂起进程杀掉,从用户体验上来讲不会有太大影响,但是在部分应用的特殊场景下,如消息推送和后台播放,需要应用在后台时也尽量不要杀掉,因此有时需要适当提高或维持进程的高优先级,以免被系统所杀。

发布了119 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/ldxlz224/article/details/101211700