本文转载自微信公众号《代码积木》,可通过以下二维码关注。转载本文请联系代码上的积木公众号。前言的第一部分提到了Android系统的启动过程。Zygote进程fork的第一个进程是SystemServer进程。这个进程负责启动和管理JavaFramework层,也就是它提供了很多框架层的服务,比如大家熟知的AMS、PMS、WMS,还有DisplayManagerService、CameraService等,也就是说,它掌握着Android系统的命脉,是Android系统中的大管家。一起来看看吧~(本文源码基于Android9.0)在Android系统诞生之前,据说SystemServer进程是从Zygote进程fork出来的。fork()函数通过系统调用创建了一个和原进程几乎一模一样的进程,可以理解为COPY一个进程,这个新进程就是它的子进程。而关于SystemServer的诞生,还要从ZygoteInit的forkSystemServer方法说起...(只保留主要代码)privatestaticRunnableforkSystemServer(StringabiList,StringsocketName,ZygoteServerzygoteServer){//...//1intpid;pid=Zygote.forkSystemServer.parsedArgSystemServer(parsedArgSystemServer)uid,parsedArgs.gid,parsedArgs.gids,parsedArgs.runtimeFlags,null,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);/*Forchildprocess*/if(pid==0){//2zygoteServer.closeServerSocket();//3returnhandleSystemServerProcess(parsedArgs);}returntrue;}/***完成新派生系统服务器进程的剩余工作。*/privatestaticRunnablehandleSystemServerProcess(ZygoteConnection.ArgumentsparsedArgs){//.../**将剩余参数传递给SystemServer。*/ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion,parsedArgs.remaining});publicstaticfinalRunnablezygoteInit(inttargetSdkVersion,String[]argv,ClassLoaderclassLoader){//...//4RuntimeInit.commonInit();//5ZygoteInit.nativeZygoteInit();//6returnRuntimeInit.applicationInit(targetSdkVersion,argv,classLoader);}startSystemServer方法:1、调用forkSystemServer方法创建一个子进程——SystemServer进程2、fork之后,这里判断fork的返回值pid是否等于0,如果是等于0,表示分叉成功。它在SystemServer进程中。然后关闭Zygote进程fork带来的Socket对象。3.然后调用handleSystemServerProcess方法,最后进入zygoteInit,对新进程做一些初始化工作。在zygoteInit方法中:4.commonInit方法是为进程做一些常用的初始化工作,比如设置时区、重置日志配置等。5、nativeZygoteInit方法会通过JNI去到native层。主要工作是创建一个新的Binder线程池,以便SystemServer可以与主要的app进程通信。6、applicationInit方法最终会走到findStaticMain方法,通过反射调用SystemServer类的main方法,简单贴上代码:protectedstaticRunnablefindStaticMain(StringclassName,String[]argv,ClassLoaderclassLoader){Class>cl;try{cl=Class.forName(className,true,classLoader);}//...Methodm;try{m=cl.getMethod("main",newClass[]{String[].class});}//...returnnewMethodAndArgsCaller(m,argv);}工作的SystemServer进程被创建,一些初始化工作已经完成,接下来是main方法。顾名思义,主体工作必须开始。publicstaticvoidmain(String[]args){newSystemServer().run();}privatevoidrun(){try{//...//1android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);Looper.prepareMainLooper();Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS,SLOW_DELIVERY_THRESHOLD_MS);//2System.loadLibrary("android_servers");//3performPendingShutdown();//4createSystemContext();//5mSystemServiceManager=newSystemServiceManager(mSystemContext);mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime,mRuntimeStartUptime);LocalServices.addService(SystemServiceManager.class,mSystemServiceManager);//准备可以并行化的初始化任务的线程池SystemServerInitThreadPool.get();}finally{traceEnd();}//。..//Startservices.try{//6startBootstrapServices();//7startCoreServices();//8startOtherServices();SystemServerInitThreadPool.shutdown();}//...//Loopforever.Looper.loop();thrownewRuntimeException("Mainthreadloopunexpectedlyexited");}1.准备主线程,Looper2.加载动态库。3、检测上次关机过程是否失败。4.初始化系统上下文。privatevoidcreateSystemContext(){ActivityThreadactivityThread=ActivityThread.systemMain();mSystemContext=activityThread.getSystemContext();mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);finalContextsystemUiContext=activityThread.getSystemUiContext();systemUiContext.setTheme(DEFAULT_SYSTEM);}_TActivityThread类获取上下文并设置一些系统主题。5、创建SystemServiceManager,用于后续创建系统服务管理。run方法最后的工作就是启动三类服务,这也是我们关注的重点,分别是引导服务、核心服务和其他服务。这些服务有100多种,关系到整个Android应用生态系统。让我们在下面详细讨论它们。6.启动bootstrap服务privatevoidstartBootstrapServices(){//安装APK服务traceBeginAndSlog("StartInstaller");Installerinstaller=mSystemServiceManager.startService(Installer.class);traceEnd();//AMS负责四大组件的启动调度mActivityManagerService=mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);traceEnd();//管理显示背光LED等服务traceBeginAndSlog("StartLightsService");mSystemServiceManager.startService(LightsService.class);traceEnd();//PMS,负责APK的安装、分析和卸载);mFirstBoot=mPackageManagerService.isFirstBoot();mPackageManager=mSystemContext.getPackageManager();traceEnd();//...}在启动服务中,有几个我们比较熟悉的,比如AMS和PMS。7.启动核心服务privatevoidstartCoreServices(){traceBeginAndSlog("StartBatteryService");//管理电池相关服务mSystemServiceManager.startService(BatteryService.class);traceEnd();//收集用户使用时间servicetraceBeginAndSlog("StartUsageService");mSystemServiceManager.startService(UsageStatsService.class);mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));traceEnd();//Webview更新服务if(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)){traceBeginAndSlog("ServiceStartWebView;Update")mWebViewUpdateService=mSystemServiceManager.startService(WebViewUpdateService.class);traceEnd();}//...}8.启动其他服务privatevoidstartOtherServices(){//...//电话管理服务traceBeginAndSlog("StartTelephonyRegistry");telephonyRegistry=newTelephonyRegistry(context);ServiceManager.addService("telephony.registry",telephonyRegistry);traceEnd();//WMS,窗口管理服务,是al所以更复杂的traceBeginAndSlog("StartWindowManager服务”);ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart,START_SENSOR_SERVICE);mSensorServiceStart=null;wm=WindowManagerService.main(context,inputManager,mFactoryTestMode!=FactoryTest.FACTORY_TEST_LOW_LEVEL,!mFirstBootService,mOnlyCore,newPheroneW(text)WINDOW_/*SERVICE,wlatedIlated=*/false,DUMP_FLAG_PRIORITY_CRITICAL|DUMP_FLAG_PROTO);ServiceManager.addService(Context.INPUT_SERVICE,inputManager,/*allowIsolated=*/false,DUMP_FLAG_PRIORITY_CRITICAL);traceEnd()log/"StartInputManager");inputManager.setWindowManagerCallbacks(wm.getInputMonitor());inputManager.start();traceEnd();//...}启动了这么多服务,我们来看看服务是如何启动的:public
