SystemServer进程--main函数的执行

android源码学习目录

1.main函数

直接上代码

public static void main(String[] args) {
        new SystemServer().run(); //main函数直接创建类并运行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);  //设置系统当前时间。
            }

            
            String timezoneProperty =  SystemProperties.get("persist.sys.timezone");
            if (timezoneProperty == null || timezoneProperty.isEmpty()) {
                Slog.w(TAG, "Timezone not set; setting to GMT.");
                SystemProperties.set("persist.sys.timezone", "GMT");  //设置关于时间的参数
            }

            //设置系统配置环境,包括语言,国家等
            if (!SystemProperties.get("persist.sys.language").isEmpty()) {
                final String languageTag = Locale.getDefault().toLanguageTag();

                SystemProperties.set("persist.sys.locale", languageTag);
                SystemProperties.set("persist.sys.language", "");
                SystemProperties.set("persist.sys.country", "");
                SystemProperties.set("persist.sys.localevar", "");
            }

        
            .... //这里代码忽略,进行了很多环境的设置,现阶段不用了解


            Looper.prepareMainLooper();   // ① 准备loop主线程

            // Initialize native services.
            System.loadLibrary("android_servers");  // ② 加载系统动态libandroid_servers.so,

            // ③ 创建系统的context
            createSystemContext();

            // ④ Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
        } finally {
            traceEnd();  // InitBeforeStartServices
        }

        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            //⑤  开启系统的各种服务
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }

        ....

        // Loop forever.
        Looper.loop(); // ⑥开始loop循环
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

阅读代码,SystemServer main函数进行了各种参数的设置,并进行了很多重要的工作。

  • 代码1处:准备了SystemServer线程的loop,这处很重要,他是Android运行的重要组件。
  • 代码2处:加载C++的动态库。
  • 代码3处:出现systemserver的context,这个context就是全局的上下文,它会对传入各种服务,下面会详细介绍
  • 代码4处:创建了SystemServiceManager类对象,并进行了设置,它会启动Android中的各种服务。
  • 代码5处:这里开启启动Android中的各种服务,后面会详细介绍
  • 代码6处:开启loop循环,
    开启loop循环后,SystemServer进程一直运行,保证后程序的正常运行,当然loop还有很多别的使用,这里不介绍,后一条代码抛出异常,就是loop循环停止的话,Android整个系统将无法运行,所以抛出异常。

2.启动服务

SystemServer进程中启动服务是关键的一部,Android中的各种服务是Android得以运行的基础。SystemServer对系统的服务的启动是使用SystemServiceManager来进行的,每个服务的启动过程都差不多。

startBootstrapServices();
startCoreServices();
startOtherServices();
  • startBootstrapServices()中启动了ActivityManagerService、PowerManagerSrevice、PackageManagerService等服务。
  • startCoreServices启动了DropBoxManagerService、BatteryService、UsageStatsService等。
  • startOtherServices启动了CameraService、AlarmManagerService等。
    Android系统的服务多打100多种,这里只介绍了比较重要的服务。

2.1 服务列表

部分服务名和功能

引导服务 功能
Installer 系统安装APK的一个服务类,启动完Installer才能启动其他系统服务
ActivityManagerService 负责四大组件的启动,切换和调度
PowerManagerService 负责系统关于power的计算,然后决策系统如何反应
LightsService 管理和显示背光LED
DisplayService 用来管理所有显示设备
UserManagerService 多用户模式管理
SensorService 为系统提供的各种感应器服务
PackageManagerService 用来对于apk安装,解析,删除,卸载等操作
核心服务 功能
DropBoxManagerService 用于生成和管理系统运行时的一些日志文件
BatteryService 管理电池相关的服务
UsageService 收集用户使用每个App的频率和时长
WebViewUpdateService WebView更新服务
其他服务 功能
CameraService 摄像头相关服务
AlarmManagerService 全局定时器管理服务
InputManagerService 管理输入事件
WindowManagerService 窗口管理服务
VrManagerService VR模式管理服务
BluetoothService 蓝牙管理服务
NotificationManagerService 通知管理服务
DeviceStorageMonitorService 存储相关服务
LocationManagerService 定位管理服务
AudioService 音频管理服务

2.2 服务的启动

各种服务的启动后续会详细介绍,这里介绍一下代码较少,便于理解的PowerManagerService。

// startBootstrapServices()函数中的代码。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

//framework/base/services/core/java/com/android/server/SystemServiceManager.java
public  T startService(Class serviceClass) {
        try {
            .....

            final T service;
            try {
                //更具反射找到参数为Context的构造方法
                Constructor constructor = serviceClass.getConstructor(Context.class);
                //通过反射更具找到的构造方法,初始化类对象,这里我们知道这个对象为PowerManagerService
                service = constructor.newInstance(mContext);
            } catch (InstantiationException ex) {
              .......
            }
            //执行StartService函数
            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

   public void startService(@NonNull final SystemService service) {
        // 将服务注册到管理列表
        mServices.add(service);
        // 启动服务
        try {
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        } 
    }

这里的代码是SystemServiceManager里的代码,它启动了这个服务,可以看到SystemServiceManager利用反射找到PowerManagerService的构造方法,进行初始化对象,并注册保存了这个对象,在service.OnStart()启动了了自己。

2.3 其他启动方式

2.2是绝大多数服务的启动方式,但也有不同的启动方式,eg:PackageManagerService

// startBootstrapServices函数中代码
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
//PackageManagerService main函数
public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
        // Self-check for initial settings.
        PackageManagerServiceCompilerMapping.checkProperties();
        //创建PackagemanagerService
        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        m.enableSystemUserPackages();
        //添加服务到服务列表
        ServiceManager.addService("package", m);
        return m;
    }

这是服务的另一种启动方式,它直接执行了服务的main函数。

3. SystemServiceManager、ServiceManager 、 LocalServices

  • SystemServiceManager:上面已经介绍过,它进行了服务的启动,并将服务保存为一个列表。
  • ServiceManager:这个也是服务保存的列表,但它保存了一个map
    private static HashMap sCache = new HashMap();
    
    他是提共不同进程间获取服务的列表,通过它我们可以获取各个服务的IBinder在不同进程进行通信。
  • LocalServices: 这个通ServiceManager功能类似,但是他是负责进程内通信的,google页介绍这个类以后可能合并到SystemServiceManager, 因为SystemServiceManager页保存一个这儿样的列表,

4.后记

这里没有进行解析服务自己启动时要作什么,只介绍了服务是怎样启动的,后续对重要的服务会进行详细的介绍。

你可能感兴趣的:(SystemServer进程--main函数的执行)