一 用户空间init
我这里不分析linux启动的那第一个程序init。
init代码在/system/core/init/init.c。感兴趣的可从main函数开始分析
android的其他重要进程都是init加载init.rc配置文件来fork的。其中,最重要的init.rc位于source/system/core/rootdir下。
init.rc有它特有的语法,可google一下就知道了。
二 zygote的诞生
zygote程序是有app_process弄出来的,app_process的启动在init.rc中有对应行。
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
//第一个zygote是这个服务的名字,实际启动的程序位于system/bin下的app_process,后面是这个程序的启动参数
socket zygote stream 666
//这个表示init将创建一个unix域的socket,666是rwx的读写执行权限。
其中,app_process位于/frameworks/base/cmds/app_process/app_main.cpp中。
3.什么是Service Manager
里面理解一下就可以了,Service manager是管理以上services的一个进程,他是实际存在的
源代码位于:frameworks/base/cmds/servicemanager
servicemanager是init的子进程
mediaserver是init的子进程
zygote是init的子进程
system_server和所有的java应用程序是zygote的子进程
system_server executable(c/c++写的程序)
frameworks/base/cmds/system_server/
system_main.cpp
library/system_init.cpp
SystemServer (java程序)
frameworks/base/services/java/com/android/server/
SystemServer.java
Zygote (java程序)
frameworks/base/core/java/com/android/internal/os/
ZygoteInit.java
app_main 调用 zygoteInit
Zygote 分裂出 system_server
对外部输入事件处理流程分析:
/frameworks/base/services/java/com/android/server/WindowManagerService.java
/frameworks/base/services/java/com/android/server/InputManager.java
/frameworks/base/services/jni/com_android_server_InputManager.cpp
/frameworks/base/libs/ui/InputReader.cpp
/frameworks/base/libs/ui/InputDispatcher.cpp
/frameworks/base/libs/ui/EventHub.cpp
其中,WindowManagerService.java和InputManager.java主要向Android为窗口系统提供服务,EventHub.cpp主要用来读取设备文件中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它们之间的对接层。它们的关系是:WindowManagerService通过InputManager提供的接口开启一个线程驱动InputReader不断地从/dev/input/目录下面的设备文件读取事件,然后通过InputDispatcher分发给连接到WindowManagerService服务的客户端。InputReader从设备文件中读取的是RawEvent,在交给InputDispatcher进行分发之前,它需要先把RawEvent进行转化分类,拆分成KeyEvent、MotionEvent、TrackEvent各种类型等。