*********************本文提出的问题*************************
Launcher 启动入口在哪?
系统如何识别 Launcher 应用?
如何开发一个桌面 Launcher 应用?
Launcher 启动入口在哪?
当系统服务启动完成之后,SystemServer.Java 的 startOtherServces() 里面会调用 activityManangerService.systemReady() 方法,这就是 Launcher 的启动入口.

而在 ActivityManangerService.java 类里的 systemReady() 内部有一个重要的方法 startHomeOnAllDisplays

这个是 ActivityTaskManagerInternal.Java 类里面的方法

由注释可知这个方法为再所有的屏幕上(多屏幕)启动 Launcher 应用,在 Android 10.0 之后把 activity 相关的启动工作都转移到了 ActivityTaskManagerService 类中,而 ActivityTaskManagerInternal 是面向接口的一个抽象类,framework里有很多这种 Internal 类.所以去寻找实现类很费劲,一般情况下 Internal 类的实现类都在对应类的 LoaclService中,所以去 ActivityTaskManagerService&LoaclService 中寻找

可以看到它继承了 ActivityTaskManagerInternal

在 startHomeOnAllDispalys() 中又把启动桌面应用的工作委托给了 RootWindowContainer,跟进一下,可以看到他遍历了所有屏幕,然后取出id,依次调用 startHomeOnDisplay(),也就是依次在屏幕上启动桌面应用

再次跟进 startHomeOnDisplay()

又遍历了一遍,留个疑问吧.-----------------------
系统如何识别 Launcher 应用?
跟进 startHomeOnTaskDisplayArea(); 里面有个重点, getHomeIntent();

可以看到这个 intent.addCategory 的参数为 CATEGORY_HOME 跟我们平时用的 CATEGORY_LAUNCHER 不同.这个就是区别,设置为 HOME 就是 launcher 应用,怪怪的

如何开发一个桌面 Launcher 应用?
只需要在 AndroidManifest 里面添加两条属性就可以了
