首页 > 学院 > 开发设计 > 正文

SystemServer分析

2019-11-09 14:26:17
字体:
来源:转载
供稿:网友

SystemServer

SystemServer1createSystemContext11systemMain12getSystemContext1121createSystemContext2startBootstrapServices21setSystemPRocess3startCoreServices4startOtherServices总结那么大概又那些服务被启动了呢

SystemServer分成两个部分,一部分是由ZygoteInit进程启动,一部分执行SystemServer的main()方法启动

/** * 这个主方法从zygote进程启动. */ public static void main(String[] args) { new SystemServer().run(); }

接下来我们就开始分析SystemServer的run()方法

private void run() { try { ... //对于时间的处理 if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } ... //设置虚拟机库路径 SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary()); // 每个小时进行一次性能统计输出到文件中 if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); mProfilerSnapshotTimer = new Timer(); mProfilerSnapshotTimer.schedule(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server", null); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // Mmmmmm... more memory! VMRuntime.getRuntime().clearGrowthLimit(); // 调整虚拟机堆内存 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); ... //初始化主线程 Looper.prepareMainLooper(); // 装在libandroid_servers.so // 注意在Android中库的名称都是lib+名称+.so System.loadLibrary("android_servers"); ... // 创建ActivityThread并且创建系统的Context赋值给当前类变量mSystemContext createSystemContext();//[1.1] // 创建SystemServiceManager的对象,此对象负责系统Service的启动 mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } // 创建启动所有的java服务 try { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices"); startBootstrapServices();//[1.2] startCoreServices();.//[1.3] startOtherServices();//[1.4] } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } ... // 进入消息处理的循环 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }

1.1createSystemContext()

@(SystemServer.java->createSystemContext())

创建ActivityThread对象和ContextImpl对象

private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain();//[1.1.1]创建ActivityThread对象 mSystemContext = activityThread.getSystemContext();//[1.1.2]创建系统Context对象 mSystemContext.setTheme(DEFAULT_SYSTEM_THEME); }

1.1.1systemMain()

@(ActivityThread.java->systemMain())

创建ActivityThread对象,这个对象主要是负责管理四大组件,applicationThread等等

public static ActivityThread systemMain() { if (!ActivityManager.isHighEndGfx()) { ThreadedRenderer.disable(true); } else { ThreadedRenderer.enableForegroundTrimming(); } ActivityThread thread = new ActivityThread();//创建ActivityThread对象 thread.attach(true); return thread; }

1.1.2getSystemContext()

@(ActivityThread.java->getSystemContext())

public ContextImpl getSystemContext() { synchronized (this) { if (mSystemContext == null) { mSystemContext = ContextImpl.createSystemContext(this);//[1.1.2.1] } return mSystemContext; } }

1.1.1.2.1createSystemContext()

@(ContextImpl.java->createSystemContext())

static ContextImpl createSystemContext(ActivityThread mainThread) { LoadedApk packageInfo = new LoadedApk(mainThread); ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY);//创建ContextImpl对象 context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetrics()); return context; }

1.2startBootstrapServices()

@(SystemServer.java->startBootstrapServices())

在这个方法中启动一些重要的service,这些服务支持system的正常运行,但是又互相依赖,所以放到SystemServer中进行集中初始化,如果自己的服务和这些服务有着密切的关系,要不然就要放到Installer中初始化.

private void startBootstrapServices() { /*通过反射构造对象,并且调用将其添加到SystemServerManager中的ArrayList<SystemService>mServices中 并且调用对应的service.onStart()方法,因为所以service继承SystemService,其中需要实现onStart()方法*/ Installer installer = mSystemServiceManager.startService(Installer.class); // 对AMS进行设置 mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); // 电源管理服务,由于其他服务可能今早的需要电源的管理,所以电源管理服务在比较前面的位置 mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); //...其他服务同理 // Only run "core" apps if we're encrypting the device. String cryptState = SystemProperties.get("vold.decrypt"); ... //添加PMS服务并且运行 mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); ... //运行UMS traceBeginAndSlog("StartUserManagerService"); mSystemServiceManager.startService(UserManagerService.LifeCycle.class); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); //用于缓存应用包资源 AttributeCache.init(mSystemContext); mActivityManagerService.setSystemProcess();//[1.2.1] startSensorService(); }

1.2.1setSystemProcess()

@(ActivityManagerService.java->setSystemProcess())

添加一些Service,ServiceManager.addService的原理在深入理解Android:卷2中仔细说明,目前本人未能彻底搞清楚Binder,所以在这里,只是指导将服务添加到native层就好.

public void setSystemProcess() { try { ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); ServiceManager.addService("meminfo", new MemBinder(this)); ServiceManager.addService("gfxinfo", new GraphicsBinder(this)); ServiceManager.addService("dbinfo", new DbBinder(this)); if (MONITOR_CPU_USAGE) { ServiceManager.addService("cpuinfo", new CpuBinder(this)); } ServiceManager.addService("permission", new PermissionController(this)); ServiceManager.addService("processinfo", new ProcessInfoService(this)); ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY); mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); synchronized (this) { ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0); app.persistent = true; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); synchronized (mPidsSelfLocked) { mPidsSelfLocked.put(app.pid, app); } updateLruProcessLocked(app, false, null); updateOomAdjLocked(); } } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( "Unable to find android system package", e); } }

1.3startCoreServices()

@(SystemServer.java->startCoreServices())

启动一些核心服务

private void startCoreServices() { // 启动电源管理服务 mSystemServiceManager.startService(BatteryService.class); // 跟踪应用程序使用情况统计信息。 mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); //开启WebView更新服务 mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class); }

1.4startOtherServices()

@(SystemServer.java->startOtherServices())

添加各式各样的服务之后调用systemReady来启动

private void startOtherServices() { ... contentService = ContentService.main(context, mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL); mActivityManagerService.installSystemProviders(); vibrator = new VibratorService(context); ServiceManager.addService("vibrator", vibrator); consumerIr = new ConsumerIrService(context); ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); mAlarmManagerService = mSystemServiceManager.startService(AlarmManagerService.class); alarm = IAlarmManager.Stub.asInterface( ServiceManager.getService(Context.ALARM_SERVICE)); final Watchdog watchdog = Watchdog.getInstance(); watchdog.init(context, mActivityManagerService); ... mActivityManagerService.systemReady(new Runnable() { @Override public void run() { Slog.i(TAG, "Making services ready"); mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseActivityManagerReady"); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartObservingNativeCrashes"); try { mActivityManagerService.startObservingNativeCrashes(); } catch (Throwable e) { reportWtf("observing native crashes", e); } ... } });}

总结:

原来SystemServer开启了那么多系统的服务并且启动 - ActivityThread也是在此时创建的 - 主线程的Loop也是在这里创建的 - ContextImpl也是在这里创建的 - 创建你Application对象,并且调用对应的onCreate()方法

那么大概又那些服务被启动了呢?

EntropyService:熵(shang)服务,用于产生随机数 PowerManagerService:电源管理服务 ActivityManage搜索rService:最核心服务之一,Activity管理服务 TelephonyRegistry:电话服务,电话底层通知服务 PackageManagerService:程序包管理服务 AccountManagerService:联系人帐户管理服务 ContentService:内容提供器的服务,提供跨进程数据交换 LightsService:光感应传感器服务 BatteryService:电池服务,当电量不足时发广播 VibratorService:震动器服务 AlarmManagerService:闹钟服务 WindowManagerService:窗口管理服务 BluetoothService:蓝牙服务 InputMethodManagerService:输入法服务,打开关闭输入法 accessibilityManagerService:辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服务 DevicePolicyManagerService:提供一些系统级别的设置及属性 StatusBarManagerService:状态栏管理服务 ClipboardService:粘贴板服务 NetworkManagementService:手机网络管理服务 TextServicesManagerService: NetworkStatsService:手机网络状态服务 NetworkPolicyManagerService: WifiP2pService:Wifi点对点直联服务 WifiService:WIFI服务 ConnectivityService:网络连接状态服务 ThrottleService:modem节流阀控制服务 MountService:磁盘加载服务,通常也mountd和vold服务结合 NotificationManagerService:通知管理服务,通常和StatusBarManagerService DeviceStorageMonitorService:存储设备容量监听服务 LocationManagerService:位置管理服务 CountryDetectorService:检查当前用户所在的国家 SearchManagerService:搜索管理服务 DropBoxManagerService:系统日志文件管理服务(大部分程序错误信息) WallpaperManagerService:壁纸管理服务 AudioService:AudioFlinger上层的封装的音量控制管理服务 UsbService:USB Host和device管理服务 UiModeManagerService:UI模式管理服务,监听车载、座机等场合下UI的变化 BackupManagerService:备份服务 AppWidgetService:应用桌面部件服务 RecognitionManagerService:身份识别服务 DiskStatsService:磁盘统计服务 SamplingProfilerService:性能统计服务 NetworkTimeUpdateService:网络时间更新服务


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表