System_Server与Zygote共存亡

Zygote孵化System_server的最后阶段ForkAndSpecializeCommon里会调用SetSigChldHandler设置信号处理函数。SetSigChldHandler定义了信号处理函数SigChldHandler,当信号SIGCHLD到来的时候,会进入信号处理函数。如果子进程SystemServer挂了,Zygote就会自杀。从而导致Zygote重启。

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

static void SigChldHandler(int /*signal_number*/) {
  pid_t pid;
  int status;
 //Zygote监听所有子进程的存亡
  while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
 //某一个子进程挂了
 if (WIFSIGNALED(status)) {
      if (WTERMSIG(status) != SIGKILL) {
        ALOGI("Process %d exited due to signal (%d)", pid, WTERMSIG(status));
      }
    }
   //如果挂掉的是SystemServer
    if (pid == gSystemServerPid) {
      ALOGE("Exit zygote because system server (%d) has terminated", pid);
      kill(getpid(), SIGKILL);   //Zygote自杀
    }
  }
}

而如果Zygote收到被kill的信号,会调用kill(-pid_, SIGKILL),pid < 0将该信号发送给其进程组id等于pid的绝对值的进程组,导致System_Server被杀。系统重启。

system/core/init/service.cpp

bool ServiceManager::ReapOneProcess() {
  ......
    if (WIFEXITED(status)) {
        NOTICE("%s exited with status %d\n", name.c_str(), WEXITSTATUS(status));
    } else if (WIFSIGNALED(status)) {
        NOTICE("%s killed by signal %d\n", name.c_str(), WTERMSIG(status));
    } else if (WIFSTOPPED(status)) {
        NOTICE("%s stopped by signal %d\n", name.c_str(), WSTOPSIG(status));
    } else {
        NOTICE("%s state changed", name.c_str());
    }
    if (svc->Reap()) {
        waiting_for_exec = false;
        RemoveService(*svc);
   }
  ......
}

bool Service::Reap() {
    if (!(flags_ & SVC_ONESHOT) || (flags_ & SVC_RESTART)) {
        NOTICE("Service '%s' (pid %d) killing any children in process group\n",
               name_.c_str(), pid_);
        kill(-pid_, SIGKILL);  //pid < 0将该信号发送给其进程组id等于pid的绝对值的进程组,但是不包含某些系统进程!
    }
    .................
}

导致Zygote重启的一些事件,从init*rc可以看出,
Zygote:挂掉会触发media、netd以及子进程(包括System_Server进程)重启;
System_Server: 挂掉触发zygote重启;
surfaceflinger:重启触发zygote重启;
servicemanager: 重启触发zygote重启

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm

service surfaceflinger /system/bin/surfaceflinger
    class core
    user system
    group graphics drmrpc
    onrestart restart zygote

参考资料
http://gityuan.com/2016/02/05/android-init/
http://gityuan.com/2016/02/13/android-zygote/
http://gityuan.com/2016/02/14/android-system-server/
http://gityuan.com/2016/02/20/android-system-server-2/
http://www.jianshu.com/p/98cf2c9b5dee

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值