SystemServer 源码分析,android高级面试题库

    traceBeginAndSlog("StartSidekickService");

    // Package manager isn't started yet; need to use SysProp not hardware feature

    if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {

        mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);

    }

    traceEnd();



    // Display manager is needed to provide display metrics before package manager

    // starts up.

    traceBeginAndSlog("StartDisplayManager");

    mDisplayManagerService = mSystemServiceManager.startService(LightsService.class);

    traceEnd();



    // We need the default display before we can initialize the package manager.

    traceBeginAndSlog("WaitForDisplay");

    mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

    traceEnd();



    // Only run "core" apps if we're encrypting the device.

    String cryptState = SystemProperties.get("vold.decrypt");

    if (ENCRYPTING_STATE.equals(cryptState)) {

        Slog.w(TAG, "Detected encryption in progress - only parsing core apps");

        mOnlyCore = true;

    } else if (ENCRYPTED_STATE.equals(cryptState)) {

        Slog.w(TAG, "Device encrypted - only parsing core apps");

        mOnlyCore = true;

    }



    // 启动 PackageManagerService

    if (!mRuntimeRestart) {

        MetricsLogger.histogram(null, "boot_package_manager_init_start",

                (int) SystemClock.elapsedRealtime());

    }

    traceBeginAndSlog("StartPackageManagerService");

    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,

            mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);

    mFirstBoot = mPackageManagerService.isFirstBoot();

    mPackageManager = mSystemContext.getPackageManager();

    traceEnd();

    if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {

        MetricsLogger.histogram(null, "boot_package_manager_init_ready",

                (int) SystemClock.elapsedRealtime());

    }

    // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename

    // A/B artifacts after boot, before anything else might touch/need them.

    // Note: this isn't needed during decryption (we don't have /data anyways).

    if (!mOnlyCore) {

        boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",

                false);

        if (!disableOtaDexopt) {

            traceBeginAndSlog("StartOtaDexOptService");

            try {

                OtaDexoptService.main(mSystemContext, mPackageManagerService);

            } catch (Throwable e) {

                reportWtf("starting OtaDexOptService", e);

            } finally {

                traceEnd();

            }

        }

    }

    //启动多用户    UserManagerService

    traceBeginAndSlog("StartUserManagerService");

    mSystemServiceManager.startService(UserManagerService.LifeCycle.class);

    traceEnd();



    // 初始化属性缓存

    traceBeginAndSlog("InitAttributerCache");

    AttributeCache.init(mSystemContext);

    traceEnd();



    // Set up the Application instance for the system process and get started.

    traceBeginAndSlog("SetSystemProcess");

    mActivityManagerService.setSystemProcess();

    traceEnd();



    // DisplayManagerService needs to setup android.display scheduling related policies

    // since setSystemProcess() would have overridden policies due to setProcessGroup

    mDisplayManagerService.setupSchedulerPolicies();



    /// M: CTA requirement - permission control  @{

    /*

     * M: MOTA for CTA permissions handling

     * This function is used for granting CTA permissions after OTA upgrade.

     * This should be placed after AMS is added to ServiceManager and before

     * starting other services since granting permissions needs AMS instance

     * to do permission checking.

     */

    mPackageManagerService.onAmsAddedtoServiceMgr();

    /// @}



    //  启动 OverlayManagerService

    traceBeginAndSlog("StartOverlayManagerService");

    mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));

    traceEnd();



    // The sensor service needs access to package manager service, app ops

    // service, and permissions service, therefore we start it after them.

    // Start sensor service in a separate thread. Completion should be checked

    // before using it.

    mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {

        TimingsTraceLog traceLog = new TimingsTraceLog(

                SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);

        traceLog.traceBegin(START_SENSOR_SERVICE);

        startSensorService();

        traceLog.traceEnd();

    }, START_SENSOR_SERVICE);

}



七、SystemServer 的核心服务有哪些

=======================



1.SystemServer 核心服务

-------------------



有 `BatteryService 、UsageStatsService、WebViewUpdateService、BinderCallsStatsService`4种核心服务。



![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6L0tOMUZ1NWR6dzhvUk5pYmRuUFM4dUljU05FcGFUdERIWVdpYnYwVG1oNTlkcXQ0dkVhY09QblYzaWNYTzFsdDNxMTUzYkdXUG93VDNtbXRDNXlSTkg1aEpnLzY0MA?x-oss-process=image/format,png)



SystemServer 4种核心服务



2.startCoreServices 代码

----------------------



/**

 * Starts some essential services that are not tangled up in the bootstrap process.

 */

private void startCoreServices() {

    // 启动 BatteryService 管理电池服务(电压、电量、温度)

    traceBeginAndSlog("StartBatteryService");

    // Tracks the battery level.  Requires LightService.

    mSystemServiceManager.startService(BatteryService.class);

    traceEnd();



    // 启动 UsageStatsService 收集应用持久化数据的服务

    traceBeginAndSlog("StartUsageService");

    mSystemServiceManager.startService(UsageStatsService.class);

    mActivityManagerService.setUsageStatsManager(

            LocalServices.getService(UsageStatsManagerInternal.class));

    traceEnd();



    // 启动 WebViewUpdateService 监视 WebView 是否更新

    if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {

        traceBeginAndSlog("StartWebViewUpdateService");

        mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);

        traceEnd();

    }



    //启动 CPU Binder 调度服务

    traceBeginAndSlog("StartBinderCallsStatsService");

    BinderCallsStatsService.start();

    traceEnd();

}



八、SystemServer 的其他服务有哪些

=======================



1.startOtherServices 启动的服务主要有:

------------------------------



`KeyChainSystemService、TelecomLoaderService、AccountManagerService、ContentService、DropBoxManagerService、VibratorService、AlarmManagerService、Watchdog、 InputManagerService、WindowManagerService、IpConnectivityMetrics、NetworkWatchlistService、PinnerService`等服务。



![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6L0tOMUZ1NWR6dzhvUk5pYmRuUFM4dUljU05FcGFUdERIWWlhRTdTWVR0Z2xQTEowWGhvNkp4amlja0FuU0JoNVpSc3c3Rkg2WDZkRUpSZTFaUm41anhGRzlBLzY0MA?x-oss-process=image/format,png)



SystemServer 的其他服务



2.startOtherServices 代码

-----------------------



/**

 * Starts a miscellaneous grab bag of stuff that has yet to be refactored

 * and organized.

 */

private void startOtherServices() {

        ... ...



        

        traceBeginAndSlog("StartKeyAttestationApplicationIdProviderService");

        ServiceManager.addService("sec_key_att_app_id_provider",

                new KeyAttestationApplicationIdProviderService(context));

        traceEnd();

        // 启动 KeyChainSystemService 

        traceBeginAndSlog("StartKeyChainSystemService");

        mSystemServiceManager.startService(KeyChainSystemService.class);

        traceEnd();



        traceBeginAndSlog("StartSchedulingPolicyService");

        ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());

        traceEnd();

        // 启动 TelecomLoaderService  

        traceBeginAndSlog("StartTelecomLoaderService");

        mSystemServiceManager.startService(TelecomLoaderService.class);

        traceEnd();



        traceBeginAndSlog("StartTelephonyRegistry");

        telephonyRegistry = new TelephonyRegistry(context);

        ServiceManager.addService("telephony.registry", telephonyRegistry);

        traceEnd();



        traceBeginAndSlog("StartEntropyMixer");

        mEntropyMixer = new EntropyMixer(context);

        traceEnd();



        mContentResolver = context.getContentResolver();



        // 启动 用户管理服务 ,必现在StartContentService 之前

        traceBeginAndSlog("StartAccountManagerService");

        mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);

        traceEnd();

        // 启动 ContentService

        traceBeginAndSlog("StartContentService");

        mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);

        traceEnd();

        // 安装系统Provider 例如 SettingProvider CantacttProvider

        traceBeginAndSlog("InstallSystemProviders");

        mActivityManagerService.installSystemProviders();

        // Now that SettingsProvider is ready, reactivate SQLiteCompatibilityWalFlags

        SQLiteCompatibilityWalFlags.reset();

        traceEnd();



        // 启动 DropBoxManagerService  

        // 由于 依赖SettingsProvider,必须在InstallSystemProviders之后启动

        traceBeginAndSlog("StartDropBoxManager");

        mSystemServiceManager.startService(DropBoxManagerService.class);

        traceEnd();

        //启动 VibratorService 震动服务

        traceBeginAndSlog("StartVibratorService");

        vibrator = new VibratorService(context);

        ServiceManager.addService("vibrator", vibrator);

        traceEnd();



        if (!isWatch) {

            traceBeginAndSlog("StartConsumerIrService");

            consumerIr = new ConsumerIrService(context);

            ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);

            traceEnd();

        }

        // 启动 AlarmManagerService

        traceBeginAndSlog("StartAlarmManagerService");

        if(!sMtkSystemServerIns.startMtkAlarmManagerService()){

            mSystemServiceManager.startService(AlarmManagerService.class);

        }

        traceEnd();

        // 初始化 看门狗

        traceBeginAndSlog("InitWatchdog");

        final Watchdog watchdog = Watchdog.getInstance();

        watchdog.init(context, mActivityManagerService);

        traceEnd();

        //启动 InputManagerService

        traceBeginAndSlog("StartInputManagerService");

        inputManager = new InputManagerService(context);

        traceEnd();

        //启动 WindowManagerService

        traceBeginAndSlog("StartWindowManagerService");

        // WMS needs sensor service ready

        ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart, START_SENSOR_SERVICE);

        mSensorServiceStart = null;

        wm = WindowManagerService.main(context, inputManager,

                mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,

                !mFirstBoot, mOnlyCore, new PhoneWindowManager());

        ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,

                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);

        ServiceManager.addService(Context.INPUT_SERVICE, inputManager,

                /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);

        traceEnd();



        traceBeginAndSlog("SetWindowManagerService");

        mActivityManagerService.setWindowManager(wm);

        traceEnd();



        traceBeginAndSlog("WindowManagerServiceOnInitReady");

        wm.onInitReady();

        traceEnd();



        // Start receiving calls from HIDL services. Start in in a separate thread

        // because it need to connect to SensorManager. This have to start

        // after START_SENSOR_SERVICE is done.

        SystemServerInitThreadPool.get().submit(() -> {

            TimingsTraceLog traceLog = new TimingsTraceLog(

                    SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);

            traceLog.traceBegin(START_HIDL_SERVICES);

            startHidlServices();

            traceLog.traceEnd();

        }, START_HIDL_SERVICES);



        if (!isWatch) {

            traceBeginAndSlog("StartVrManagerService");

            mSystemServiceManager.startService(VrManagerService.class);

            traceEnd();

        }



        traceBeginAndSlog("StartInputManager");

        inputManager.setWindowManagerCallbacks(wm.getInputMonitor());

        inputManager.start();

        traceEnd();



        // TODO: Use service dependencies instead.

        traceBeginAndSlog("DisplayManagerWindowManagerAndInputReady");

        mDisplayManagerService.windowManagerAndInputReady();

        traceEnd();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

一起互勉~

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

[外链图片转存中…(img-mQcn5zgA-1712206678114)]

[外链图片转存中…(img-4v6z6DPv-1712206678114)]

一起互勉~

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值