****1.什么********是serviceb****
****2.为********什么要********有********serviceb****
****3. Serviceb********的********老化****
******1. 什么********是serviceb******
Servicesb从字面意思来理解,它本身肯定是一个services,因此我们首先来谈谈services。google设计services,一个目的是让应用可以界面和和逻辑分离,界面部分肯定是放到Activity等组件中去处理,那么一些比较耗时的,最好放在后台运行的东西,比如下载,这个他们希望开发通过服务进程去实现。这样应用退到到后台,界面资源可以被回收(因为,界面进程往往是内存大户),同时服务进程可以继续在后台工作。
说到服务进程,那么就必须说到进程管理,我们知道,****android********原生进程********管理,主要是通过adj********来********管理的,adj********代表********进程的优先级,决定了进程寿命的终********点。****那么,android原生是如何来关键,服务进程的呢?主要是把它分成了仨个层次
- 前台服务进程,这个时候一般会有一个常驻通知,也就用户一般能够感知到,这种服务进程adj = 200;
- 普通服务进程,这类服务进程,往往是默默(偷偷)在后台干活,这类服务进程,adj = 500,
- Bservices,这类服务进程我们可以简单的理解为是,普通服务进程的老化状态,这类服务进程adj=800。
******2. 为********什么要********有********serviceb******
Android进程管理主要是通过adj来查杀进程的,如果没有区分那么普通服务的adj都会集中在500,那么进程查杀的时候,就没有依据到底如何取查杀了,因此,对于普通services也必须有一个老化过程,老化后就变成了servicesb。
******3. Serviceb********的********老化******
****老化********条件********:****
app.serviceb简单理解为:
1.在服务进程列表1/3之后
2.内存level大于一定阈值,且该服务进程pss大于一定阈值:
mNumServicesProcs = 53
Serviceb的adj = 800,其实很难被杀到,我搜索了整个google源码,并没有看到google有对servicesb做限制,我想应该是国外应用比较规范,一般很少有应用会通过服务进程来保活自己。但是,对应国内市场而言,整个明显就是个漏洞了。高通,貌似意识到了这一点。下面我们来看看高通的servicesb的老化方案:
一句说就是:每次在所有services中选择一个最不活跃的服务进程,当bservices的数量超过阈值5,且mAllowLowerMemLevel是true。这个变量在系统因为内存原因杀进程的时候,就会变为true,那么serviceB的老化条件可以理解为,当前内存不足了,同时有进程因为内存少被杀了,同时这个时候我们的serviceB有点超标了,那么我们是不是要主动释放点内存出来,那么我们把最不活跃的servcies老化到999,这样这个serviceB的内存会尽快会被回收
因此serviceb,adj老化过程为500到800再到999
转载自:https://blog.csdn.net/qq819025485/article/details/105915356