趣谈Android世界里的那些进程

93 阅读2分钟

Android世界由各种各样的进程构建而成,熟知主要进程的职责可以有效的帮助我们搞清Android世界的骨骼脉络。

我们常说的进程有init进程、zygote进程、servicemanager进程、systemserver进程以及各种App进程等等。

1.init进程(用户空间的鼻祖)

init进程是linux启动时运行的第一个进程,init进程运行后通过解析init.rc文件获得批量命令,执行这些命令进行各种初始化操作。

init进程的主要职责:
    1.硬盘解析,识别各类文件并进行挂载
    2.启动进程服务:其中最重要的是启动了zygote、servicemanager进程
    3.进程守护:当接收到子进程的退出信号,会根据进程对应的服务进程处理,如重启

2.zygote进程(万物母体)

zygote进程对于android开发者来说比较熟悉,我们接触到的很多进程都是由zygote出来的(如systemserver进程、各种app进程等)。至于为何?其实和它的职责有关,zygote在启动后就加载了很多必要的系统资源,而通过fork的copy on write机制启动的子进程自然而然的获得了相对应的能力。

zygote进程的主要职责:
    1.创建虚拟机。
    2.加载各种类和资源。
    3.fork出systemserver进程。
    4.注册系统JNI。
    5.启动zygoteserver、socket服务开始接客。

3.servicemanager进程(Android世界的DNS)

servicemanager进程由init进程fork而来,虽然从命名来看它是服务的管理者,其实它只控制服务的注册和访问,并不关心服务的创建和启动。

android中的跨进程通信使用了binder机制,servicemanager作为binder机制的枢纽,当某个服务发布上线需要被外部使用时,必须将服务的以”域名“的形式注册到它这里。如此一来,调用者仅仅只需要使用这个”域名“就可以通过servicemanager调用到这个真实的服务了。

4.systemserver进程(Android世界的服务器)

systemserver是由zygote fork出来的第一个子进程。

由名字可以看出systemserver进程充当了一个系统服务器,在它启动后,会使用SystemServiceManager(简称SSM)对象启动和管理大量的服务。如AMS、WMS、PKMS、ATMS等90多种服务。

每个服务在创建后,会将自己使用一个”域名“注册到上述的servicemanager中去,这样外部就可以通过这个”域名“从servicemanager中访问到自己的服务了。

5.app进程(Android世界的客户端)

app进程同样也是由zygote fork出来的,也就是我们日常开发中所使用的进程,先不做赘述。