Android 重启类型

1. system_server 重启

systemserver重启原理是因为zygote进程,监视所有子进程,systemserver died就会触发,
zygote kill self

@frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
//pid=-1	等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
static void SigChldHandler(int /*signal_number*/) {
    ...
  while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
    ...
    // If the just-crashed process is the system_server, bring down zygote
    // so that it is restarted by init and system server will be restarted
    // from there.
    if (pid == gSystemServerPid) {
      ALOGE("Exit zygote because system server (%d) has terminated", pid);
      kill(getpid(), SIGKILL);  //kill zygote
    }
  }
  errno = saved_errno;
}

nativeForkSystemServer zygote fork SystemServer时就会添加信号监控

static jint com_android_internal_os_Zygote_nativeForkSystemServer(
        JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
        jint runtime_flags, jobjectArray rlimits, jlong permittedCapabilities,
        jlong effectiveCapabilities) {
  pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
                                      runtime_flags, rlimits,
                                      permittedCapabilities, effectiveCapabilities,
                                      MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
                                      NULL, false, NULL, NULL);
    ...
  return pid;
}


static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
                                     jint runtime_flags, jobjectArray javaRlimits,
                                     jlong permittedCapabilities, jlong effectiveCapabilities,
                                     jint mount_external,
                                     jstring java_se_info, jstring java_se_name,
                                     bool is_system_server, jintArray fdsToClose,
                                     jintArray fdsToIgnore, bool is_child_zygote,
                                     jstring instructionSet, jstring dataDir) {
  SetSignalHandlers();

...
  };


static void SetSignalHandlers() {
  struct sigaction sig_chld = {};
  sig_chld.sa_handler = SigChldHandler;

  if (sigaction(SIGCHLD, &sig_chld, NULL) < 0) {
    ALOGW("Error setting SIGCHLD handler: %s", strerror(errno));
  }

  struct sigaction sig_hup = {};
  sig_hup.sa_handler = SIG_IGN;
  if (sigaction(SIGHUP, &sig_hup, NULL) < 0) {
    ALOGW("Error setting SIGHUP handler: %s", strerror(errno));
  }
}

示例:

@ActivityManagerService.java

public void run() {
    Log.d(TAG, "startThread Client .");
    File mFileT = null;
    mFileT.delete();
}

/data/system/dropbox/system_server_crash@1597633141329.txt

08-17 02:59:01.317   952  3154 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: JETest
08-17 02:59:01.317   952  3154 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.delete()' on a null object reference
08-17 02:59:01.317   952  3154 E AndroidRuntime: 	at com.android.server.am.ActivityManagerService$8.run(ActivityManagerService.java:2914)
08-17 02:59:01.317   952  3154 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:919)
08-17 02:59:01.318   952  3154 I am_crash: [952,0,system_server,-1,java.lang.NullPointerException,Attempt to invoke virtual method 'boolean java.io.File.delete()' on a null object reference,ActivityManagerService.java,2914]
08-17 02:59:01.321   952  3154 I DropBoxManagerService: add tag=system_server_crash isTagEnabled=true flags=0x2
08-17 02:59:01.330   952  3154 I Process : Sending signal. PID: 952 SIG: 9
Process: system_server
Build: Android/aosp_sailfish/sailfish:10/QP1A.191005.007.A3/eng.wangdo.20200814.162959:userdebug/test-keys

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.delete()' on a null object reference
	at com.android.server.am.ActivityManagerService$8.run(ActivityManagerService.java:2914)
	at java.lang.Thread.run(Thread.java:919)

2. NETD重启

进程死亡会重启zygote,zygote会导致重启

service netd /system/bin/netd
    class main
    socket netd stream 0660 root system
    socket dnsproxyd stream 0660 root inet
    socket mdns stream 0660 root system
    socket fwmarkd stream 0660 root inet
    onrestart restart zygote
    onrestart restart zygote_secondary

zygote重启就会重启一些重要Native 服务

service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

3. surfaceFlinger重启

重启zygote

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

4. zygote 重启

5. init 重启

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值