Android5.1.1源码

南笙酒味 提交于 2019-12-07 19:57:09

Android5.1.1源码 - App进程被杀后与App相关的所有服务进程均被杀的原因

@(Android研究)[App服务进程被杀]


[TOC]


前言

当通过长按HOME键的方式清理一个App时,不仅这个App进程会被杀掉,与这个App相关的所有服务进程均会被杀掉,在下文中分析了原因。

分析

长按HOME键清理App最终会执行到ActivityManagerService.cleanUpRemovedTaskLocked方法中,ActivityManagerService类在文件"frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java"中,下面是ActivityManagerService.cleanUpRemovedTaskLocked方法的源码:

private void cleanUpRemovedTaskLocked(TaskRecord tr, boolean killProcess) {
    
    ......

    // Kill the running processes.
    for (int i = 0; i < procsToKill.size(); i++) {
        ProcessRecord pr = procsToKill.get(i);
        if (pr.setSchedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE) {
            pr.kill("remove task", true);
        } else {
            pr.waitingToKill = "remove task";
        }
    }
}

在这个方法的最后会杀掉被清理的App进程,执行杀掉App进程的语句是pr.kill("remove task", true);,kill方法在类ProcessRecord中。

ProcessRecord类源码在文件"frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java"中,下面是ProcessRecord.kill方法的源码:

void kill(String reason, boolean noisy) {
    if (!killedByAm) {
        ......

        Process.killProcessQuiet(pid);
        Process.killProcessGroup(info.uid, pid);
        if (!persistent) {
            killed = true;
            killedByAm = true;
        }
    }
}

这个方法有两个参数,这两个参数均用于Log输出。

pid是App进程的pid,在这个方法中先调用Process.killProcessQuiet方法结束了App进程,然后调用Process.killProcessGroup方法结束掉与App进程相同进程组的所有进程。

由于App进程与这个App进程启动的服务进程同属一个进程组,所以服务进程也会被结束掉。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!