Android进程保活

背景

为啥需要进程保活

  • 其实Android系统的机制,在系统内存吃紧的时候,会回收那些不经常使用的进程,重而来保证系统的正常运转。这样对耗电量及内存等资源消耗都是有好处的。
  • 但是,在某些场景下,我们需要让我们的进程一直是活着的,比如:我们想让用户时刻接收到我们的push消息、像微信那样想实时的能接收到消息等。这时候就得用一些手段来做到进程保活了。

进程保活包括两方面

  1. 提高进程的优先级,降低系统被杀死的概率。
  2. 一旦进程被杀死后,用各种手段进行拉活。

进程的优先级及进程的回收策略

  • 这里我就不展开再去写了,网上有挺多介绍这些知识点的文章。
  • 可以参考Android进程保活招式大全,这里基本上讲了所有可用的进程保活知识点。

进程保活方案

  • 这里我也不展开写了,可以参考Android进程保活招式大全,因为我感觉这篇文章讲解的已经很详细了。
  • native进程保活,可以参考native保活,这篇文章针对native保活讲解的更细。

测试过程中注意的点

测试场景

正常情况被杀死,比如系统内存不足时进程被杀。
  • 这种场景不太好模拟,可以在手机上多开几款app(可以多装几个安全应用),然后明显感觉到系统卡顿,这时候系统比较容易回收进程。
  • 在Android6.0上可以通过 adb shell am send-trim-memory com.example.app MODERATE 命令触发低内存。
  • 还可以将app长时间置于后台,不过不太好操作。
系统一键清理,杀进程
  • 不同设备不太一样,有的是长按home键,有的是长按菜单键。
  • 现在的设备,一键清理,调用的是force-stop或者kill,进程被杀的比较彻底,比如小米,被杀之后,很难再被拉起。
用户主动的杀进程
  • 在设置-应用中强制停止应用。
第三方应用杀进程
  • 第三方应用杀进程分为root和非root两种情况。
  • 现在的第三方引用做的无比流氓和难用。测试很难受。

测试过程中的细节

  • 进程被杀死后,间隔多久可以被拉起来。
  • 进程保活过程中的定时器,5.0以下是AlarmManager。5.0以上是JobScheduler。时间间隔,一般最少要5分钟。间隔太短会不停的唤醒cpu,造成耗电量增多。
  • 定时器被执行时,是否每次都会重启service,正常的逻辑是:当服务还活着时就不必再去start service。只有当服务被杀死之后,再去start service。
  • 测试下,手机打开很多APP,然后放一晚上,看保活进程是否还存活。
  • JobScheduler的产生是Android为了省电而提出来的,它会将一批任务在某些场景下(比如连上网络或者充电)一起执行。测试起来比较恶心的是,它的执行时间是不固定的。 我测试的时候发现,它执行的时间间隔会越来越大,这可能是Android从省电层面做的优化。(待看源码验证)

总结

  • 进程保活在APP里用的很多,基本是个app,都想搞个保活的服务进程。所以理解进程保活的原理对测试帮助很大。
  • 不过需要说明的一点,因为Android系统的多样性,所以理论上不存在绝对保活的方式,再好的方式,在某些设备上也可能会失效。测试时,只要能覆盖到主流的机型就是可以接受的。