赞
踩
1. Launcher进程请求AMS
2. AMS发送创建应用进程请求
3. Zygote进程接受请求并孵化应用进程
4. 应用进程启动ActivityThread
5. 应用进程绑定到AMS
6. AMS发送启动Activity的请求
7. ActivityThread的Handler处理启动Activity的请求
面试必备:Android(9.0)Activity启动流程(一) - 掘金
面试必备:Android(9.0)Activity启动流程(二) - 掘金
根Activity的启动流程其实就是桌面上点击一个应用图标进入到应用的第一个Activity的流程,其实桌面也可以看成一个程序,即Launcher。当系统开机后,Launcher也随之被启动,然后将已经安装的应用程序图标显示到桌面上,所以当我们点击一个应用图标其实就是相当于点击活动中的一个button,其相应事件就是Launcher进程请求AMS来启动该应用程序。
发现其实Launcher调用的startActivity其实就是Activity中的startActivity。从这里也可以证明Launcher其实也是个Activity。所以在Launcher启动一个app,和我们平时在startActivity基本是一样的。通过跨进程调用获取AMS,AMS引用作为服务端处于SystemServer进程中,与当前Launcher进程作为客户端与服务端不在同一个进程,所以am返回的是IActivityManager.Stub的代理对象,此时如果要实现客户端与服务端进程间的通信,只需要在AMS继承了IActivityManager.Stub类并实现了相应的方法,而通过下面的代码可以发现AMS刚好是继承了IActivityManager.Stub类的,这样Launcher进程作为客户端就拥有了服务端AMS的代理对象,然后就可以调用AMS的方法来实现具体功能了,就这样Launcher的工作就交给AMS实现了。
通过上面的分析,我们已经知道现在任务已经交给了AMS,入口是AMS的startActivity。
//获取即将要启动的Activity的所在的应用程序进程
//如果应用进程已经存在
//应用进程还未创建,则通过AMS调用startProcessLocked()向Zygote进程发送请求
//创建应用进程的用户ID --> startProcess()
与Zygote进程建立了Socket连接
这样AMS就完成了向Zygote进程发送创建应用进程的请求的任务。
现在Zygote进程接受请求是在main方法,
,就让我们来看看这个main方法
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- @UnsupportedAppUsage
- public static void main(String argv[]) {
- ZygoteServer zygoteServer = new ZygoteServer();
- Runnable caller;
- try {
- ...
- //创建名为zygote的Socket
- zygoteServer.createZygoteSocket(socketName);
- ....
- //由于在init.rc中设置了start-system-server参数,因此
- //这里将启动SystemServer,可见SystemServer由Zygote创建的第一个进程
- if (startSystemServer) {
- Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
- if (r != null) {
- r.run();
- return;
- }
- }
-
- caller = Zygote.initBlastulaPool();
- if (caller == null) {
- Log.i(TAG, "Accepting command socket connections");
- //等待AMS的请求
- caller = zygoteServer.runSelectLoop(abiList);
- }
- } catch (Throwable ex) {
- Log.e(TAG, "System zygote died with exception", ex);
- throw ex;
- } finally {
- zygoteServer.closeServerSocket();
- }
-
- // We're in the child process and have exited the select loop. Proceed to execute the
- // command.
- if (caller != null) {
- caller.run();
- }
- }
-
- 复制代码
通过main方法,我们可以知道在这个main方法首先要创建一个Server端的Socket,这个name为”zygote”的Socket用来等待ActivityManagerService来请求Zygote来创建新的应用程序进程,在上面AMS请求的分析中我们也知道客户端将根据这个name来与Zygote的Socket建立连接。接下去会启动SystemServer进程,这个进程会启动各种系统服务,比如与Activity启动息息相关的AMS。最后会调用ZygoteServer.runSelectLoop(abiList)来使创建的Socket进入无限循环,等待AMS请求。让我们来看看这个runSelectLoop
//监听Socket连接,充当服务端Socket
//不断处理客户端的AMS的请求,然后交给processOneCommand
可以发现这个方法是死循环表示不停的监听着Socket连接。acceptCommandPeer方法就是监听是否收到了请求,如果收到了请求就交给processOneCommand来实现
//获取应用程序进程的启动参数
//fork当前进程创建一个子进程
//pid为0则代表这个进程为子进程,即新创建的应用程序进程
于是到这里子进程也就是应用进程就被孵化出来了。你以为这样就结束了?其实还早呢!别忘了我们的最终使命是根Activity的启动,而现在只是有了根Activity所需要的应用进程,革命尚未成功,仍需要努力!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。