11335240-f4923cc40cfd7996.png
1、Application应用层
上层应用,比如我们编写的项目、系统应用。主要有java / kotlin语言编写。
2、FrameWork应用框架层
为开发人员提供了可以开发应用程序所需要的API.
-
ActivityManager
负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManager是管理和掌控所有的Activity. -
WindowManager
控制窗口的显示、隐藏以及窗口的层序,简单来说,它就是管理窗口的,大多数和View有关系的都要和它打交道。 -
NotificationManager
使得应用程序可以在状态栏中显示自定义的提示信息 -
PackageManager
管理所有安装在Android系统中的应用程序 -
TelephonyManager
管理所有的移动设备功能 -
ResourceManager
提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 -
LocationManager
提供地理位置以及定位功能服务 -
ContentPaoviders
使得不同应用程序之间可以共享数据 -
ViewSystem
构建应用程序的基本组件 -
XMPPService
可扩展通讯和表示协议。前身为Jabber,提供即时通信服务。例如推送功能,Google Talk
Framework层才真正是Java语言实现的层,在这层里定义的API都是用Java语言编写
3、Native Library层+Android Runtime
系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。
-
AndroidRuntime
运行时库又分为核心库和ART,核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。
-
JVM - Dalvik - ART
相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。
4、HAL层(定义了HIDL接口,硬件抽象层)
将控制硬件的动作放在硬件抽象层中。
5、Linux Kernel
Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
Android系统进程角度-gityuan
Zygote是什么?
Zygote进程又称受精卵进程。
Zygote为什么叫受精卵进程?
因为Android中所有的应用进程都是由Zygote进程孵化出来的。
为什么所有进程都是由Zygote孵化?
1. Zygote进程在启动的时候会创建一个虚拟机实例,因此通过Zygote进程创建的子进程都会继承这个虚拟机实例,App中的JAVA代码可以得到翻译执行。
2. 进程与进程之间需要跨进程通信,由Zygote进程作为父进程还可以获得一个Binder线程池,这样进程之间就可以使用Binder进行跨进程通信了。
3. 由Zygote进程作为父进程,子进程可以获得一个消息循环。
Zygote都孵化了那些进程(做了什么)?
-
启动SystemServer进程
SystemServer 进程,是zygote 进程启动的过程中,孵化出来的第一个进程。 -
孵化应用进程
相机APP、短信APP...
Zygote的启动流程?
启动流程- Init进程(Linux内核启动的第一个用户级进程)通过解析配置文件需要启动app_process程序。在app_main的main函数中做了更名为zygote的操作。
- 创建AppRuntime(为AndroidRuntime的子类)创建虚拟机、注册JNI函数后通过JNI调用ZygoteInit进入Java世界。
- 创建名为zygote的LocalServerSocket,通过这函数他可以响应子孙后代的请求同时zygote
- preloadClasses:执行时间比较长,这是导致Android系统启动慢的原因之一,
- preloadResources:主要加载framework-res.apk中的资源,在UI编程中常常饮用的com.android.R.***资源是系统默认资源是由zygote记载的。
- fork出SystemServer
- 通过runSelectLoop循环处理进程创建请求,一旦接收到请求启用runOnce函数fork出子进程
注:
- startVm这里调用JNI的函数创建虚拟机,这个函数主要设置一些创建时的参数。
- startReg给创建的虚拟机注册一些JNI函数,因为进入Java世界后这些原本用Native方式实现的函数必须提前注册才可以正常的在java世界使用。
- registerZygoteSocket:Zygote在系统中没有使用Binder而是使用Socket,这个函数正式为了建立这个Socket
- Zygote再从startSystemServer返回之后会调用runSelectLoopMode启用在registerZygoteSocket中注册的socket.
SystemServer进程,Zygote生死与共?
- setSignalHandler函数,在Zygoth进程forkz子进程前调用,其中设置了信号处理函数,在信号处理函数中有判断pid为SystemServer的死亡信号,Zygote会杀死自己。
- SystemServer进程启动后会关闭从Zygote那里继承的socket,与Binder通信系统建立联系
SystemServer中运行的进程公共有六十多种,主要包括:
ActivityManagerService(AMS)
WindowManagerService(WMS)
PackagManagerService(PMS)...;
这些系统服务都是以一个线程的方式存在Systemserver进程中。
网友评论