流程
init 进程
Zygote 进程
SystemServer 进程
由于SystemServer是Zygote进程fork出来的,所以该进程也拥有一个ZygoteServer所开启等待AMS连接的Socket实例副本。在这里并不需要这个Socket,所以关闭。
- bootloader启动linux Kernel 内核和init进程
- init进程分裂出更多名为"daemons(守护进程)"的底层的Linux进程, 诸如android debug deamon, USB deamon等. 这些守护进程处理底层硬件相关的接口
- init进程会解析init.rc 脚本做一些初始化的工作,包括挂在文件系统,创建工作目录以及启动系统服务进程等,其中包括Zygote,ServiceManager,meidia等
- Zygote 进程会预加载必要的 Java Classes和 resource ,并打开 /dev/socket/zygote socket 去监听启动应用程序的请求
- Zygote 进程会进一步启动 system server进程,然后 system-servver 进程中会启动AMS\WMS\PMS等服务,等服务都启动后,AMS会打开Lanucher应用的Home Activity
system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?
Zygote 作为一个孵化器,可以提前加载一些资源,这样 fork() 时基于 Copy-On-Write 机制创建的其他进程就能直接使用这些资源,而不用重新加载。比如 system_server 就可以直接使用 Zygote 中的 JNI 函数、共享库、常用的类、以及主题资源。
为什么要专门使用 Zygote 进程去孵化应用进程,而不是让 system_server 去孵化呢?
首先 system_server 相比 Zygote 多运行了 AMS、WMS 等服务,这些对一个应用程序来说是不需要的。另外进程的 fork() 对多线程不友好,在Linux中,fork的时候只复制当前线程到子进程,其他线程在子进程中“蒸发”了。这可能会导致死锁,而 system_server 中肯定是有很多线程的。
在大多数操作系统上,为了性能的因素,锁基本上都是实现在用户态的而非内核态(因为在用户态实现最方便,基本上就是通过原子操作或者之前文章中提到的memory barrier实现的),所以调用fork的时候,会复制父进程的所有锁到子进程中。
问题就出在这了。从操作系统的角度上看,对于每一个锁都有它的持有者,即对它进行lock操作的线程。假设在fork之前,一个线程对某个锁进行的lock操作,即持有了该锁,然后另外一个线程调用了fork创建子进程。可是在子进程中持有那个锁的线程却"消失"了,从子进程的角度来看,这个锁被“永久”的上锁了,因为它的持有者“蒸发”了。
那么如果子进程中的任何一个线程对这个已经被持有的锁进行lock操作话,就会发生死锁。
Zygote 为什么不采用 Binder 机制进行 IPC 通信?
Binder 机制中存在 Binder 线程池,是多线程的,如果 Zygote 采用 Binder 的话就存在上面说的 fork() 与 多线程的问题了。 其实严格来说,Binder 机制不一定要多线程,所谓的 Binder 线程只不过是在循环读取 Binder 驱动的消息而已,只注册一个 Binder 线程也是可以工作的,比如 service manager 就是这样的。 实际上 Zygote 尽管没有采取 Binder 机制,它也不是单线程的,但它在 fork() 前主动停止了其他线程,fork() 后重新启动了。
System Server 和 Service Manager联系
- ServiceManager:是一个守护进程,负责管理Server并向Client提供查询Server的功能。
- System Server 进程的主要功能:
- 加载 android servers 底层函数库
- 启动 android 系统中的 native 服务
- 创建、注册并启动 Android 的系统服务,在独立线程中运行
- 创建 Looper 消息循环,处理 System Server 进程中的事件消息
内部维护一个list来记录已经注册的所有的service,统一管理,向Client提供查询服务
- luncher 进程是由ams启动完毕后发起的,走的是app的启动流程。所以fork的是zy gote进程。
参考
[copy on write] https://blog.csdn.net/u013043762/article/details/80817979
Android 显示系统:SurfaceFlinger详解
[Android系统启动流程]