SystemServer – Java进程启动的源头
- SystemServer是系统服务,它是系统启动时调用的程序,由Native层调用并启动;SystemServer启动后创建并初始化其他manager和server。
main()
-
SystemServer中的main()方法只有一条:
public static void main(String[] args) { //表明SystemServer是运行在一个独立的线程中 new SystemServer().run(); }
run()方法
-
设置启动的初始信息:启动时间、关机延迟、系统时间、时区、系统语言、非单项服务、启用安全设置、设置默认值、禁用数据库等等
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); //设置系统时间最早为1970,因为早于这个时间将有很多API无法使用 }
-
进入Systemserver:
-
重新设置时间
-
保持Systemserver始终运行、定义指纹生成、指定用户
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); Build.ensureFingerprintProperty();
-
设置Bundle、堆栈、Binder属性,以保证SystemServer可以正常运行
-
加载本地库
-
-
检测上次shutdown是是否失败,是的话重新启动
performPendingShutdown(); private void performPendingShutdown() { ...; if (shutdownAction != null && shutdownAction.length() > 0) { ...; Runnable runnable = new Runnable() { @Override public void run() { synchronized (this) { ShutdownThread.rebootOrShutdown(null, reboot, reason); } } }; ...; } }
-
创建SystemContext并设置SystemUiContext的主题
createSystemContext(); private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); mSystemContext.setTheme(DEFAULT_SYSTEM_THEME); final Context systemUiContext = activityThread.getSystemUiContext(); systemUiContext.setTheme(DEFAULT_SYSTEM_THEME); }
-
创建并初始化SystemServerManager,把SystemServerManager加入到本地服务
-
start system servicce,这是SystemServer的核心功能
startBootstrapServices(){ //1、启动引导服务,包括看门狗、PackageManager、启动各种初始service等等。 if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) || mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) { //通过PackageManager是否有某个服务模块来判断该模块是否需要被SystemServiceManager启动 traceBeginAndSlog("StartEthernet"); mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS); traceEnd(); } } startCoreServices(){ //2、启动各种核心服务:Battery、Web、Binder、RollbackManager、BugreportManager等 traceBeginAndSlog("StartBinderCallsStatsService"); mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class); //通过指定的服务名称启动服务 traceEnd(); } startOtherServices(); //3、启动一些其他必要的功能模块服务:通信、账户、SystemProviders、输入、windows、蓝牙、网络、位置、媒体等等
-
关闭StrictMode
-
长时间未启动成功处理