Android系统启动之SystemServer

image.png

目录

第一篇:Android系统启动之bootloader
第二篇:Android系统启动之Init流程(上)
第三篇:Android系统启动之Init流程(下)
第四篇:Android系统启动之init.rc文件解析过程
第五篇:Android系统启动之zyogte进程
第六篇:Android系统启动之zyogte进程java(上)
第七篇:Android系统启动之zyogte进程java(下)
第八篇:Android系统启动之SystemServer

SystemServer

首先看下什么是SystemServer?

SystemServer的进程名实际上叫做“system_server”,通常简称为SS。
是系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。

SystemServer启动

SystemServer是由Zygote启动的.
源码路径frameworks/base/services/java/com/android/server/SystemServer.java

     /**
       * The main entry point from zygote.
       */
      public static void main(String[] args) {
          new SystemServer().run();
      }

这样SystemServer便启动起来了.

run函数

我们来看下run的实现

    private void run() {
        try {
            traceBeginAndSlog("InitBeforeStartServices");
            // If a device's clock is before 1970 (before 0), a lot of
            // APIs crash dealing with negative numbers, notably
            // java.io.File#setLastModified, so instead we fake it and
            // hope that time from cell towers or NTP fixes it shortly.
//---------------------------------------------------------------
//-----------------------1.设定时间-------------------------------
//---------------------------------------------------------------
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }

            //
            // Default the timezone property to GMT if not set.
            //
            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 the system has "persist.sys.language" and friends set, replace them with
            // "persist.sys.locale". Note that the default locale at this point is calculated
            // using the "-Duser.locale" command line flag. That flag is usually populated by
            // AndroidRuntime using the same set of system properties, but only the system_server
            // and system apps are allowed to set them.
            //
            // NOTE: Most changes made here will need an equivalent change to
            // core/jni/AndroidRuntime.cpp
//---------------------------------------------------------------
//-----------------------2.设定语言-------------------------------
//---------------------------------------------------------------
            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", "");
            }

            // The system server should never make non-oneway calls
            Binder.setWarnOnBlocking(true);

            // Here we go!
            Slog.i(TAG, "Entered the Android system server!");
            int uptimeMillis = (int) SystemClock.elapsedRealtime();
            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, uptimeMillis);
            if (!mRuntimeRestart) {
                MetricsLogger.histogram(null, "boot_system_server_init", uptimeMillis);
            }

            // In case the runtime switched since last boot (such as when
            // the old runtime was removed in an OTA), set the system
            // property so that it is in sync. We can | xq oqi't do this in
            // libnativehelper's JniInvocation::Init code where we already
            // had to fallback to a different runtime because it is
            // running as root and we need to be the system user to set
            // the property. http://b/11463182
//---------------------------------------------------------------
//-----------------------3.虚拟机库文件路径  ---------------------
//---------------------------------------------------------------
            SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

            // Enable the sampling profiler.
            //开启性能分析
            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!
//---------------------------------------------------------------
//-----------------------4.清除内存使用上线  ---------------------
//---------------------------------------------------------------
            VMRuntime.getRuntime().clearGrowthLimit();

            // The system server has to run all of the time, so it needs to be
            // as efficient as possible with its memory usage.
            //设定内存使用率
            VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

            // Some devices rely on runtime fingerprint generation, so make sure
            // we've defined it before booting further.
//---------------------------------------------------------------
//-----------------------5.设定指纹使用  ------------------------
//---------------------------------------------------------------
            Build.ensureFingerprintProperty();

            // Within the system server, it is an error to access Environment paths without
            // explicitly specifying a user.
//---------------------------------------------------------------
//-----------------------6.设定环境变量访问用户条件  --------------
//---------------------------------------------------------------
            Environment.setUserRequired(true);

            // Within the system server, any incoming Bundles should be defused
            // to avoid throwing BadParcelableException.
            BaseBundle.setShouldDefuse(true);

            // Ensure binder calls into the system always run at foreground priority.
//---------------------------------------------------------------
//-----------------------7.设定binder服务永远运行在前台  ----------
//---------------------------------------------------------------
            BinderInternal.disableBackgroundScheduling(true);

            // Increase the number of binder threads in system_server
//---------------------------------------------------------------
//-----------------------8.设定线程池最大线程数-------------------
//---------------------------------------------------------------
            BinderInternal.setMaxThreads(sMaxBinderThreads);

            // Prepare the main looper thread (this thread).
            android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
            android.os.Process.setCanSelfBackground(false);
            Looper.prepareMainLooper();

            // Initialize native services.
            System.loadLibrary("android_servers");

            // Check whether we failed to shut down last time we tried.
            // This call may not return.
            performPendingShutdown();

            // Initialize the system 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.
//---------------------------------------------------------------
//-----------------------9.启动各种服务  ------------------------
//---------------------------------------------------------------
        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();
        }

        // For debug builds, log event loop stalls to dropbox for analysis.
//---------------------------------------------------------------
//-----------------------10.debug模式开启log  ------------------
//---------------------------------------------------------------
        if (StrictMode.conditionallyEnableDebugLogging()) {
            Slog.i(TAG, "Enabled StrictMode for system server main thread.");
        }
        if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
            int uptimeMillis = (int) SystemClock.elapsedRealtime();
            MetricsLogger.histogram(null, "boot_system_server_ready", uptimeMillis);
            final int MAX_UPTIME_MILLIS = 60 * 1000;
            if (uptimeMillis > MAX_UPTIME_MILLIS) {
                Slog.wtf(SYSTEM_SERVER_TIMING_TAG,
                        "SystemServer init took too long. uptimeMillis=" + uptimeMillis);
            }
        }

        // Loop forever.
//---------------------------------------------------------------
//-----------------------11.服务开启循环  ------------------
//---------------------------------------------------------------
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

代码中大致分为11个步骤:
1.设定时间
2.设定语言
3.虚拟机库文件路径
4.清除内存使用上线
5.设定指纹使用
6.设定环境变量访问用户条件
7.设定binder服务永远运行在前台
8.设定线程池最大线程数
9.启动各种服务
10.debug模式开启log
11.服务开启循环

启动系统上下文

            // Initialize the system context.
            createSystemContext();

函数实现为base/services/java/com/android/server/SystemServer.java:475:

     private void createSystemContext() {
//---------------------------------------------------------------
//-----------------------1.获取ActivityThread对象  ------------------
//---------------------------------------------------------------
         ActivityThread activityThread = ActivityThread.systemMain();
//---------------------------------------------------------------
//-----------------------2.获取系统上下文  ------------------
//---------------------------------------------------------------
         mSystemContext = activityThread.getSystemContext();
 //---------------------------------------------------------------
//-----------------------3.设定系统主题  ------------------
//---------------------------------------------------------------
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
 
         final Context systemUiContext = activityThread.getSystemUiContext();
         systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
     }

代码中大致分为3个步骤:
1.获取ActivityThread对象
2.获取系统上下文
3.设定系统主题

创建SystemServiceManage

    // Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
     

构造函数实现为base/services/core/java/com/android/server/SystemServiceManager.java

      SystemServiceManager(Context context) {
          mContext = context;
      }

几乎什么也没做.
addService函数实现frameworks/base/core/java/com/android/server/LocalServices.java

      /**
      * Adds a service instance of the specified interface to the global registry of loca    l services.
      */
      public static <T> void addService(Class<T> type, T service) {
          synchronized (sLocalServiceObjects) {
              if (sLocalServiceObjects.containsKey(type)) {
                  throw new IllegalStateException("Overriding service registration");
             }
            sLocalServiceObjects.put(type, service);
         }
     }

参考

Android 内核初识(6)SystemServer进程
Android系统启动——6 SystemServer启动

推荐阅读更多精彩内容