AMS主要功能:
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。还负责启动或杀死应用程序的进程。
WMS主要功能:
为所有窗口分配Surface。
管理Surface的显示顺序、尺寸、位置。
管理窗口动画。
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息。
PWS主要功能:
PMS 用来管理跟踪所有应用APK,包括安装,卸载,解析,控制权限等。
SystemServer也是一个进程,包括AMS、PMS、WMS等等。
zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的。
①点击启动一个App,Launcher进程采用Binder IPC向ActivityManagerService发起startActivity请求;
②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;
③Zygote进程fork出新的子进程,即App进程;
④App进程通过Binder IPC向sytem_server进程发起绑定Application请求;
⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
备注:
Launcher,PMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,PMS,App进程间使用的是Binder机制。
翻译自: https://android.jlelse.eu/android-application-launch-explained-from-zygote-to-your-activity-oncreate-8a8f036864b
这篇文章讲解当用户点击应用图标时,安卓如何启动你的应用。安卓系统做了很多幕后工作,来使得你的launch activity对用户可见。本文通过重要阶段的讲解和调用序列详细讲解这一过程。
安卓应用在这两个方面是独特的:
多个入口点 :Android应用程序由不同的组件组成,它们可以调用其他应用程序拥有的组件。这些组件大致对应于任何应用程序的多个入口点。因此,它们不同于具有像main()方法那样的单个入口点的传统应用程序。
拥有自己的小世界 :每个Android应用程序都生活在自己的世界中,它在单独的进程中运行,拥有自己的Dalvik VM实例,并分配有唯一的用户ID。
必要时会启动Android进程。
每当用户或其他系统组件请求执行属于您应用程序的组件(可能是服务,活动或意图接收器)时,Android系统都会为您的应用程序启动一个新进程(如果尚未运行)。通常,进程一直运行直到被系统杀死。应用程序流程是按需创建的,在您看到应用程序的启动活动启动并运行之前,发生了许多事情。
每个应用程序都在其自己的进程中运行 :默认情况下,每个Android应用程序都在其自己的Android进程中运行,而这个进程只不过是一个Linux进程,而该进程首先需要一个执行线程。例如,当您单击电子邮件中的超链接时,网页将在浏览器窗口中打开。您的邮件客户端和浏览器是两个单独的应用程序,它们分别在两个单独的进程中运行。click事件使Android平台启动新进程,以便它可以在其自身进程的上下文中实例化浏览器活动。这对于应用程序中的任何其他组件同样适用。
让我们退后一会儿,快速浏览一下系统启动过程。与大多数基于Linux的系统一样,启动加载程序在启动时将加载内核并启动init进程。然后,init会生成称为“守护程序”的低级Linux进程,例如android debug守护程序,USB守护程序等。这些守护程序通常处理低级硬件接口,包括无线电接口。
然后,初始化过程会启动一个非常有趣的过程,称为“zygote'。
顾名思义,这是其余Android应用程序的开始。这是初始化Dalvik虚拟机的第一个实例的过程。它还预加载Android应用程序框架和系统上安装的各种应用程序使用的所有常见类。因此,它准备进行复制。它统计侦听套接字接口上的将来请求,以产生新的虚拟机(VM)来管理新的应用程序进程。收到新请求后,它会分叉以创建一个新进程,该进程将获取预先初始化的VM实例。
zygote之后,init启动运行时过程。
然后zygote分叉以启动一个名为System server的托管良好的进程。系统服务器在其自己的上下文中启动所有核心平台服务,例如活动管理器服务和硬件服务。
此时,完整的堆栈已准备就绪,可以启动第一个应用程序流程-主页应用程序,该应用程序显示主屏幕(也称为启动器应用程序)。
click事件被转换为 startActivity(intent), 并通过Binder IPC路由到 ActivityManagerService 。ActvityManagerService执行多个步骤
如您所见,当用户单击图标并启动新应用程序时,许多事情发生在幕后。这是全图:
流程创建:
ActivityManagerService 通过调用 startProcessLocked() 方法创建一个新进程,该方法通过套接字连接将参数发送到Zygote进程。Zygote派生自己并调用 ZygoteInit.main() ,然后实例化 ActivityThread 对象并返回新创建的进程的进程ID。
默认情况下,每个进程都有一个线程。主线程有一个 Looper 实例来处理来自消息队列的消息,并且它在 run() 方法的每次迭代中都调用 Looper.loop() 。 Looper 的工作是从消息队列中d出消息并调用相应的方法来处理它们。然后,ActivityThread通过随后调用 Looper.prepareLoop() 和 Looper.loop()来 启动消息循环。
以下序列详细捕获了调用序列:
<figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inheritfont-weight: 400font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serifline-height: 20pxmargin-left: automargin-right: automax-width: 728pxfont-size: 14pxcolor: rgb(117, 117, 117)margin-top: 10pxtext-align: center">Android应用启动:单击事件以执行Looper调用顺序</figcaption>
应用程序绑定:
下一步是将此新创建的过程附加到特定应用程序。这是通过在线程对象上调用 bindApplication() 来完成的。此方法将 BIND_APPLICATION 消息发送到消息队列。该消息由 Handler 对象检索,该对象随后调用 handleMessage() 方法以触发特定于消息的 *** 作 -handleBindApplication() 。此方法调用 makeApplication() 方法,该方法将应用程序特定的类加载到内存中。
下图描述了该调用序列。
<figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inheritfont-weight: 400font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serifline-height: 20pxmargin-left: automargin-right: automax-width: 728pxfont-size: 14pxcolor: rgb(117, 117, 117)margin-top: 10pxtext-align: center">Android应用启动:BIND_APPLICATION消息处理</figcaption>
启动活动:
在上一步之后,系统包含负责应用程序的进程,并将应用程序类加载到进程的私有内存中。在新创建的流程和现有流程之间,启动活动的调用顺序很常见。
实际的启动过程从 realStartActivity() 方法开始, 该 方法在应用程序线程对象上调用 sheduleLaunchActivity() 。此方法将 LAUNCH_ACTIVITY 消息发送到消息队列。该消息由 handleLaunchActivity() 方法处理,如下所示。
假设用户单击“视频浏览器”应用程序。启动该活动的调用顺序如图所示。
<figcaption class="jv jw di dg dh jx jy bo b fc cp ga" data-selectable-paragraph="" style="box-sizing: inheritfont-weight: 400font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serifline-height: 20pxmargin-left: automargin-right: automax-width: 728pxfont-size: 14pxcolor: rgb(117, 117, 117)margin-top: 10pxtext-align: center">Android应用启动: LAUNCH_ACTIVITY消息处理 </figcaption>
该活动通过 onCreate() 方法调用开始其托管生命周期。该活动通过 onRestart() 调用进入前台,并通过 onStart() 调用开始与用户进行交互。
本文主要是基于android10.0.0来讲述下WMS的启动流程
WMS作为系统的一个关键服务其是在SystemServer.java::startOtherServices中启动的
WMS主要有下面几个作用
1:应用程序通过WMS向SurfaceFinger申请surface,surface代表的是绘图表面,应用程序绘制都必须在绘图表面上
2:管理窗口的层级,一个窗口一般在WMS端都是一个WindowState,其是有层级区分的,其有baseLayer和subLayer两个值共同确定
3:窗口动画:WindowAnimator
其中上面有一个比较重要的对象PhoneWindowManager,主要是负责窗口管理的各种策略
WindowManagerPolicy mPolicy---------------->对应的实现类PhoneWindowManager,主要是窗口管理的策略和按键的处理
final ActivityManagerInternal mAmInternal------>对应的是AMS,持有AMS对象
final ActivityTaskManagerInternal mAtmInternal--->管理Task的,android10.0新增
final ArraySet<Session>mSessions = new ArraySet<>()---->会话,主要是建立和surfaceFinger的连接
final WindowHashMap mWindowMap = new WindowHashMap()---->缓存windowstate
AMS,WMS之间数据是对应的,通过token值可以在AMS,WMS,应用程序之后来唯一确定一组Window,token是关联着一组窗口的,可能有多个WindowState的token值是相同的
整个启动过程涉及3个线程: system_server主线程, “android.display”, “android.ui”, 整个过程是采用阻塞方式(利用Handler.runWithScissors)执行的. 其中WindowManagerService.mH的Looper运行在 “android.display”进程,也就意味着WMS.H.handleMessage()在该线程执行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)