我在网上搜索过这个,没有答案。基本上在测试设备时,我观察到显示屏幕更早地触发,而在logcat中打印 Consoleui:在约8秒后启动bootComplete。
现在,设备屏幕显示为启动Launcher应用程序的一部分,因此在自然的事件序列中,系统服务器将要求activitymanager在单独的线程中启动启动器并继续执行更多工作。
因此很自然地会出现显示,但仍然可能会有一些服务由activitymanager / systemserver启动,然后才能进行BOOT_COMPLETED广播。
我必须证明这一点。为了做到这一点,我需要知道哪个进程告诉活动管理器现在它可以广播boot_complete消息,如果它是系统服务器,请告诉我它所在的代码部分。感谢。
答案 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,并且进一步意味着在进行引导动画过程时,会启动许多系统服务。有关更多详细信息,您可以参考一些专门的书,这些书解释了必须准备好哪些系统服务才能使启动动画过程结束。