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