对WMS很感兴趣,所以决定以在桌面点击应用图标,到应用的Activity显示到屏幕上,这一简单操作为基础,分析整个过程。
其中涉及到非常多的模块,但是首先需要分析的就是Activity的启动流程,由于篇幅原因,分为以下3部分:
【Android 13源码分析】Activity启动流程-1
【Android 13源码分析】Activity启动流程-2
【Android 13源码分析】Activity启动流程-3
虽然整个操作实际上就2S时间,但是整个完整的流程分析下来也需要几个月,而且还是仅仅是启动主流程,
这三篇对Activity启动流程分析只关心主流程,不看具体细节,当然对于一些关键方法会着重介绍,这样以后如果有遇到相关问题的修改可以通过这篇笔记找到具体代码位置,然后根据具体的问题分析修改。
后续会有在Activity启动流程基础上延伸出来的各个分支的记录,比如窗口的创建与挂载,Surface相关,窗口的动画等待,这些流程的分析都需要基于Activity启动流程。
启动Activity的方式有很多,当前以在Launch中点击“电话”图标启动应用为例,本篇为Activity启动的第三篇, 主要是在目标应用进程启动后的逻辑。
java的方法的main函数
其实在执行到AMS::attachApplication前,应用进程也有一段逻辑
1 | java复制代码# ActivityThread |
应用进程(电话)创建完毕后,在main方法里会执行attach,就是要将自己的信息告知AMS,毕竟AMS 是管理模块。
因为进程创建也不是由AMS执行,AMS也不知道具体什么时候进程创建好了,所以在应用进程创建好后,会执行 AMS::attachApplication来告知。 这样就可以AMS就知道可以开始处理后续逻辑了
2.1 调用链
1 | arduino复制代码AMS::attachApplication |
接上一篇知道如果进程启动了ActivityTaskSupervisor::startSpecificActivity就会走进去ActivityTaskSupervisor::realStartActivityLocked。
但是可能会好奇怎么就知道要执行应用MainActivity到onCreate就一定是在这个方法里呢? 调试方法有很多,比如加log,打堆栈,但是对应这个逻辑比较简单的是,需要执行Activity启动到onCreate的控制在LaunchActivityItem中,而LaunchActivityItem在framework的引用出了本身,就只有在ActivityTaskSupervisor。
2.2 主流程
1 | scss复制代码# AMS |
这里是触发 LaunchActivityItem 的流程主线 , mAtmInternal是 ATMS 的内部类 LocalService
1 | java复制代码# ActivityTaskManagerService.LocalService |
这里的重点是执行了forAllRootTasks,当孩子是RootTask容器的时候才会执行Lambda表达式的内容。
AttachApplicationHelper 必然实现了 Consumer 接口, 直接看其 accept 实现即可
1 | java复制代码# RootWindowContainer.AttachApplicationHelper |
重点分析:
AttachApplicationHelper 实现类Consumer,Predicate接口。 对应要实现的函数分别为accept和test
- RootWindowContainer 的 child 自然是 WindowContainer
这里可能有个疑问就是 forAllRootTasks 一个参数的方法有2个重载,参数分别为Consumer 接口和Predicate 接口。 当前的AttachApplicationHelper类这两个都实现了,
怎么判断执行的是哪个呢?
答案也很简单, 只要看一下泛型参数即可。
2. 根据上面的解释, 第二步执行 accept回调, 内部执行 Task::forAllActivities 函数, 但是Task本身没有该方法, 该方法定义在父类 WindowContainer 中
- 那么逻辑就来到了气到的realStartActivityLocked ,其内部会构建 LaunchActivityItem,这个在【Activity生命周期事务执行逻辑】有详细说明
在把 ActivityTaskSupervisor::realStartActivityLocked方法看一下,现在已知 setLifecycleStateRequest为ResumeActivityItem
1 | scss复制代码# ActivityTaskSupervisor |
2.2.1 LaunchActivityItem handleLaunchActivity (启动ActivityonCreate)
2.2.1.1 调用链
1 | arduino复制代码LaunchActivityItem::execute |
2.2.1.2 主流程
接下来看 LaunchActivityItem::execute
1 | csharp复制代码# LaunchActivityItem |
这里的 client 是 ClientTransactionHandler 类型, 而 ActivityThread 是 ClientTransactionHandler子类
重点是这边创建了ActivityClientRecord,第一个参数就是我们要找的token
逻辑来到应用进程 ActivityThread
1 | scss复制代码# ActivityThread |
写过应用的都知道,默认都是一个参数的onCreate。
流程结束
tip:在添加回调的时候,还加了个请求的生命周期, 因为 LaunchActivityItem 只是创建,但是创建完成后,需要执行到对应的生命周期。
正常情况都是希望执行到onResume,所以会设置 ResumeActivityItem,不过不是分析重点,可自行了解
本文转载自: 掘金