应用程序进程简介
要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程。我们知道在Zygote的java框架层中会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建应用程序进程。Zygote进程通过fork自身创建应用程序进程,这样应用程序进程就会获得Zygote进程在启动时创建虚拟机实例,还创建了Binder线程池和消息循环,这样运行在应用进程中的应用程序就可以方便地使用Binder进行进程间通信以及处理消息了。上期已经讲到Android系统启动流程总结,链接:
AMS如果想要启动应用程序进程,就需要向Zygote进程发送创建应用程序进程的请求,AMS会通过调用startProcessLocked方法向Zygote进程发送请求。其中ZygoteProcess类用于保持与Zygote进程的通信状态。
Zygote接收请求并创建应用程序进程:
(1)应用程序进程就进入了ActivityThread的main方法中,应用程序进程就创建完成了
并且运行了主线程的管理类ActivityThread。
(2)启动Binder线程池,确保线程池只会被启动一次,并创建线程池中的第一个线程,也就是线程池的主线程,将当前线程注册到Binder驱动程序中,这样我们创建的线程就加入了Binder线程池中,新创建的应用程序进程就支持Binder进程间通信了,我们只需要创建当前进程Binder对象,并将它注册到ServiceManager中就可以实现Binder进程间通信了,而不必关心进程间是如何通过Binder进行通信的。
(3)应用程序进程启动后创建消息循环,ActivityThread用于管理当前应用程序的主线程,应用程序进程完成后,就会创建一个消息循环。系统在应用程序进程启动完成后,就会创建一个消息循环,这样运行在应用程序进程中的应用程序就可以方便地使用消息循环机制了。
应用程序进程启动后接着该启动应用程序了,也就是启动根Activity。Activity的启动过程分两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。根Activity指的是应用程序启动的第一个Activity,因此根Activity的启动过程一般情况下也可以理解为应用程序的启动过程。普通Activity是指除了应用程序启动的第一个Activity之外的其他Activity。
Launcher请求AMS过程
Launcher启动后会将已安装的应用程序的快捷图标显示到桌面上,这些应用程序的快捷图标就是启动根Activity的入口,当我们点击某个应用程序的快捷图标时,就会通过Launcher请求AMS来启动该应用程序。,当我们点击某个应用程序的快捷图标时,就会调用Launcher的startActivitySafely方法。Instrumentation主要来监控应用程序和系统的交互,Instrumentation调用execStartActivity方法最终调用的是AMS的startActivity方法。
AMS到ApplicationThread的调用过程
要在目标应用程序中启动Activity。当前代码逻辑运行在AMS所在的进程(SystemServer)中,通过ApplicationThread来与用于程序进程进行Binder通信,换句话说,ApplicationThread是AMS所在进程(SystemServer)和应用程序进程的通信桥梁。
ActivityThread启动Activity的过程
我们知道当前的代码逻辑运行在应用程序进程中,ApplicationThread是ActivityThread的内部类,它管理者当前应用程序进程的主线程,通过ApplicationThread调用schedudeLauncherActivity方法启动Activity。mH指的是H,它是ActivityThread的内部类并继承Handler,是应用程序进程中主线程的消息管理类。因为ApplicationThread是一个Binder,它的调用逻辑运行在Binder线程池中,所以这些需要用H将代码的逻辑切换到主线程中。ActivityThread调用performLauncherActivity方法启动Activity。方法内部创建Application,makeApplication方法内部会调用Application的onCreate方法。Activity的attach方法初始化Activity,在attach方法会创建Window对象(PhoneWindow)并与Activity自身进行关联。调用Instrumentation的callActiivtyOnCreate方法启动Activity,最终调用Activity的onCreate方法,讲到这里,根Activity就启动了。即应用程序就启动了。
根Activity启动过程中涉及的进程
根Activity启动过程会涉及4个进程,分别是Zygote进程、Launcher进程、AMS所在进程(SystemServer)、应用程序进程。首先Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序进程。启动应用程序进程后,AMS会请求创建应用程序进程并启动根Activity。普通的Activity启动过程会涉及2个进程,AMS所在进程(SystemServer)、应用程序进程。