【Activity启动系列】一:APP进程的创建流程

266 阅读5分钟

前言

做了几年的Android开发了,除了平时工作中基本业务的完成,有时候静下来仔细想一下Android整体是个啥东西,还是很模糊的。主要原因还是因为自己的知识系统或者说脑海里的东西比较零散,没有能够很好串联起来,那。。如何能够把这些零散的东西串联起来呢?最简单的方法就是看书(废话)。最近在看刘皇叔的《Android进阶解密》,由于自己是做应用层开发的,刚开始看的时候还是很吃力的。第一遍读完后,发现是有学习到的,脑海里有个大致流程图,比如Zygote进程的启动 然后SystemServer的创建再到ActivityManagerService(AMS)等等。。但由于自己没有编译过Android系统源码 或者说用SourceInsight工具看过Android源码(这个搞过 就是大致看了看 然后时间紧就没看多少(还是懒。。。)),导致对里面的挺多细节不算很了解。不过话说回来,如果只是做应用层的东西,和皇叔的看法一致,能把《Android进阶解密》看的差不多就可以了。当然我也是这样的追求,哈哈哈哈哈。。。也算是为了自律吧,希望能把自己看书中所了解到的东西记录下来,督促自己多写多输出点东西,减少玩的时间。好啦,闲话到此为止,咱们回到正题。

正文

先列出我们对APP进程创建几个问题:

  1. APP进程创建涉及到那几个重要的类?
  2. 这几个类各自起的作用?
  3. 串联各个类的作用整体描述APP进程的创建?
  4. 流程的创建过程中用到了哪些通信方式

我们一个个来回答:

问题一 app进程创建涉及到的关键类:

APP进程创建的发生时机是我们点击桌面图标(Icon)的时候发生的,并且同时这个APP没打开过或者是打开过后用户有手动将APP进程杀掉了,说了这么多废话实际上就是冷启动的时候发生的。咯咯咯(有点话痨)。。。既然是在桌面发生的,那么Laucnher(启动器)算一个。然后Launcher图标点击事件startActivity里面调用到的是AMS的方法,AMS发现APP进程没启动,他自己不负责进程的创建,然后把这个任务交给了Zygote(孵化器)Zygote通过一层层方法调用,最后终于把APP进程创建出来了,也就是我们常说的ActivityThread的main 方法执行了。

答案:Launcher、AMS、Zygote、ActivityThread

问题二 每个类各自作用:

Launcher作为桌面,其作用就是各个app的用户入口,然后通知负责四大组件管理的AMS,我想要启动一个应用了。

AMS在Android中的位置还是有点重要的,作为SystemService其中的一个,它是用来负责四大组件的相关管理的。

Zygote(孵化器) 这是鼻祖,所有APP进程的创建,实际上都是它Fork出来的,Fork进程的好处我觉得是可以复用原进程的一些资源,不用再次创建直接能够拿来使用(如若有误,请勘误)。Zygote在启动的时候,已经启动了一个Socket服务端,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。

ActivityThread 很多人都知道这个类,它里面有很多处理四大组件生命周期的方法(都是通过mH(handler)来管理执行的)。其main方法简化后如下:

code-snapshot.png

问题三 整体流程简单描述:

整体流程我们梳理一下:

未命名文件 (1).png

我梳理的比较简单,里面实际上经过了层层调用,非常复杂,才到达了我们看到关键类。 这里我想稍微说一下Zygote创建APP进程: 书里看到是Zygote启动了个Socket一直在监听消息,等收到AMS发给他的消息后,他去Fork APP进程.Fork的大致过程是拿到了ActivityThread的类名,通过classLoader拿到Class 最后Zygote发出一个自定义异常,然后捕捉该异常,在异常里通过method.invoke()方法调用到了ActivityThread的main方法。这种处理方式,Zygote在创建SystemServer进程的时候也是这么搞得,书里说的这么搞的原因是:通过抛异常的方式清除流程中需要的堆栈帧,让ActivityThread的main方法看起来就像APP应用程序进程的入口方法。我个人认为还有一点是流程中的所有堆栈帧清除掉后,是不是内存上也有所减少?哈哈哈。。个人理解,有啥不到位的欢迎指出。

问题四 app进程创建中用到的通信方式:

这里面的通信方式包含了进程间的两种通信方式:

  1. Socket
  2. Binder
  • Launcher--->AMS 用的是 Binder
  • AMS--->Zygote 用的是Socket 要说其他的话我们也可以再加上ActivityThread里面的Handler机制,线程间通讯方式。

结语

这篇博文主要用文字简单聊了一下APP进程的创建过程,写的不够细,有需求的同学可以去参考更详细的资料 比如《Android进阶解密》。