SystemServer分析

SystemServer

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");
    }

小结下run方法中所做的重要的事情都有那些?

  • 设置虚拟机库路径
  • 初始化主线程
  • 调整虚拟机堆内存
  • 创建ActivityThread并且创建系统的ContextImpl赋值给当前类变量mSystemContext
  • 创建SystemServiceManager的对象(此对象负责系统Service的启动)
  • 创建启动所有的java服务
  • 初始化主线程
  • 进入消息处理的循环

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();
    }

小结下startBootstrapServices方法中所做的重要的事情都有那些?
@(如果想写自己的系统服务就在这里进行添加)

  • 创建ActivityManagerService
  • 创建PowerManagerService,并初始化
  • 创建DisplayManagerService,这里注意默认显示的必须在package manager之前初始化.
  • 如果支持身份验证Service则支持身份验证
  • 创建UserManagerService
  • 随后通过AMS.setSystemProcess()添加启动一些一些Binder服务.
  • 开启一些传感器服务

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);
        }
    }

小结下setSystemProcess方法中所做的重要的事情都有那些?
@(如果想写自己的系统服务就在这里进行添加)

  • 向ServiceManager中添加AMS
  • 向ServiceManager中添加ProcessStatsService
  • 向ServiceManager中添加MemBinder
  • 向ServiceManager中添加GraphicsBinder
  • 向ServiceManager中添加DbBinder
  • 向ServiceManager中添加CpuBinder
  • 向ServiceManager中添加ProcessInfoService

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:网络时间更新服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值