进程的生命周期与优先级

    xiaoxiao2021-03-25  92

    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: 以包名的形式 杀掉相关进程。
    转载请注明原文地址: https://ju.6miu.com/read-36686.html

    最新回复(0)