publicstaticintforkSystemServer(intuid,intgid,int[]gids,intruntimeFlags,int[][]rlimits,longpermittedCapabilities,longeffectiveCapabilities){ZygoteHooks.preFork();resetNicePriority();intpid=nativeForkSystemServer(uid,gid,gids,runtimeFlags,rlimits,permittedCapabilities,effectiveCapabilities);// Enable tracing as soon as we enter the system_server.if(pid==0){Trace.setTracingEnabled(true,runtimeFlags);}ZygoteHooks.postForkCommon();returnpid;}privatestaticnativeintnativeForkSystemServer(intuid,intgid,int[]gids,intruntimeFlags,int[][]rlimits,longpermittedCapabilities,longeffectiveCapabilities);
staticjintcom_android_internal_os_Zygote_nativeForkSystemServer(JNIEnv*env,jclass,uid_tuid,gid_tgid,jintArraygids,jintruntime_flags,jobjectArrayrlimits,jlongpermitted_capabilities,jlongeffective_capabilities){// ...
pid_tpid=ForkCommon(env,true,fds_to_close,fds_to_ignore);if(pid==0){SpecializeCommon(env,uid,gid,gids,runtime_flags,rlimits,permitted_capabilities,effective_capabilities,MOUNT_EXTERNAL_DEFAULT,nullptr,nullptr,true,false,nullptr,nullptr);}elseif(pid>0){// 父进程
gSystemServerPid=pid;intstatus;// 如果 system server 死亡,重启 Zygote
if(waitpid(pid,&status,WNOHANG)==pid){RuntimeAbort(env,__LINE__,"System server process has died. Restarting Zygote!");}}returnpid;}
staticvoidSpecializeCommon(JNIEnv*env,uid_tuid,gid_tgid,jintArraygids,jintruntime_flags,jobjectArrayrlimits,jlongpermitted_capabilities,jlongeffective_capabilities,jintmount_external,jstringmanaged_se_info,jstringmanaged_nice_name,boolis_system_server,boolis_child_zygote,jstringmanaged_instruction_set,jstringmanaged_app_data_dir){constchar*process_name=is_system_server?"system_server":"zygote";SetInheritable(permitted_capabilities,fail_fn);DropCapabilitiesBoundingSet(fail_fn);booluse_native_bridge=!is_system_server&&instruction_set.has_value()&&android::NativeBridgeAvailable()&&android::NeedsNativeBridge(instruction_set.value().c_str());if(use_native_bridge&&!app_data_dir.has_value()){use_native_bridge=false;ALOGW("Native bridge will not be used because managed_app_data_dir == nullptr.");}MountEmulatedStorage(uid,mount_external,use_native_bridge,fail_fn);if(!is_system_server&&getuid()==0){// 不是 system_server 的子进程,则创建进程组
constintrc=createProcessGroup(uid,getpid());}// 设置 group
SetGids(env,gids,fail_fn);// 设置资源 limit
SetRLimits(env,rlimits,fail_fn);SetCapabilities(permitted_capabilities,effective_capabilities,permitted_capabilities,fail_fn);// 设置调度策略
SetSchedulerPolicy(fail_fn);__android_log_close();stats_log_close();constchar*se_info_ptr=se_info.has_value()?se_info.value().c_str():nullptr;constchar*nice_name_ptr=nice_name.has_value()?nice_name.value().c_str():nullptr;// 设置 selinux 上下文
if(selinux_android_setcontext(uid,is_system_server,se_info_ptr,nice_name_ptr)==-1){fail_fn(CREATE_ERROR("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed",uid,is_system_server,se_info_ptr,nice_name_ptr));}if(nice_name.has_value()){SetThreadName(nice_name.value());}elseif(is_system_server){SetThreadName("system_server");}// 把 signal 设置为默认函数
UnsetChldSignalHandler();if(is_system_server){env->CallStaticVoidMethod(gZygoteClass,gCallPostForkSystemServerHooks);if(env->ExceptionCheck()){fail_fn("Error calling post fork system server hooks.");}env->CallStaticVoidMethod(gZygoteInitClass,gCreateSystemServerClassLoader);if(env->ExceptionCheck()){env->ExceptionClear();}staticconstchar*kSystemServerLabel="u:r:system_server:s0";if(selinux_android_setcon(kSystemServerLabel)!=0){fail_fn(CREATE_ERROR("selinux_android_setcon(%s)",kSystemServerLabel));}}env->CallStaticVoidMethod(gZygoteClass,gCallPostForkChildHooks,runtime_flags,is_system_server,is_child_zygote,managed_instruction_set);if(env->ExceptionCheck()){fail_fn("Error calling post fork hooks.");}}
System Server 创建好了,就需要去处理自己的事情了,在文章开头中 System Server 创建好了之后,会调用 handleSystemServerProcess 去完成自己的使命。
privatestaticRunnablehandleSystemServerProcess(ZygoteArgumentsparsedArgs){// set umask to 0077 so new files and directories will default to owner-only permissions.Os.umask(S_IRWXG|S_IRWXO);if(parsedArgs.mNiceName!=null){Process.setArgV0(parsedArgs.mNiceName);}finalStringsystemServerClasspath=Os.getenv("SYSTEMSERVERCLASSPATH");if(systemServerClasspath!=null){// 优化 dexif(performSystemServerDexOpt(systemServerClasspath)){sCachedSystemServerClassLoader=null;}booleanprofileSystemServer=SystemProperties.getBoolean("dalvik.vm.profilesystemserver",false);if(profileSystemServer&&(Build.IS_USERDEBUG||Build.IS_ENG)){try{prepareSystemServerProfile(systemServerClasspath);}catch(Exceptione){Log.wtf(TAG,"Failed to set up system server profile",e);}}}if(parsedArgs.mInvokeWith!=null){String[]args=parsedArgs.mRemainingArgs;if(systemServerClasspath!=null){String[]amendedArgs=newString[args.length+2];amendedArgs[0]="-cp";amendedArgs[1]=systemServerClasspath;System.arraycopy(args,0,amendedArgs,2,args.length);args=amendedArgs;}// 启动应用进程WrapperInit.execApplication(parsedArgs.mInvokeWith,parsedArgs.mNiceName,parsedArgs.mTargetSdkVersion,VMRuntime.getCurrentInstructionSet(),null,args);thrownewIllegalStateException("Unexpected return from WrapperInit.execApplication");}else{// 创建类加载器createSystemServerClassLoader();ClassLoadercl=sCachedSystemServerClassLoader;if(cl!=null){Thread.currentThread().setContextClassLoader(cl);}// SystemServer 进入此分支returnZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArgs.mRemainingArgs,cl);}}
protectedstaticRunnablefindStaticMain(StringclassName,String[]argv,ClassLoaderclassLoader){Class<?>cl;try{cl=Class.forName(className,true,classLoader);}catch(ClassNotFoundExceptionex){thrownewRuntimeException("Missing class when invoking static main "+className,ex);}Methodm;try{m=cl.getMethod("main",newClass[]{String[].class});}catch(NoSuchMethodExceptionex){thrownewRuntimeException("Missing static main on "+className,ex);}catch(SecurityExceptionex){thrownewRuntimeException("Problem getting static main on "+className,ex);}intmodifiers=m.getModifiers();if(!(Modifier.isStatic(modifiers)&&Modifier.isPublic(modifiers))){thrownewRuntimeException("Main method is not public and static on "+className);}returnnewMethodAndArgsCaller(m,argv);}
查找 com.android.server.SystemServer 中的 main 方法。然后创建了 MethodAndArgsCaller ,它是个内部静态类。
privatevoidrun(){try{// 设置时间,最小是1970年,不能再早了if(System.currentTimeMillis()<EARLIEST_SUPPORTED_TIME){Slog.w(TAG,"System clock is before 1970; setting to 1970.");SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);}StringtimezoneProperty=SystemProperties.get("persist.sys.timezone");if(timezoneProperty==null||timezoneProperty.isEmpty()){Slog.w(TAG,"Timezone not set; setting to GMT.");SystemProperties.set("persist.sys.timezone","GMT");}// 设置语言if(!SystemProperties.get("persist.sys.language").isEmpty()){finalStringlanguageTag=Locale.getDefault().toLanguageTag();SystemProperties.set("persist.sys.locale",languageTag);SystemProperties.set("persist.sys.language","");SystemProperties.set("persist.sys.country","");SystemProperties.set("persist.sys.localevar","");}Binder.setWarnOnBlocking(true);// 设置虚拟机运行库路径SystemProperties.set("persist.sys.dalvik.vm.lib.2",VMRuntime.getRuntime().vmLibrary());// 清除内存上限VMRuntime.getRuntime().clearGrowthLimit();// 设置内存有效利用率0.8VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);// 确认指纹信息Build.ensureFingerprintProperty();// 设置环境变量前,指定用户Environment.setUserRequired(true);BaseBundle.setShouldDefuse(true);Parcel.setStackTraceParceling(true);// 设置 Binder 优先级,确保在前台BinderInternal.disableBackgroundScheduling(true);BinderInternal.setMaxThreads(sMaxBinderThreads);android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);// 设置当前线程为主线程,初始化LooperLooper.prepareMainLooper();Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS,SLOW_DELIVERY_THRESHOLD_MS);// 加载android_servers.so,源码在frameworks/base/servicesSystem.loadLibrary("android_servers");// 检测上次关机是否失败performPendingShutdown();// 创建系统上下文createSystemContext();// 创建服务管理系统mSystemServiceManager=newSystemServiceManager(mSystemContext);mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime,mRuntimeStartUptime);LocalServices.addService(SystemServiceManager.class,mSystemServiceManager);// Prepare the thread pool for init tasks that can be parallelizedSystemServerInitThreadPool.get();}finally{traceEnd();// InitBeforeStartServices}try{traceBeginAndSlog("StartServices");startBootstrapServices();// 启动引导服务startCoreServices();// 启动核心服务startOtherServices();// 启动其他服务SystemServerInitThreadPool.shutdown();}catch(Throwableex){throwex;}finally{traceEnd();}Looper.loop();thrownewRuntimeException("Main thread loop unexpectedly exited");}