Android SystemServer启动流程详解(基于sdk版本6.0.1)

本文基于Android系统版本6.0.1,由于系统重构与4.4.4启动过程存在差异。

Java类的入口是main()方法,SystemServer的main()方法代码如下:

new SystemServer().run();

由此开始,以SystemServer的run()作为系统启动方法,接下来我们来看run()方法做了哪些事情。

private void run() {
        //修复时间,避免系统时间呈现负数
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            Slog.w(TAG, "System clock is before 1970; setting to 1970.");
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }

       //如果系统中设置了系统语言,则设置到persist.sys.locale中
        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", "");
        }

        // 记录android系统服务开始启动,并记录启动时间
        Slog.i(TAG, "Entered the Android system server!");
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());

        //防止runtime被删除,例如系统ota升级,设置虚拟机属性以同步,防止lib库找不到
        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);
        }

        // 虚拟机释放更多的内存
        VMRuntime.getRuntime().clearGrowthLimit();

        //为了保证SystemServer一直运行和虚拟机高效流畅的运行,将内存堆可使用设置为80%。
        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

        //向设备系统属性中写入当前设备的指纹信息
        Build.ensureFingerprintProperty();

        //在系统服务中,操作环境路径必须要有一个系统账户
        Environment.setUserRequired(true);

        //确保进入系统调用binder通信的时候,是以前台的优先级来运行
        BinderInternal.disableBackgroundScheduling(true);

        //准备主循环线程
        android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
        android.os.Process.setCanSelfBackground(false);
        Looper.prepareMainLooper();

        //初始化系统本地c++ so库
        System.loadLibrary("android_servers");

        //检查上次关闭的状态,控制电源管理和手机振动传感器
        performPendingShutdown();

        // 初始化系统上下文对象,在其中初始化了ActivityThread对象,并判断是否使用硬件加速器
        createSystemContext();

        // 创建系统服务管理器,并添加到本地服务(只在相同进程中使用,没有binder接口对象)中
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

        // 开始各种服务
        try {
	        //开始启动服务,包含Installer程序安装服务,ActivityManagerService服务,PowerManagerService管理服务,LightsService屏幕亮度管理服务,DisplayManagerService显示管理服务,PackageManager管理器,UserManagerService用户管理服务,开启各种传感器服务(调用C层开启),初始化缓存资源
            startBootstrapServices();
            //开启内核服务,包含BatteryService电量服务,UsageStatsService应用使用状态监测服务,WebViewUpdateService网页控件更新服务,初始化应用使用状态
            startCoreServices();
            //开启其他服务,包含AccountManagerService账户管理服务,VibratorService震动服务,IAlarmManager闹钟服务,IMountService挂载服务,NetworkManagementService网络管理服务,CameraService相机服务,AudioService音频服务,WindowManagerService窗口管理服务,InputManagerService输入管理服务...等
            startOtherServices();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        }

        // 调试模式时,将日志挂起用于分析
        if (StrictMode.conditionallyEnableDebugLogging()) {
            Slog.i(TAG, "Enabled StrictMode for system server main thread.");
        }

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

上述就是Android 6.0.1SystemServer启动所做的事情,如果有什么不对的,希望大家能指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值