Android Framework分析Launcher启动应用程

2023-02-09  本文已影响0人  itfitness

目录

前言

Launcher可以显示系统中已经安装的应用程序,用户可以通过点击这些快捷图标来启动相应的应用程序,今天我们就来分析下,Launcher启动应用程序的Activity的过程

分析Launcher启动应用程序

这里由于我把默认的Launcer换成了Launcher3,所以这里我们找到packages\apps\Launcher3\src\com\android\launcher3下的Launcher.java,通过查找我们找到了一个onClick方法,当点击APP的快捷方式的时候会调用onClickAppShortcut



我们点开onClickAppShortcut方法发现在最后调用了startAppShortcutOrInfoActivity方法



进入startAppShortcutOrInfoActivity方法,里面调用了startActivitySafely方法

我们进入startActivitySafely方法,发现有一段启动Activity的代码,但是我们不知道走的是哪个,最快的就是加上点输出信息分析



我这边加了几个Toast

然后我们编译(在编译之前先吧launcher3删除掉)启动模拟器

我们启动模拟器,随便打开一个应用发现走的是startActivity方法,这里其实调用的是Activity的startActivity方法

我们打开Activity.java找到对应的startActivity方法

然后我们继续进入startActivityForResult方法,这里执行了Instrumentation的execStartActivity方法



我们进入execStartActivity方法中发现最后执行了AMS的startActivity方法

我们进入ActivityManagerService.java中找到startActivity方法,发现里面执行了startActivityAsUser方法

我们进入startActivityAsUser方法发现又执行了ActivityStarter的startActivityMayWait方法

我们进入ActivityStarter的startActivityMayWait方法,这里面逻辑比较多,我们仔细寻找关键字发现了startActivityLocked方法

进入startActivityLocked方法我们发现这里又执行了一个startActivity方法我们进入

发现最下面又调用了一个9个参数的startActivity方法,我们点击去

发现里面调用了startActivityUnchecked,我们进入startActivityUnchecked

startActivityUnchecked方法中的逻辑较多,我们仔细查找关键字,发现有一行调用了ActivityStack的startActivityLocked

我们点进去发现好像都是些任务栈的判断和判断是否需要动画的执行,并没有有用的信息,我们返回继续排查,我们发现这里有一个关于mDoResume的判断

我们还记得之前在分析ActivityStarter的拥有多个参数的startActivity方法吗,最后调用的startActivity方法将doResume设置为true



不过进入if语句之后我们不知道走的哪个分支,这时可以通过添加打印信息快速的找到


我们编译运行发现打印的是two

我们点进resumeFocusedStackTopActivityLocked,由于这时还不是RESUMED状态所以会走resumeTopActivityUncheckedLocked方法

我们进入resumeTopActivityUncheckedLocked方法里面调用了resumeTopActivityInnerLocked方法

继续进入resumeTopActivityInnerLocked方法里面逻辑比较多在最底下我们找到startSpecificActivityLocked方法

我们找到ActivityStackSupervisor.java里面的startSpecificActivityLocked方法,发现里面调用了realStartActivityLocked方法(启动Activity)和AMS的startProcessLocked方法(开启应用程序进程)

我们进入realStartActivityLocked方法,发现在这里调用了app.thread的scheduleLaunchActivity方法

我们通过查找发现app.thread是IApplicationThread类型

这时我们全局搜索scheduleLaunchActivity尝试找到该方法所属的类,可以发现总共找到了两个地方,其中一个是调用的位置,我们点开函数原型

发现最后调用了sendMessage方法

我们找到sendMessage方法,发现调用了mH的sendMessage

我们找到mH发现mH是H的实例对象

我们找到H类,发现H继承了Handler

我们找到handleMessage方法的,找到了LAUNCH_ACTIVITY,发现里面调用了handleLaunchActivity

我们进入handleLaunchActivity方法,这里调用了performLaunchActivity方法

我们进入performLaunchActivity方法,发现里面的代码比较关键,这里里面创建了appContext,通过类加载器创建了Activity,通过makeApplication创建了Application,通过Activity的attach方法创建了PhoneWindow等

同时在找个位置我们发现调用了Instrumentation的callActivityOnCreate方法

我们进入callActivityOnCreate方法,发现调用了Activity的performCreate方法

我们进入performCreate方法,发现最终调用了Activity的onCreate方法,到此Activity就创建成功了
上一篇 下一篇

猜你喜欢

热点阅读