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

时间:2014-12-06 23:08:09

标签: android android-activity android-logcat

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

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

因此很自然地会出现显示,但仍然可能会有一些服务由activitymanager / systemserver启动,然后才能进行BOOT_COMPLETED广播。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

Q1。系统广播意图BOOT_COMPLETED触发了AOSP代码中的确切位置?

Q2。触发BOOT_COMPLETED触发的所有必要条件是什么?

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

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

$查找。名称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,并且进一步意味着在进行引导动画过程时,会启动许多系统服务。有关更多详细信息,您可以参考一些专门的书,这些书解释了必须准备好哪些系统服务才能使启动动画过程结束。