AMS 启动的时候杀掉所有进程

来源:互联网 发布:在线订单管理系统源码 编辑:程序博客网 时间:2024/05/21 08:37

有时候分析 Android log 的时候发现几乎所有进程都 die 了,那基本判定 AMS 重启了。

AMS 代码:http://androidxref.com/6.0.1_r10/xref/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

AMS 通过 SystemServer 启动,在其代码 start 中有如下部分:

private void start() {        Process.removeAllProcessGroups();
        xxxxxx
}

看到  Process.removeAllProcessGroups() 就是杀所有进程的,这个函数是native继续跟下去,在 android_util_Process.cpp中:

void android_os_Process_removeAllProcessGroups(JNIEnv* env, jobject clazz){    return removeAllProcessGroups();}static const JNINativeMethod methods[] = {...........    {"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},...........};

继续跟踪代码到 system/core/libprocessgroup/processgroup.cpp 中:

void removeAllProcessGroups(){    SLOGV("removeAllProcessGroups()");    DIR *root = opendir(PROCESSGROUP_CGROUP_PATH);    if (root == NULL) {        SLOGE("failed to open %s: %s", PROCESSGROUP_CGROUP_PATH, strerror(errno));    } else {        struct dirent cur;        struct dirent *dir;        while ((readdir_r(root, &cur, &dir) == 0) && dir) {            char path[PROCESSGROUP_MAX_PATH_LEN];            if (dir->d_type != DT_DIR) {                continue;            }            if (strncmp(dir->d_name, PROCESSGROUP_UID_PREFIX, strlen(PROCESSGROUP_UID_PREFIX))) {                continue;            }            snprintf(path, sizeof(path), "%s/%s", PROCESSGROUP_CGROUP_PATH, dir->d_name);            removeUidProcessGroups(path);            SLOGV("removing %s\n", path);            rmdir(path);        }        closedir(root);    }}
这里会把 /acct 目录下所有 uid_ 开头的进程都干掉。






原创粉丝点击