前言
Launcher是一个用来显示系统中已经安装的应用程序的应用程序,Launcher 在启动过程中会请求PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序,它的作用主要有两点一个是启动应用程序一个是显示和管理应用程序的快捷图标或者其他桌面组件。
分析Launcher的启动
启动入口在SystemServer.java的startOtherServices函数中,我们可以看到上面的注释的意思也大概是这个
我们点击到systemReady方法中,在第14282行发现有一个名为startHomeActivityLocked的方法被调用
我们点到startHomeActivityLocked方法中发现有一个getHomeIntent的调用
我们点进getHomeIntent方法中,发现假如mFactoryTest不为FactoryTest.FACTORY_TEST_LOW_LEVEL(低级工厂模式)会添加一个Intent.CATEGORY_HOME的Category
然后我们在ActivityManagerService.java的这一行加入Log打印
发现打印的包名是com.android.settings并不是launcher
然后我们在settings中的AndroidManifest.xml中发现了两个带有android.intent.category.HOME标记的Activity
然后我们在两个Activity中的onCreate方法中加入Log打印
我们编译运行后发现打印的是FallbackHome
image.png
我们打开FallbackHome.java,发现代码比较少,其中有一个方法是用来检测是否找到了真正的HomeActivity,我这里加了一行Toast的代码,用来显示真正的HomeActivity的包名
然后我们编译源码运行模拟器,我们发现显示的是launcher3(ps:由于这里我把默认的launcher改成了launcher3所以这里显示的是launcher3)