SystemServer分析

本文详细解析了Android系统中SystemServer的启动流程及其所启动的各项服务。SystemServer负责创建ActivityThread,初始化主线程,调整虚拟机堆内存,并通过startBootstrapServices、startCoreServices和startOtherServices方法启动包括ActivityManagerService、PowerManagerService在内的众多核心服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### Android Framework SystemServer 源码解析与架构分析 #### 1. Zygote 进程启动过程 Zygote 是 Android 系统中的第一个 Java 进程,负责孵化其他应用程序进程。`RuntimeInit.applicationInit()` 方法通过反射机制找到并执行目标类的 `main()` 函数,在此过程中会初始化一些必要的环境变量和配置项[^3]。 ```java protected static Runnable applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) { ... return findStaticMain(args.startClass, args.startArgs, classLoader); } ``` 当参数指定为 "com.android.server.SystemServer" 类时,则表示即将启动的是 SystemServer 进程。 #### 2. SystemServer 的创建流程 SystemServer 被视为整个系统的守护者和服务提供者,它运行在一个独立进程中,并承担着启动核心服务的任务。具体来说: - **加载阶段**:读取系统属性文件;设置线程优先级;注册异常处理器。 - **启动阶段**:依次调用各个组件的服务管理器 (Service Manager),如 ActivityManagerService、PackageManagerService 等来完成初始化工作。 - **等待状态**:一旦所有必需的服务都被成功激活之后,进入无限循环监听来自客户端的消息请求直至设备关闭为止。 #### 3. 关键模块介绍 为了更好地理解 SystemServer 所扮演的角色及其内部运作方式,下面列举几个重要的组成部分: ##### a. Service Manager 作为连接不同服务之间的桥梁,Service Manager 提供了一套标准接口用于发布、查找以及绑定远程对象实例。这使得跨进程通信变得简单而高效。 ##### b. Power Manager & Battery Stats 这两个子系统共同协作以优化电量消耗情况,前者主要关注屏幕亮灭控制逻辑,后者则专注于统计电池使用状况并向用户提供反馈建议。 ##### c. Connectivity Services 涵盖了 Wi-Fi、蓝牙、移动数据等多个方面,确保网络连接稳定可靠的同时也支持多模式切换操作。 ##### d. Content Providers 允许应用程序之间共享数据库记录或其他形式的数据集,从而促进了信息交换的安全性和便捷性。 #### 4. 总结 综上所述,SystemServer 不仅是 Android 平台不可或缺的一部分,而且在整个生态系统内占据着举足轻重的地位。通过对上述知识点的学习可以加深开发者对于底层工作机制的认识程度,进而有助于构建更加健壮的应用程序[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值