源码提炼:Android 进程管理

简介

之前写过一篇Android进程保活原理与优先级调度机制的博客,与这篇要写的内容相仿。不同于之前的文章,本篇更多的是提炼、归纳、总结。

主要内容:

  • 从底层到上层解读Android进程的实现
  • 总结Android创建进程流程、进程查杀场景以及force-stop的功能
  • 最新发布的Android P在应用进程管理上的最新改动

Android应用进程管理发展史

将Android应用进程进行合理管理,因为直接和手机耗电挂钩,所以谷歌从Android 4.4版本就一直在做优化:

  • Lollipop: 推出 JobScheduler 机制。原理是将 service 的使用由APP主动变系统主动,也就是说APP使用JobScheduler的话,在时机合理的情况下系统才会主动调用bindService去触发APP的业务逻辑。Android 发展到今天的P,JobScheulder的地位越来越高
  • Marshmallow: 推出 Doze 模式,在灭屏后应用使用系统资源的能力将会收到限制,以此来达到省电的目的;推出 App Standby 机制,不分灭屏与开屏状态,标识出使用率很低的应用进行限制,此时的 standby 机制还不智能,对于应用的判断非黑即白,对省电的优化还很局限
  • Nougat: 开始明确的限制隐式广播,避免了典型的应用利用系统广播来起到保活作用的行为
  • Oreo: 对后台Service也开始进行了限制,
  • Pie: 引入体系更加完备的 App Standby 体系,根据等级来给应用划分到不同的 bucket中,以此来限制应用使用Alarm, JobScheduler, Network 的频率。值得注意的是,App Standby不仅仅是根据用户使用应用的状态来划分的,同时Google也会引入机器学习来预测应用所在bucket,以此来管理应用进程使用资源的能力,起到省电的目的。

Linux 进程概念

什么是进程?大家说法不一但是含义类似,《Linux 内核源代码情景分析》一书给出了"进程四要素":

  1. 有一段程序供其运行
  2. 拥有专用的系统堆栈空间
  3. 在内核存在对应的进程控制块
  4. 拥有独立的用户存储空间

只有满足这四条才能够被称为进程。如果满足了前三条但是不满足第四条,我们称之为线程。这里需要强调下,linux中进程与线程都是使用 task_struct 来表述,区别在于进程是被 fork 生成的,而线程是被 clone 而成的。进程拥有独立的用户空间,而线程是同其它线程共享存储空间的。

task_struct

task_struct 又称进程控制块,主要用来描述进程的结构,包含以下主要信息:

  • 进程的标志符,如pid,uid等
  • 进程的状态,如state, exit_state, prio等
  • 进程间的关系,如parent, children的呢
  • 进程拥有的资源,如mm,stack,file等
  • 信号处理函数,如signal, sighand等

Android 进程的启动与查杀手段

进程启动

top Created with Sketch.