美文网首页
Android Framework—SystemServer进程

Android Framework—SystemServer进程

作者: Peakmain | 来源:发表于2021-03-21 03:02 被阅读0次

    zygote进程启动过程

    zygote启动过程中提到

        private static boolean startSystemServer(String abiList, String socketName)
                throws MethodAndArgsCaller, RuntimeException {
           //1、设置启动参数,进程和进程组为1000,进程名为system_server,启动名字为"com.android.server.SystemServer"
            String args[] = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "com.android.server.SystemServer",
            };
            ZygoteConnection.Arguments parsedArgs = null;
    
            int pid;
            try {
               //2、参数封装成Arguments对象
                parsedArgs = new ZygoteConnection.Arguments(args);
                ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
                ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
    
                //3、创建一个子进程
                pid = Zygote.forkSystemServer(
                        parsedArgs.uid, parsedArgs.gid,
                        parsedArgs.gids,
                        parsedArgs.debugFlags,
                        null,
                        parsedArgs.permittedCapabilities,
                        parsedArgs.effectiveCapabilities);
            } catch (IllegalArgumentException ex) {
                throw new RuntimeException(ex);
            }
            if (pid == 0) {
                if (hasSecondZygote(abiList)) {
                    waitForSecondaryZygote(socketName);
                }
                 //4、启动SystemServer进程
                handleSystemServerProcess(parsedArgs);
            }
            return true;
        }
    

    handleSystemServerProcess源码分析

        private static void handleSystemServerProcess(
                ZygoteConnection.Arguments parsedArgs)
                throws ZygoteInit.MethodAndArgsCaller {
            //关闭zygote进程的socket
            closeServerSocket();
            if (parsedArgs.invokeWith != null) {
            } else {
                ClassLoader cl = null;
                if (systemServerClasspath != null) {
                    cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
                    Thread.currentThread().setContextClassLoader(cl);
                }
              //调用RuntimeInit的zygoteInit方法
                RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
            }
        }
    public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote");
    
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit");
            redirectLogStreams();
    
            commonInit();
            nativeZygoteInit();
            applicationInit(targetSdkVersion, argv, classLoader);
        }
        private static final native void nativeZygoteInit();
    

    找到AndroidRuntime对应的JNI文件

    static JNINativeMethod gMethods[] = {
        { "nativeFinishInit", "()V",
            (void*) com_android_internal_os_RuntimeInit_nativeFinishInit },
        { "nativeZygoteInit", "()V",
            (void*) com_android_internal_os_RuntimeInit_nativeZygoteInit },
        { "nativeSetExitWithoutCleanup", "(Z)V",
            (void*) com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup },
    };
    static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
    {
        gCurRuntime->onZygoteInit();
    }
    

    gCurRuntime实际是AndroidRuntime,如果大家看了上一篇文章我们知道AndroidRuntime是在 /frameworks/base/cmds/app_process/app_main.cpp的中定义的
    所以我们来看app_main.cpp中的onZygoteInit

        virtual void onZygoteInit()
        {
            sp<ProcessState> proc = ProcessState::self();
            ALOGV("App process: starting thread pool.\n");
            proc->startThreadPool();
        }
    

    startThreadPool源码分析

    void ProcessState::startThreadPool()
    {
       AutoMutex _l(mLock);
       if (!mThreadPoolStarted) {
           mThreadPoolStarted = true;
           spawnPooledThread(true);
       }
    }
    void ProcessState::spawnPooledThread(bool isMain)
    {
       if (mThreadPoolStarted) {
           String8 name = makeBinderThreadName();
           ALOGV("Spawning new pooled thread, name=%s\n", name.string());
           sp<Thread> t = new PoolThread(isMain);
           t->run(name.string());
       }
    }
    

    实际是创建了一个线程,并调用run方法,实际调用的是threadLoop方法

    class PoolThread : public Thread
    {
    public:
        PoolThread(bool isMain)
            : mIsMain(isMain)
        {
        }
        
    protected:
        virtual bool threadLoop()
        {
            IPCThreadState::self()->joinThreadPool(mIsMain);
            return false;
        }
        const bool mIsMain;
    };
    void IPCThreadState::joinThreadPool(bool isMain)
    {
        status_t result;
         //isMain 为true则值是BC_ENTER_LOOPER 代表是binder线程,不会退出
           //false则值是BC_REGISTER_LOOPER代表binder驱动创建的线程
         mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
        do {
             //清楚队列引用
            processPendingDerefs();
            // now get the next command to be processed, waiting if necessary
            result = getAndExecuteCommand();
    
            // Let this thread exit the thread pool if it is no longer
            // needed and it is not the main process thread.
            if(result == TIMED_OUT && !isMain) {
                break;
            }
        } while (result != -ECONNREFUSED && result != -EBADF);
         //线程退出循环
        mOut.writeInt32(BC_EXIT_LOOPER);
        talkWithDriver(false);
    }
    

    这里的isMain为true,也就是说当前线程为binder线程池

    nativeZygoteInit();实际就是启动binder线程池

    回到RuntimeInit的applicationInit源码

        public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote");
    
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit");
            redirectLogStreams();
    
            commonInit();
            nativeZygoteInit();
            applicationInit(targetSdkVersion, argv, classLoader);
        }
        private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
            invokeStaticMain(args.startClass, args.startArgs, classLoader);
        }
      private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
            Class<?> cl;
    
            try {
                  //classname实际是com.android.server.SystemServer
                cl = Class.forName(className, true, classLoader);
            } catch (ClassNotFoundException ex) {
                throw new RuntimeException(
                        "Missing class when invoking static main " + className,
                        ex);
            }
    
            Method m;
            try {
               //com.android.server.SystemServer的main方法
                m = cl.getMethod("main", new Class[] { String[].class });
            } catch (NoSuchMethodException ex) {
                throw new RuntimeException(
                        "Missing static main on " + className, ex);
            } catch (SecurityException ex) {
                throw new RuntimeException(
                        "Problem getting static main on " + className, ex);
            }
    
            int modifiers = m.getModifiers();
            if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
                throw new RuntimeException(
                        "Main method is not public and static on " + className);
            }
               //实际是会走到ZygoteInit.main()方法
            throw new ZygoteInit.MethodAndArgsCaller(m, argv);
        }
    

    ZygoteInit.main()

        public static void main(String argv[]) {
            try {
             ...........
            } catch (MethodAndArgsCaller caller) {
                caller.run();
            } catch (RuntimeException ex) {
     ...........
            }
        }
        public static class MethodAndArgsCaller extends Exception
                implements Runnable {
            /** method to call */
            private final Method mMethod;
    
            /** argument array */
            private final String[] mArgs;
    
            public MethodAndArgsCaller(Method method, String[] args) {
                mMethod = method;
                mArgs = args;
            }
    
            public void run() {
                try {
                         //method实际时候SystemServer的main方法
                    mMethod.invoke(null, new Object[] { mArgs });
                } catch (IllegalAccessException ex) {
                  
                }
            }
        }
    

    实际最终走到的是SystemServer.main方法

        public static void main(String[] args) {
            new SystemServer().run();
        }
        private void run() {
          //主线程Looper
            Looper.prepareMainLooper();
    
            // Initialize native services.
            System.loadLibrary("android_servers");
    
               //创建系统上下文
            createSystemContext();
    
            // 创建系统服务管理.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    
            // Start services.
            try {
                //引导服务
                startBootstrapServices();
                //核心服务
                startCoreServices();
               //其他服务
                startOtherServices();
            } catch (Throwable ex) {
                Slog.e("System", "******************************************");
                Slog.e("System", "************ Failure starting system services", ex);
                throw ex;
            }
            Looper.loop();
            throw new RuntimeException("Main thread loop unexpectedly exited");
        }
        private void createSystemContext() {
                //创建ActivityThread
            ActivityThread activityThread = ActivityThread.systemMain();
            mSystemContext = activityThread.getSystemContext();
            mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
        }
     private void startBootstrapServices() {
            Installer installer = mSystemServiceManager.startService(Installer.class);
    
            // 创建ActivityManagerService.
            mActivityManagerService = mSystemServiceManager.startService(
                    ActivityManagerService.Lifecycle.class).getService();
            mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
            mActivityManagerService.setInstaller(installer);
                 //创建mPowerManagerService 
            mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
            mActivityManagerService.initPowerManagement();
              //mPackageManagerService 
            mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
            mFirstBoot = mPackageManagerService.isFirstBoot();
            mPackageManager = mSystemContext.getPackageManager();
    
            //添加服务
            ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());
    
         
            mActivityManagerService.setSystemProcess();
    
            // The sensor service needs access to package manager service, app ops
            // service, and permissions service, therefore we start it after them.
            startSensorService();
        }
        private void startCoreServices() {
            // Tracks the battery level.  Requires LightService.
            mSystemServiceManager.startService(BatteryService.class);
    
       
            mSystemServiceManager.startService(UsageStatsService.class);
            mActivityManagerService.setUsageStatsManager(
                    LocalServices.getService(UsageStatsManagerInternal.class));
            // Update after UsageStatsService is available, needed before performBootDexOpt.
            mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();
    
            // Tracks whether the updatable WebView is in a ready state and watches for update installs.
            mSystemServiceManager.startService(WebViewUpdateService.class);
        }
    
    • startBootstrapServices用SystemServerManager启动了ActivityManagerService、PowerManagerService、PowerManagerService等服务
    • startCoreServices启动了BatteryService、UsageStatsService和WebViewUpdateService
    • startOtherServices启动了CameraService、AlarmManagerService等服务

    ActivityManagerServer setSystemProcess
    ActivityManagerServer的作用负责四大组件的启动,切换,调度等

     public void setSystemProcess() {
            try {
                    //实际是向ServiceManager注册服务
                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));
              
        }
    

    系统服务会注册到ServiceManager,也就是说ServiceManager管理各种系统服务,用于binder通信,Client如果需要使用某个服务,则需要到ServiceManager查询Service的相关信息,然后根据Service的相关信息与Service所在的server进程建立通信
    总结

    • SystemServer 进程是由 Zygote 进程 fork 创建的
    • SystemServer会启动binder线程池,与其他线程建立通信
    • 启动引导服务、核心服务和其他服务
    image.png

    相关文章

      网友评论

          本文标题:Android Framework—SystemServer进程

          本文链接:https://www.haomeiwen.com/subject/nwivcltx.html