进程的生命周期与优先级

1, 进程生命周期

Android系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入“重要性层次结构”中。 必要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。

Android在回收资源的时候,进程被终止的顺序是由它们的应用程序的优先级所决定的。一个应用程序的优先级等同于它的优先级最高的组件的优先级。

进程优先级分为5类,依次是

前台进程(Foreground process)  可见进程(Visible process)

服务进程(Service process) 后台进程(Background process) 空进程(Empty process)

1.1前台进程

是指那些有组件正和用户进行交互的应用程序的进程。这些都是Android尝试通过回收其它应用程序的资源来使其保持相应的进程。这些进程的数量非常少,只有到最后的关头才会终止这些进程

进程包括:

1;处于活动状态的Activity,也就是说,它们位于前台并对用户事件进行响应

2;正在执行onReceive事件处理程序的Broadcast Receiver

3;正在执行onStart、onCreate或者onDestroy事件处理程序的Service

4;正在运行、且已被标记为在前台运行的Service

1.2 可见进程 

可见但是非活动的进程是指那些驻留”可见“Activity的进程。顾名思义,可见的Activity能被用户看到,但是它们并不在前台运行或者能对用户事件作出反应。例如:当一个Activity被部分遮挡时(被一个非全屏或者透明的Activity遮挡)就会出现这种情况。这些进程的数量也很少,只有在资源极度匮乏的环境下,为保证Activity进程继续执行时才会终止这些进程。

1.3启动Service进程 

已经启动的Service的进程。因为后台Service没有直接和用户交互,所以他们的优先级要比可见Activity或前台Service低一些。但是他们仍然被认为是前台(foreground)进程,除非活动或者可见的进程需要资源,否则不会终止它们。当系统终止一个运行的Service后,会在资源可用时尝试重新启动Service(除非告诉系统不要这么做)

1.4后台进程

 不可见、并且没有任何正在运行的Service的Activity的进程。通常会有大量的后台进程,Android将使用”最后一个被看到,第一个被终止“(last-seen-first-killed)的方式来终止他们,从而为前台进程提供资源。

1.5空进程 

为了提高系统整体性能,Android经常在应用程序的生存周期结束之后仍然把它们保存在内存中。Android通过维护这个缓存来减少应用程序被再次启动时的启动时间。通常这些进程会根据需要被定期终止。

2, 进程优先级

进程看不见摸不着,是在启动四大组件之前启动的。就是说,启动四大组件时会查看组件所在的进程是否启动,如果没有启动就首先启动该进程。并且都会调用AMS的startProcessLocked方法来启动进程。

ProcessList.java中定义的进程优先级划分为16级, 从-17到16之间取值.值越小,优先级越高。

级别

取值

说明

UNKNOWN_ADJ

16

一般指将要会缓存进程,无法获取确定值

CACHED_APP_MAX_ADJ

15

不可见进程的adj最大值 1

CACHED_APP_MIN_ADJ

9

不可见进程的adj最小值 2

SERVICE_B_AD

8

B List中的Service(较老的、使用可能性更小)

PREVIOUS_APP_ADJ

7

上一个App的进程(往往通过按返回键)

HOME_APP_ADJ

6

Home进程

SERVICE_ADJ

5

服务进程(Service process)

HEAVY_WEIGHT_APP_ADJ

4

后台的重量级进程,system/rootdir/init.rc文件中设置

BACKUP_APP_ADJ

3

备份进程 3

PERCEPTIBLE_APP_ADJ

2

可感知进程,比如后台音乐播放 4

VISIBLE_APP_ADJ

1

可见进程(Visible process) 5

FOREGROUND_APP_ADJ

0

前台进程(Foreground process) 6

PERSISTENT_SERVICE_ADJ

-11

关联着系统或persistent进程

PERSISTENT_PROC_ADJ

-12

系统persistent进程,比如telephony

SYSTEM_ADJ

-16

系统进程

NATIVE_ADJ

-17

native进程(不被系统管理)


3, 更新进程优先级

进程的优先级并不是一成不变的,会随着组件的状态而更新。

调整进程的adj的3大护法, 也就是ADJ算法的核心方法:

•updateOomAdjLocked:更新adj,当目标进程为空,或者被杀则返回false;否则返回true;

•computeOomAdjLocked:计算adj,返回计算后RawAdj值;

•applyOomAdjLocked:应用adj,当需要杀掉目标进程则返回false;否则返回true。

updateOomAdjLocked实现过程中依次会computeOomAdjLocked和applyOomAdjLocked。

在以下情况下都会触发updateOomAdjLocked来更新进程adj。

3.1 Activity
  • ASS.realStartActivityLocked: 启动Activity
  • AS.resumeTopActivityInnerLocked: 恢复栈顶Activity
  • AS.finishCurrentActivityLocked: 结束当前Activity
  • AS.destroyActivityLocked: 摧毁当前Activity
3.2 Service

位于ActiveServices.java

  • realStartServiceLocked: 启动服务
  • bindServiceLocked: 绑定服务(只更新当前app)
  • unbindServiceLocked: 解绑服务 (只更新当前app)
  • bringDownServiceLocked: 结束服务 (只更新当前app)
  • sendServiceArgsLocked: 在bringup或则cleanup服务过程调用 (只更新当前app)
3.3 broadcast
  • BQ.processNextBroadcast: 处理下一个广播
  • BQ.processCurBroadcastLocked: 处理当前广播
  • BQ.deliverToRegisteredReceiverLocked: 分发已注册的广播 (只更新当前app)
3.4 ContentProvider
  • AMS.removeContentProvider: 移除provider
  • AMS.publishContentProviders: 发布provider (只更新当前app)
  • AMS.getContentProviderImpl: 获取provider (只更新当前app)
3.5 Process

位于ActivityManagerService.java

  • setSystemProcess: 创建并设置系统进程
  • addAppLocked: 创建persistent进程
  • attachApplicationLocked: 进程创建后attach到system_server的过程;
  • trimApplications: 清除没有使用app
  • appDiedLocked: 进程死亡
  • killAllBackgroundProcesses: 杀死所有后台进程.即(ADJ>9或removed=true的普通进程)
  • killPackageProcessesLocked: 以包名的形式 杀掉相关进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值