@@ -193,12 +193,17 @@ Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux
193193- init进程还启动` servicemanager ` (binder服务管家)、` bootanim ` (开机动画)等重要服务
194194- init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),` Zygote是所有Java进程的父进程 ` ,Zygote进程本身是由init进程孵化而来的。
195195
196- - Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:
197- - 加载ZygoteInit类,注册Zygote Socket服务端套接字
198- - 加载虚拟机
199- - 提前加载类preloadClasses
200- - 提前加载资源preloadResouces
201- - System Server进程,是由Zygote进程fork而来,` System Server是Zygote孵化的第一个进程 ` ,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。
196+ - Zygote进程.是由init进程通过解析init.rc文件后fork生成的.
197+ Zygote本身是一个Native的应用程序,与驱动、内核等均无关系。Zygote最初的名字叫“app_process”,这个名字是在Android.mk文件中指定的,但在运行过程中,app_process通过Linux下的pctrl系统调用将自己的名字换成了“Zygote”,所以我们通过ps命令看到的进程名是“Zygote”。Zygote是在Android系统中创建Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,它成功地繁殖了framework的核心system_server进程。
198+ Zygote进程主要包含:
199+ - 创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
200+ - 加载虚拟机:调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
201+ - 加载ZygoteInit类,通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。然而在这个世界刚开创的时候,什么东西都没有。注册Zygote Socket服务端套接字.Zygote及系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket。调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。
202+ - 启动System Server进程(分裂出了一个system_server进程):zygote觉得自己的工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为Java世界服务。Java世界中系统Service所驻留的进程system_server,该进程是framework的核心。如果它死了,就会导致Zygote自杀。
203+ - 预加载类preloadClasses:preloadClass函数的执行时间比较长,这是导致Android系统启动慢的原因之一。
204+ - 预加载资源preloadResouces:它主要是加载framework-res.apk中的资源。在UI编程中常使用的com.android.R.XXX资源是系统默认的资源,它们就是由Zygote加载的。
205+ - System Server进程,是由Zygote进程fork而来,` System Server是Zygote孵化的第一个进程 ` ,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务,也就是说Java中的核心Service都在这里启动。同时会启动Binder通信系统,调用Looper.loop()启动消息循环。
206+ 另外System Server进程还会启动一个Watch Dog的现成。Watch Dog的中文意思是“看门狗”。我依稀记得其最初存在的意义是因为早期嵌入式设备上的程序经常“跑飞”(比如说电磁干扰等),所以专门设置了一个硬件看门狗,每隔一段时间,看门狗就去检查一下某个参数是不是被设置了,如果发现该参数没有被设置,则判断为系统出错,然后就会强制重启。在软件层面上,Android对SystemServer的参数是否被设置也很谨慎,所以专门为它增加了一条看门狗,可它看的是哪个门呢?就是看几个重要Service的门,一旦发现Service出了问题,就会杀掉system_server,而这也会使zygote随其一起自杀,最后导致重启Java世界。具体实现是隔一段时间给另外一个线程发送一条MONITOR消息,那个线程将检查各个Service的健康情况。而看门狗会等待检查结果,如果第二次还没有返回结果,那么它会杀掉SS。
202207- Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。
203208- Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
204209- Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
0 commit comments