有时候分析 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_ 开头的进程都干掉。