Skip to content

Commit b27494f

Browse files
committed
2 parents 93b95cc + a43bbca commit b27494f

2 files changed

Lines changed: 19 additions & 9 deletions

File tree

OperatingSystem/1.操作系统简介.md

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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至少运行在一个进程上。

OperatingSystem/AndroidKernal/2.Android线程间通信之Handler消息机制.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ private Looper(boolean quitAllowed) {
179179
mThread = Thread.currentThread();
180180
}
181181
```
182-
从代码上可以看到prepare()方法的作用是创建一个Looper对象,然后将该Looper对象保存到sThreadLocal中。
182+
从代码上可以看到prepare()方法的作用是创建一个Looper对象,然后将该Looper对象保存到sThreadLocal中。也就是说,prepare函数通过ThreadLocal机制,巧妙地把Looper和调用prepare的线程(也就是最终的处理线程)绑定在一起了。当事件源向这个Looper发送消息的时候,其实是把消息加到这个Looper的消息队列里了。那么,该消息就将由和Looper绑定的处理线程来处理。
183183

184184
这里有点麻烦了,我们上面使用的代码中并没有调用Looper.prepare()方法啊,理论上这里应该是null,Handler是无法使用的,为什么我们还能正常使用Handler?Looper.prepare()究竟是什么时候调用的?那我们需要看一下prepare()和prepare(boolean quitAllowed)方法都有哪些地方调用了:
185185

@@ -800,7 +800,12 @@ public final class MessageQueue {
800800
```
801801

802802

803-
803+
根据前面的分析可知,Handler中的消息队列实际就是某个Looper的消息队列,那么,Handler如此安排的目的何在?
804+
在回答这个问题之前,我先来问一个问题:怎么往Looper的消息队列插入消息?如果不知道Handler,这里有一个很原始的方法可解决上面这个问题:
805+
- 调用Looper的myQueue,它将返回消息队列对象MessageQueue
806+
- 构造一个Message,填充它的成员,尤其是target变量。
807+
- 调用MessageQueue的enqueueMessage,将消息插入消息队列。
808+
这种原始方法的确很麻烦,且极容易出错。但有了Handler后,我们的工作就变得异常简单了。Handler更像一个辅助类,帮助我们简化编程的工作。
804809

805810

806811

@@ -921,4 +926,4 @@ public class MyActivity extends Activity {
921926
---
922927

923928
- 邮箱 :charon.chui@gmail.com
924-
- Good Luck!
929+
- Good Luck!

0 commit comments

Comments
 (0)