Android系统架构

Android系统架构

Reference:

Android 操作系统是一个软件组件的栈,如图。

https://source.android.google.cn/images/android_framework_details.png

Linux内核

Android平台的基础是Linux内核,比如ART(Android Run Time)虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

  • 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;
  • 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖

此外,内核还做了下列的事情:

电源管理(Power Management) 	针对嵌入式设备的,基于标准Linux电源管理系统的,轻量级的电源管理驱动
低内存管理器 (Low Memory Keller) 	选择性杀死进程来释放需要的内存
匿名共享内存 (Ashmem) 	为进程之间提供共享内存资源,同时为内核提供回收和管理内存的机制
日志(Android Logger) 	一个轻量级的日志设备
定时器(Android Alarm) 	提供一个定时器把设备从睡眠状态唤醒
物理内存映射管理 (Android PMEM) 	DSP及其他设备只能工作在连续的物理内存上,PMEM用于向用户空间提供 连续的物理内存区域映射
文件系统 	Android采用大容量的NAND闪存作为存储设备,使用Yaffs2作为文件系统管理大容量MTD NAND Flash;Yaffs2占用内存小,垃圾回收简洁迅速

HAL

Android系统硬件抽象层(Hardware Abstraction Layer),简写为HAL,是连接Android Framework与Linux内核设备驱动的重要桥梁。HAL存在的意义有以下两个方面:

1)HAL层屏蔽掉不同硬件设备的差异,为Android提供了统一的设备访问接口。不同的硬件厂商遵循HAL标准来实现自己的硬件控制逻辑,应用软件开发者不必关心硬件设备的差异,只需按照HAL提供的标准接口对硬件进行访问即可。

2)HAL层帮助硬件厂商隐藏了设备的核心细节,HAL层位于用户空间,遵循Apache协议,允许硬件厂商不公开源码,将设备相关的实现放在HAL层中实现,并以共享库(.so)的形式进行提供。

简单来说,HAL的作用,向上提供标准接口,屏蔽低层的实现细节,方便应用程序调用,位于用户空间(User Space)。

HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。

也就是说,系统设计者把对硬件的支持分成了两层,一层放在内核空间,一层放在内核空间;其中,硬件抽象层运行在用户空间。

用户空间不属于内核不必遵守GPL协议,各个厂商可以把与自己硬件设备相关,具有商业机密的一些代码放在HAL层。

这也就是安卓被Linux主分支除名的原因。

Android-Runtime 与 Naive Libraries

Android-Runtime:提供名为 Dalvik 虚拟机的关键组件,类似于 Java 虚拟机,但专门为 Android 设计和优化。

Dalvik 虚拟机使得可以在 Java 中使用 Linux 核心功能,如内存管理和多线程。Dalvik 虚拟机使得每一个 Android 应用程序运行在自己独立的虚拟机进程。

Android-Runtime 同时提供一系列核心的库来为 Android 应用程序开发者使用标准的 Java 语言来编写 Android 应用程序。

每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设备运行多个虚拟机。

DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少。

ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。

Naive Libraries

Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖

  • init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
  • init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务
  • init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。

专门为 Android 开发的基于 Java 的程序库,包括应用程序框架库,如用户界面构建,图形绘制和数据库访问。一些 Android 开发者可用的 Android 核心程序库总结如下:

  • android.app - 提供应用程序模型的访问,是所有 Android 应用程序的基石。
  • android.content - 方便应用程序之间,应用程序组件之间的内容访问,发布,消息传递。
  • android.database - 用于访问内容提供者发布的数据,包含 SQLite 数据库管理类。
  • android.opengl - OpenGL ES 3D 图片渲染 API 的 Java 接口。
  • android.os - 提供应用程序访问标注操作系统服务的能力,包括消息,系统服务和进程间通信。
  • android.text - 在设备显示上渲染和操作文本。
  • android.view - 应用程序用户界面的基础构建块。
  • android.widget - 丰富的预置用户界面组件集合,包括按钮,标签,列表,布局管理,单选按钮等。
  • android.webkit - 一系列类的集合,允许为应用程序提供内建的 Web 浏览能力。

看过了 Android 运行层内的基于 Java 的核心程序库,是时候关注一下 Android 软件栈中的基于 C/C++ 的程序库。

实现原理:Syscall && JNI

  • Native与Kernel之间有一层系统调用(SysCall)层
  • Java层与Native(C/C++)层之间的纽带JNI(Java Native Interface)

Framework

Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:

  • 加载ZygoteInit类,注册Zygote Socket服务端套接字
  • 加载虚拟机
  • 提前加载类preloadClasses
  • 提前加载资源preloadResouces
  • System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。
  • Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。

应用框架层以 Java 类的形式为应用程序提供许多高级的服务。应用程序开发者被允许在应用中使用这些服务。

  • 活动管理者 - 控制应用程序生命周期和活动栈的所有方面。
  • 内容提供者 - 允许应用程序之间发布和分享数据。
  • 资源管理器 - 提供对非代码嵌入资源的访问,如字符串,颜色设置和用户界面布局。
  • 通知管理器 - 允许应用程序显示对话框或者通知给用户。
  • 视图系统 - 一个可扩展的视图集合,用于创建应用程序用户界面。

应用程序

Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;

Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。

所有的App进程都是由Zygote进程fork生成的。

posted @ 2020-12-03 15:04  schips  阅读(751)  评论(0编辑  收藏  举报