zoukankan      html  css  js  c++  java
  • SystemServer启动服务

    一、启动流程

    SystemServer的在Android体系中所处的地位,SystemServer由Zygote fork生成的,进程名为system_server,该进程承载着framework的核心服务。startSystemServer()函数是system_server启动流程的起点, 启动流程图如下:

    system_server_boot_process

    上图前4步骤(即颜色为紫色的流程)运行在是Zygote进程,从第5步(即颜色为蓝色的流程)ZygoteInit.handleSystemServerProcess开始是运行在新创建的system_server,这是fork机制实现的。

    1. startSystemServer

    [–>ZygoteInit.java]

    private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException {
        ...
        //参数准备
        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 {
            //用于解析参数,生成目标格式
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
    
            // fork子进程,该进程是system_server进程
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }
    
        //进入子进程system_server
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }
            // 完成system_server进程剩余的工作 
            handleSystemServerProcess(parsedArgs);
        }
        return true;
    }

    准备参数并fork新进程,从上面可以看出system server进程参数信息为uid=1000,gid=1000,进程名为sytem_server,从zygote进程fork新进程后,需要关闭zygote原有的socket。

    2 forkSystemServer

    [–>Zygote.java]

    public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
        VM_HOOKS.preFork();
        // 调用native方法fork system_server进程
        int pid = nativeForkSystemServer(
                uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
        if (pid == 0) {
            Trace.setTracingEnabled(true);
        }
        VM_HOOKS.postForkCommon();
        return pid;
    }

    3. handleSystemServerProcess

    [–>ZygoteInit.java]

    private static void handleSystemServerProcess( ZygoteConnection.Arguments parsedArgs) throws ZygoteInit.MethodAndArgsCaller {
    
        closeServerSocket(); //关闭父进程zygote复制而来的Socket//system_server故进入此分支
        RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
    }

    4. zygoteInit

    [–>RuntimeInit.java]

    public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller {
    
        nativeZygoteInit(); // zygote初始化 
        applicationInit(targetSdkVersion, argv, classLoader); // 应用初始化
    }

    5. applicationInit

    [–>RuntimeInit.java]

    private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller {//调用startClass的static方法 main() 
        invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }

    此处args.startClass为”com.android.server.SystemServer”。

    6. invokeStaticMain

    [–>RuntimeInit.java]

    private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller {
        Class<?> cl = Class.forName(className, true, classLoader);
        ...
        Method m;
        try {
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            ...
        } catch (SecurityException ex) {
            ...
        }
        int modifiers = m.getModifiers();
        if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
            ...
        }
        //通过抛出异常,回到ZygoteInit.main()。这样做好处是能清空栈帧,提高栈帧利用率。
        throw new ZygoteInit.MethodAndArgsCaller(m, argv);
    }

    7. MethodAndArgsCaller

    [–>ZygoteInit.java]

    public static void main(String argv[]) {
        try {
            startSystemServer(abiList, socketName);//启动system_server
            ....
        } catch (MethodAndArgsCaller caller) {
            caller.run(); 
        } catch (RuntimeException ex) {
            closeServerSocket();
            throw ex;
        }
    }

    invokeStaticMain()方法中抛出的异常MethodAndArgsCaller,从而进入caller.run()方法。

    [–>ZygoteInit.java]

    public static class MethodAndArgsCaller extends Exception implements Runnable {
        public void run() {
            try {
                //根据传递过来的参数,可知此处通过反射机制调用的是SystemServer.main()方法
                mMethod.invoke(null, new Object[] { mArgs });
            } catch (IllegalAccessException ex) {
                throw new RuntimeException(ex);
            } catch (InvocationTargetException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException) cause;
                } else if (cause instanceof Error) {
                    throw (Error) cause;
                }
                throw new RuntimeException(ex);}
        }
    }

    二. SystemServer启动服务

      在RuntimeInit.java中invokeStaticMain方法通过创建并抛出异常ZygoteInit.MethodAndArgsCaller,在ZygoteInit.java中的main()方法会捕捉该异常,并调用caller.run(),再通过反射便会调用到SystemServer.main()方法,该方法主要执行流程:

            SystemServer.main
            SystemServer.run
            createSystemContext
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            Looper.loop();

    1. SystemServer.main

    public final class SystemServer {
        ...
        public static void main(String[] args) {
            //先初始化SystemServer对象,再调用对象的run()方法
            new SystemServer().run();
        }
    }

    2. SystemServer.run

    private void run() {
        //当系统时间比1970年更早,就设置当前系统时间为1970年
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }//加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下
        System.loadLibrary("android_servers");
    
        //检测上次关机过程是否失败,该方法可能不会返回
        performPendingShutdown();
    
        //初始化系统上下文
        createSystemContext();
    
        //创建系统服务管理
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    
        //启动各种系统服务
        try {
            startBootstrapServices(); // 启动引导服务
            startCoreServices();      // 启动核心服务
            startOtherServices();     // 启动其他服务
        } catch (Throwable ex) {
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        }
    //一直循环执行
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    1.3 createSystemContext

    [–>SystemServer.java]

    private void createSystemContext() {
        //创建system_server进程的上下文信息
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        //设置主题
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }

    createSystemContext()过程会创建对象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。

    1.4 startBootstrapServices

    [–>SystemServer.java]

    private void startBootstrapServices() {
        //阻塞等待与installd建立socket通道
        Installer installer = mSystemServiceManager.startService(Installer.class);
    
        //启动服务ActivityManagerService
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
    
        //启动服务PowerManagerService
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    
        //初始化power management
        mActivityManagerService.initPowerManagement();
    
        //启动服务LightsService
        mSystemServiceManager.startService(LightsService.class);
    
        //启动服务DisplayManagerService
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
    
        //Phase100: 在初始化package manager之前,需要默认的显示.
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
    
        //当设备正在加密时,仅运行核心
        String cryptState = SystemProperties.get("vold.decrypt");
        if (ENCRYPTING_STATE.equals(cryptState)) {
            mOnlyCore = true;
        } else if (ENCRYPTED_STATE.equals(cryptState)) {
            mOnlyCore = true;
        }
    
        //启动服务PackageManagerService
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
    
        //启动服务UserManagerService,新建目录/data/user/
        ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());
    
        AttributeCache.init(mSystemContext);
    
        //设置AMS
        mActivityManagerService.setSystemProcess();
    
        //启动传感器服务
        startSensorService();
    }

    该方法所创建的服务:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务.

    1.5 startCoreServices

    private void startCoreServices() {
        //启动服务BatteryService,用于统计电池电量,需要LightService.
        mSystemServiceManager.startService(BatteryService.class);
    
        //启动服务UsageStatsService,用于统计应用使用情况
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));
    
        mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();
    
        //启动服务WebViewUpdateService
        mSystemServiceManager.startService(WebViewUpdateService.class);
    }

    启动服务BatteryService,UsageStatsService,WebViewUpdateService。

    1.6 startOtherServices

       private void startOtherServices() {
            ...
            SystemConfig.getInstance();
            mContentResolver = context.getContentResolver(); // resolver
            ...
            mActivityManagerService.installSystemProviders(); //provider
            mSystemServiceManager.startService(AlarmManagerService.class); // alarm
            // watchdog
            watchdog.init(context, mActivityManagerService); 
            inputManager = new InputManagerService(context); // input
            wm = WindowManagerService.main(...); // window
            inputManager.start();  //启动input
            mDisplayManagerService.windowManagerAndInputReady();
            ...
            mSystemServiceManager.startService(MOUNT_SERVICE_CLASS); // mount
            mPackageManagerService.performBootDexOpt();  // dexopt操作
            ActivityManagerNative.getDefault().showBootMessage(...); //显示启动界面
            ...
            statusBar = new StatusBarManagerService(context, wm); //statusBar
            //dropbox
            ServiceManager.addService(Context.DROPBOX_SERVICE,
                        new DropBoxManagerService(context, new File("/data/system/dropbox")));
             mSystemServiceManager.startService(JobSchedulerService.class); //JobScheduler
             lockSettings.systemReady(); //lockSettings
    
            //phase480 和phase500
            mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
            mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
            ...
            // 准备好window, power, package, display服务
            wm.systemReady();
            mPowerManagerService.systemReady(...);
            mPackageManagerService.systemReady();
            mDisplayManagerService.systemReady(...);
            
            mActivityManagerService.systemReady(new Runnable() {
                public void run() {
                  ...
                }
            });
        }

    SystemServer启动各种服务中最后的一个环节便是AMS.systemReady(),ActivityManagerService启动过程。

    到此, System_server主线程的启动工作完成, 进入Looper.loop()状态,等待其他线程通过handler发送消息到主线再处理.

     
  • 相关阅读:
    Window7下安装openssl完整版(亲测实现)
    Android 使用OkHttp
    Android应用中使用AsyncHttpClient来异步网络数据
    Android开发okhttp,retrofit,android-async-http,volley?
    Android开源框架AsyncHttpClient (android-async-http)使用
    15 个最好的 Bootstrap 设计工具推荐
    Bootstrap+angularjs+MVC3+分页技术+角色权限验证系统
    PKU 1509 Glass Beads (最小表示法)
    SQL Server 数据库没有有效全部者的三种解决的方法
    javascript小白学习指南0---1
  • 原文地址:https://www.cnblogs.com/lufeibin/p/13536054.html
Copyright © 2011-2022 走看看