Android进程的adj值

Android进程的adj值

1. Android进程的adj值

//在未调整adj之前(没有进行初始化过),adj的值是INVALID_ADJ,这个值非常小,也就是优先级很大
static final int INVALID_ADJ = -10000;

//这个是未知的adj,一般cachedAdj的初始值,在cached进程进行重新调整(assignCachedAdjIfNecessary)之前会是这个值
static final int UNKNOWN_ADJ = 1001;

// 从900-999是cached缓存进程adj调整的时候可能存在的值,adj(进程优先级的值)大于等于900代表缓存进程
static final int CACHED_APP_MAX_ADJ = 999;
static final int CACHED_APP_MIN_ADJ = 900;

// 这个是传入lmkd中首先被允许杀死的adj,相当于lmkd里面最大的水位线的adj,
//低于改值将开始杀进程,存放在lmkd.c的lowmem_adj[MAX_TARGETS-1]里面
//不过由于lmkd策略经过很多次更新换代,还有平台商,手机厂家的魔改
//这个值的水位线不一定有在lmkd实际使用
static final int CACHED_APP_LMK_FIRST_ADJ = 950;

// 1. 每个cached进程组之间的adj值的最低间隔
// 2. 同uid或者有服务连接的,而且需要在mLruProcesses是连续紧挨着的,会属于一个组,同组调整是adj最新是+1的差距
// 3. 注意这里只是单次assignCachedAdjIfNecessary的规则(进入时如何还是UNKNOWN_ADJ的才会进行调整)
static final int CACHED_APP_IMPORTANCE_LEVELS = 5;

// B service的优先级,也是服务(SERVICE_ADJ),只是排在mLruProcesses后面的服务,相对优先级低一点的服务
static final int SERVICE_B_ADJ = 800;

//1. 如果是上一个进程,而且拥有缓存的activity,adj类型是"previous"
//2. 如果mLastProviderTime上一次使用这个进程的provider在20s以内
//(ContentProviderHelper的decProviderCountLocked才会设置该时间),adj类型是"recent-provider"
//=>相当于最近使用的保护一下
static final int PREVIOUS_APP_ADJ = 700;

// 这个就是桌面进程的adj,adj类型是"home"
static final int HOME_APP_ADJ = 600;

// 比较重要的服务,adj类型是"started-services"
// 1.通过config_keep_warming_services配置的服务
// 2. 该服务最近30分钟调用startServiceInnerLocked/bindServiceLocked/realStartServiceLocked,
// 会更新ServiceRecord lastActivity的时间
static final int SERVICE_ADJ = 500;

//重要的app
//当app无法保存状态,如AndroidManifest.xml设置了"android:cantSaveState=“true”",
//同时系统配置了<feature name="android.software.cant_save_state" />这个feature
//由于其无法保存状态,故尽量不要杀死, 一般只有一个,adj类型是"heavy"
static final int HEAVY_WEIGHT_APP_ADJ = 400;

// 在备份的app的优先级,adj类型是"backup"
static final int BACKUP_APP_ADJ = 300;

// 用户可感知的最低级别
// 服务依赖(自己是服务):绑定了常驻进程的adj,而且设置了BIND_NOT_PERCEPTIBLE,它的最低adj是这个
// 这个已经是比较高的优先级了
static final int PERCEPTIBLE_LOW_APP_ADJ = 250;

// 用户可感知的中等级别
// 服务依赖(自己是服务):绑定了常驻进程的adj,而且设置了BIND_ALMOST_PERCEPTIBLE,它的最低adj是这个
static final int PERCEPTIBLE_MEDIUM_APP_ADJ = 225;

// 用户可感知的普通级别,如正在播放的music、toast等
// 1. onPausedActivity正在pausing暂停的activity的优先级,其中adj类型是"pause-activity"
// 2. onStoppingActivity正在stopping停止而又没有全部stop停止完成的activity的优先级,其中adj类型是"stop-activity"
// 3. hasForegroundServices=true拥有前台服务的进程,如正在播放的music,adj类型是"fg-service"
// 4. hasOverlayUi在显示一个覆盖在界面之上的overlay ui的进程,adj类型是"has-overlay-ui"
// 5. 通过setProcessImportant设置了ImportanceToken的进程,相当于强制设置进程优先级,如toast,adj类型是"force-imp"
// 6. 服务依赖(自己是服务):设置了BIND_NOT_VISIBLE,而且客户端优先级小于200(ProcessList.PERCEPTIBLE_APP_ADJ),adj类型是"service"
// 7. 服务依赖(自己是服务):没有设置BIND_NOT_VISIBLE,而且客户端优先级等于200(ProcessList.PERCEPTIBLE_APP_ADJ),adj类型是"service"
public static final int PERCEPTIBLE_APP_ADJ = 200;

// 用户可见的进程优先级,不过Android S由于依赖关系,如visable之上的进程去绑定了低优先级进程的服务,
//会导致低优先级进程的服务进程优先级也会提高到VISIBLE_APP_ADJ,这种进程在Android S较多
//1. 正在播放动画的isRunningRemoteAnimation的进程,adj类型是"running-remote-anim"
//2. onVisibleActivity拥有一个可见的activity(isVisible或者mVisibleRequested),adj类型是"vis-activity"
//3. 服务依赖(自己是服务):客户端client的优先级起码是visable,而且没有设置什么flags,则服务端会都约束到100的优先级,adj类型是"service"
static final int VISIBLE_APP_ADJ = 100;

// VISIBLE_APP_LAYER_MAX = 99,相对比较少用到,用于约束进程的优先级在VISIBLE_APP_ADJ和PERCEPTIBLE_APP_ADJ之间
// 没有前台activity但是有cached activity,调用computeOomAdjFromActivitiesIfNecessary
// 当这类应用computeOomAdjFromActivities计算出来的adj是VISIBLE_APP_ADJ,则会将其与约束到100 + 0 = 100到 100 + 99 = 199
// RootWindowContainer的rankTaskLayers会计算后面的加值task.mLayerRank = ++mTmpTaskLayerRank;(mTmpTaskLayerRank默认是0)

static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1;

// 拥有前台服务,而且最近在top顶端的时间在15s以内或者进程状态起码是PROCESS_STATE_TOP的优先级
// adj类型是"fg-service-act""
static final int PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ = 50;

// 1. 是top app,adj类型是"top-activity"(在非休眠状态的时候)/“top-sleeping”(在休眠状态的时候)
// 2. 拥有活跃的instrumentation(如自动化测试中),adj类型是"instrumentation"
// 3. 正在接受广播的进程,adj类型是"broadcast"
// 4. 有正在执行任务的服务,adj类型是"exec-service"
// 5. 服务依赖(自己是服务):设置了BIND_ADJUST_WITH_ACTIVITY,而且拥有可见的activity,adj类型是"service"
// 6. provider内容提供者依赖:client的优先级大于等于FOREGROUND_APP_ADJ的时候,adj类型是"provider"
// 7. provider原因(自身非依赖):cpr.hasExternalProcessHandles为true时,adj类型是"ext-provider"
//通过调用getContentProviderExternalUnchecked/getContentProviderExternal来设置hasExternalProcessHandles

static final int FOREGROUND_APP_ADJ = 0;

// 常驻进程的服务,如Android S上的mediaprovider,可以动态设定和取消
// service服务依赖:设置了BIND_ABOVE_CLIENT或者BIND_IMPORTANT,而且clinet的adj小于PERSISTENT_SERVICE_ADJ会设置,adj类型是"service"
static final int PERSISTENT_SERVICE_ADJ = -700;

// 常说的常驻进程,就是这个
// 通过getPersistentApplications取得,需要AndroidManifest.xml带有persistent flag,
// 而且需要时system系统应用,签名也需要是系统签名,adj类型是"fixed"/或者"pers-top-activity"/“pers-top-ui”
static final int PERSISTENT_PROC_ADJ = -800;

// 这个就是system_server的进程, adj类型是"fixed"
static final int SYSTEM_ADJ = -900;

// native进程的adj优先级,不包含在AMS的mPidsSelfLocked(用pid存储的ProcessRecord的Map)(mPidsSelfLocked跟ProcessList的mLruProcesses(mLruProcesses排序后的ProcessRecord list)类似,都代表上层的进程)
static final int NATIVE_ADJ = -1000;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值