android中的哪个进程要求ActivityManager广播BOOT_COMPLETED

Posted

技术标签:

【中文标题】android中的哪个进程要求ActivityManager广播BOOT_COMPLETED【英文标题】:Which process in android asks ActivityManager to broadcast BOOT_COMPLETED 【发布时间】:2014-12-06 23:08:09 【问题描述】:

我在网上搜索了这个,没有答案。基本上在测试设备时,我观察到显示屏更早地启动,而在 logcat 中打印 Consoleui:bootComplete 在约 8 秒后跟随。

现在设备屏幕显示为启动 Launcher 应用程序的一部分,因此在自然的事件序列中,系统服务器将要求 activitymanager 在单独的线程中启动启动器并继续做更多的工作。

因此,显示会出现是很自然的,但在 BOOT_COMPLETED 广播可以进行之前,可能仍有一些服务需要由 activitymanager/systemserver 启动。

我必须证明这一点。为了做到这一点,我需要知道哪个进程告诉activitymanager它现在可以广播boot_complete消息,如果它是系统服务器,请告诉我它在哪里执行的代码部分。谢谢。

【问题讨论】:

你到底想达到什么目的? Alex,我想证明,外行说,设备显示屏打开的时间与 logcat 中“启动完成”打印的时间无关, 尝试向他们解释init.rc 引导脚本的工作原理:elinux.org/android_Booting 也许我说我想向外行解释它有点错误,让我们假设一个场景,我是一名开发人员,一名 QA 人员提交了一个错误,即 bootComplete 打印比显示打开,基本上可以说他认为理想情况下应该在 bootComplete 打印出现后显示显示...所以我想使用源代码中的代码 sn-ps 向他展示这两个事件是如何发生的;彼此之间没有紧密联系:) 这里是ActivityManagerService的源代码...你也许可以在那里找到一些东西。我怀疑选择一段特定的源代码会证明很多......无论你试图说服谁,都无法通过几行代码清楚地了解启动过程的工作原理。系统启动过程比较复杂,涉及到系统服务之间的大量交互... 【参考方案1】:

活动管理器服务在ActivityManagerService.java 的第 6320 行发送启动完成意图。

活动管理器服务还使用带有CATEGORY_HOME 的意图在ActivityManagerService.java 的第3305 行启动启动器。

【讨论】:

所以它的 ActivityManager 广播了一个 bootComplete 已经发生的意图......所以谁告诉 ActivityManager 广播 bootComplete 意图,它是自己做的,还是启动所有服务后的系统服务器进程(作为线程内部)告诉activitymanager启动“bootCompleted”的广播过程。 @Tanmay - 亚历克斯回答了你的问题。你应该接受他的回答。如果你有一个新问题,那么你应该问一个新问题。这就是 Stack Overflow 的工作原理。 @jww 我真的很高兴亚历克斯给出的意见......但我最初的问题仍未得到解答,正如我在上面的评论中重申的那样......我认为亚历克斯知道答案......等待他告诉我 @TanmayVarun 我不确定这些事件何时何地被触发......您可能必须成为 Google 的 Android 框架工程师才能回答这个问题。有一本很棒的书叫Embedded Android,不过如果你想更深入地了解 Android 的启动顺序是如何工作的,我强烈推荐这本书。【参考方案2】:

您的原始问题似乎包含 2 个子问题:

第一季度。系统广播 Intent BOOT_COMPLETED 究竟是在 AOSP 代码中的什么位置触发的?

第二季度。触发 BOOT_COMPLETED 的所有必要条件是什么?

对于第一季度,活动管理器中有一个广泛的位置。从这个意义上说,@Alex Lockwood 的回答是正确的。但是,我注意到这个 Intent 的确切位置和触发方式可能会在 Android 版本之间发生变化。源代码搜索应该能够找到答案。以 AOSP 分支“android-8.1.0_r32”为例。首先,使用以下 shell 命令找出文件“ActivityManagerService.java”的位置:

$ cd [你的 AOSP 分支的根目录]

$ 查找 . -name ActivityManagerService.java

找到文件后,转到其父目录。例如,在我们当前的情况下:

$ cd frameworks/base/services/core/java/com/android/server/am

现在执行以下搜索:

$ grep -rIn ACTION_BOOT_COMPLETED .

输出显示确切位置不在文件“ActivityManagerService.java”中,而是在文件“UserController.java”中。更准确地说,它在“UserController.finishUserUnlockedCompleted()”方法中。

对于Q2,我们可以从上面的方法向后搜索。最终我们可能会到达方法“ActivityManagerService.finishBooting()”,我们可以看到布尔值“mBootAnimationComplete”必须为真。这意味着必须完成启动动画过程才能触发 BOOT_COMPLETED,并进一步意味着在启动动画过程进行时,许多系统服务正在启动。有关更多详细信息,您可以参考一些专门的书籍,这些书籍解释了必须准备好哪些系统服务才能结束启动动画过程。

【讨论】:

以上是关于android中的哪个进程要求ActivityManager广播BOOT_COMPLETED的主要内容,如果未能解决你的问题,请参考以下文章

Android进程分类与管理

安卓Android的内存管理原理解析

检查服务是不是在 Android 上运行?

实验八 进程间通信

Android进程的生命周期

实验八进程间通信