Android进程管理篇总结

系列文章:
Android进程管理篇(一)-应用进程启动过程
Android进程管理篇(二)-进程查杀方式总结
Android进程管理篇(三)-AMS进程调度

一、应用程序创建流程

这个过程简单讲就两步:AMS向Zygote请求创建进程,Zygote孵化进程。

runSelectLoop之前流程是将启动参数封装成ZygoteState。Zygote 待命的loop通过socket获取到请求信息,runOnce就开始读取参数列表, 并执行forkAndSpecialize来创建进程,之后就是创建Binder线程池以及通过反射调用ActivityThread的main函数开启ActivityThread消息循环激活app工作流。

注:copy-on-write的fork方式:
Zygote进程地址空间中包含有预加载资源、预加载类、虚拟机实例等。当Zygote fork一个应用程序进程时,父子进程先是共享相同物理地址资源,但是仅仅只能读不能写,如果此时应用进程开始写操作,那么会从Zygote原物理地址中复制内容到一块新的物理地址上,供应用程序进程使用。这样子进程可以高效而完整地继承父进程内存地址中的数据。

二、进程查杀方式

杀进程方法 方法所在类 使用层 方法描述
System.exit(int status) System 应用 退出虚拟机。status=0为正常退出、非0为异常退出。
Process.killProcess(int pid) Process 应用、系统 调用sendSignal发送信号9,杀死指定pid进程。app调用只能自杀,系统可以杀掉指定pid进程。
Process.killProcessGroup(int uid, int pid) Process 系统 杀掉pid所在的进程组内的所有进程。
killApplicationProcess(String processName, int uid) AMS 系统 系统uid应用才能调用,binder call到客户端自杀:app.thread.scheduleSuicide();
killApplication(String pkg, int appId, int userId, String reason) AMS 系统 系统uid应用才能调用,会将目标应用强杀,作用于指定用户空间。
killAllBackgroundProcesses() AMS 系统 需要KILL_BACKGROUND_PROCESS权限,杀死系统所有优先级小于等于CACHED进程。
killBackgroundProcesses(final String packageName, int userId, String reason) AMS 应用、系统 需要KILL_BACKGROUND_PROCESS权限,杀死指定package所有优先级小于等于SERVICE进程,作用于指定用户空间。
killProcessesBelowForeground(String reason) AMS 系统 系统uid应用才能调用,杀死系统所有优先级小于FOREGROUND的进程。
killPackageDependents(String packageName, int userId) AMS 系统 需要KILL_UID权限,杀死指定package所有优先级小于等于FOREGROUND进程,作用于指定用户空间。
killPids(int[] pids, String pReason, boolean secure) AMS 系统 系统UID应用才能调用,首先找出所有进程所有worstType(跟adj相关的一个判断值),杀死小于等于这个优先级的进程。很保守的查杀方法,并不保证进程被杀
killUid(int appId, int userId, String reason) AMS 应用、系统 需要KILL_UID权限,杀死UID下所有进程,system_server与native进程除外
killAppAtUsersRequest(ProcessRecord app, Dialog fromDialog) AMS 系统 系统发生异常后调用,例如ANR ,多为用户主动触发
forceStopPackage(final String packageName, int userId) AMS 系统 需要FORCE_STOP_PACKAGE权限,杀死应用所有进程,并清除各个进程组件信息,作用于指定用户空间,强杀之后连根拔起,寸草不生。属于终极Kill。

三、AMS进程调度

updateOomAdjLocked:在进程及其组件生命周期变化时更新adj,然后分别执行以下两个方法:computeOomAdjLocked、applyOomAdjLocked。

它本身也会对进程做一定管理:

  • 当cached进程超过上限(cachedProcessLimit),则杀掉该进程
  • 当空进程超过上限(emptyProcessLimit),则杀掉该进程
  • 当空进程超过上限(TRIM_EMPTY_APPS为cachedProcessLimit的一半),且空闲时间超过30分钟,则杀掉该进程

computeOomAdjLocked:根据进程及其组件的状态来确定一个优先级,并通过adj和procState来体现这个优先级

applyOomAdjLocked:这部分其实就是把adj把adj值 通过socket通信发送给lmkd守护进程,并把对应值写入:/proc/<pid>/oom_score_adj

最后就是lowmemorykiller的查杀进程逻辑了 具体参考:lowmemorykiller浅析 这部分分析的是内核态的lmk,8.1 andriod go 之后引入了用户态的lmk。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容