服务端
主要是ActivityManagerService(AMS), WindowManagerService(WMS),PackageM anerService(PMS)
- AMS 主要用于管理所有应用程序的Activity
- WMS 管理各个窗口,隐藏,显示等
- PMS 用来管理跟踪所有应用APK,安装,解析,控制权限等.
还有用来处理触摸消息的两个类KeyInputQueue和InputDispatchThread,一个用来读消息,一个用来分发消息.
客户端
主要包括ActivityThread,Activity,DecodeView及父类View,PhoneWindow,ViewRootImpl及内部类W等
- ActivityThread主要用来和AMS通讯的客户端,Activity是我们编写应用比较熟悉的类
依赖Linux底层能力的驱动
主要是SurfaceFlingger(SF)和Binder驱动
- 每一个窗口都对应一个Surface,SF驱动的作用就是把每一个Surface显示到同一个屏幕上
- Binder 内核驱动的作用,就是为上面的服务端和客户端(或者服务端和服务端之间),提供IPC通讯用的。
Zygote
系统中运行的第一个Dalvik虚拟机程序叫做zygote,该名称的意义是“一个卵”,,因为接下来的所有 Dalvik虚拟机进程都是通过这个“卵” 孵化出来的。
zygote进程中包含两个主要模块,分别如下:
- Socket服务端。该 Socket服务端用于接收启动新的Dalvik进程的命令。
- Framework共享类及共享资源。当zygote进程启动后,会装载一些共享的类及资源,其中共享类是在preload-classes文件中被定义,共享资源是在preload-resources中被定义。因为zygote进程用于孵化出其他Dalvik进程,因此,这些类和资源装载后,新的Dalvik进程就不需要再装载这些类和资源了,这也就是所谓的共享。
zygote进程对应的具体程序是app_rocess,该程序存在于system/bin目录下,启动该程序的指令是 在 init.rc中进行配置的。
Zygote 有️两个优秀的特点
- 每fork出的一个进程都是一个Dalvik虚拟机,独立的进程可以防止一个程序的崩溃导致所有程序都崩溃,这种虚拟机类似Java虚拟机,对于程序员来说,可以直接使用Java开发应用
- zygote进程预先会装载共享类和共享资源,这些类及资源实际上就是SDK中定义的大部分类和资源。因此,当通过zygote孵化出新的进程后,新的APK进程只需要去装载A PK 自身包含的类和资源即可,这就有效地解决了多个APK共享Framework资源的问题。
SystemServer
zygote孵化出的第一个Dalvik进程叫做SystemServer,SystemServer仅仅是该进程的别名,而该进程具体对应的程序依然是app_process,因为SystemSer