Android内核简介

目录

  • Android系统架构
  • Android和Linux的关系

目的

  • 了解Android底层的组织结构
  • 了解Android历史发展
  • 了解Android和Linux关系

Android系统架构

整体系统架构图:

total_img

(由下往上)五层结构:

  • Linux Kernel
  • HAL(hardware abstraction layer)
  • Native C/C++ Libraries & Android Runtime
  • Java Framework
  • Applications

Linux Kernel

android平台的基础是Linux内核。android系统最终的功能实现都是通过linux kernel完成,如Android Runtime(ART) 就是依靠linux内核来执行诸如线程和内存管理等。

HAL(hardware abstraction layer)

硬件抽象层(HAL),它是设备内核驱动的抽象接口,实现向更高级别的Java API框架提供访问底层设备的应用编程接口。HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个接口。当框架API要求访问设备硬件时,Android系统将为该硬件组件加载库模块。

Native C/C++ Libraries

Android核心运行时库,可提供Java API框架使用的Java编程语言大部分功能,包括一些java 8语言功能。原生C/C++库 :核心Android系统组件和服务(如ART和HAL)构建自原生代码,需要以C和C++编写的原生库。
Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。如,通过 Android框架Java OpenGL API访问OpenGL ES,以支持在应用中绘制和操作2D和3D图形。
开发的C或C++代码的应用,可以使用Android NDK直接从原生代码访问某些原生平台库。

Android Runtime

对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime(ART)实例。
ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。
编译工具链将 ava源代码编译为DEX字节码,使其可在Android平台上运行。
部分主要功能有:预先(AOT)编译 、优化的垃圾回收(GC) 、更好的调试支(包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段)

Java API Framework

以Java语言编写的API使用Android OS的整个功能集。这些API形成创建Android应用所需的构建模块,它们可简化核心模块化系统组件和服务的重复使用。以下是部分功能服务:

  • View System (构建应用的UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器)
  • Resource Manager (访问非代码资源,如本地化的字符串、图形和布局文件)
  • Notification Manager (可让所有应用在状态栏中显示自定义提醒)
  • Activity Manager (用于管理应用的生命周期,提供常见的导航返回栈)
  • Content Providers (可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据)

Application

Android系统附带的用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用,以及用户选择安装的应用一样,没有特殊状态。
系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。

Android和Linux的关系

代码运行流程

用户使用Java(字节码)编写的Android应用程序代码,通过Android Runtime转变机器码语言,然后调用Linux内核中的操作,通过Linux内核操作电路。

android_kernel_2

Android和Linux的总体关系

  • Android采用Linux作为内核。
  • Android对Linux内核做了修改,目的是适合在移动设备上的使用。
  • Android开始是作为Linux的一个分支,后来由于无法并入Linux的主开发树,已被Linux内核组从开发树中删除。

Android版本和Linux内核版本关系

android_kernel_3

Android和Linux内核的区别

Android虽然是采用Linux为内核,但是有很多方面因为需要设配移动设备,所以Android对Linux内核进行修改,以下是它们主要的不同之处:

  • Android Binder
  • Android电池管理(PM)
  • 低内存管理器(Low Memory Killer)
  • 匿名共享内存(Ashmem)
  • Android PMEM(physical)
  • Android Logger
  • Android Alarm
  • USB Gadget 驱动
  • Android RAM Console
  • Android timed device
  • Yaffs2文件系统

Android继承于Linux

Android是在Linux的内核基础之上运行的,提供的核心服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层次。但是严格来说它不算是Linux操作系统。

安全

Linux系统中的用户和权限:

  • user 文件拥有者。
  • group 同组用户,和网上邻居的group类似。
  • other 可以访问系统的其他用户。

文件及目录权限的功能:

  • 读权限(r):只允许指定用户读取相应文件的内容,禁止操作。
  • 写权限(w):表示允许指定用户打开并修改文件。
  • 执行权限(x):允许将该文件作为一个程序执行。文件所有者自动拥有对该文件的读、写和可执行权限。

内存管理

内存管理对于开发人员来说虽然不用担心管理,但是对计算机编程是最为基础的领域之一。当空间有限,而内存需求是变化的,就需要用一些方法来满足下面的需求。

  • 确定是否有足够的内存来处理数据。
  • 从可用的内存中获取一部分内存。
  • 向可用内存池中返回部分内存,以使其可以由程序的其他部分或其他程序使用。

实现上述需求的程序称为分配程序(allocator),因为它们负责分配和回收内存。

进程管理

在Linux操作系统中包括如下三种不同类型的进程:

  • 交互进程:由shell启动的程序。
  • 批处理进程:批处理进程和终端没有联系,是一个进程序列。
  • 守卫进程:系统守护进程是Linux系统启动时启动的进程,在后台运行。

父进程和子进程:

父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之被终结,但是子进程被终结时,父进程不会被终结。

进程命令:

  • 监视进程命令
  • 控制进程命令
  • 进程优先级设定

设备驱动管理

通常可以将外设分为以下两块:

  • 字符设备:提供连续的数据流,应用程序可以顺序的读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。调制解码器(一种计算机硬件,它能把计算机的数字信号翻译成可沿普通电话线传送的模拟信号,而这些模拟信号又可被线路另一端的另一个调制解调器接收,并译成计算机可懂的语言。)是典型的字符设备。
  • 块设备:应用程序可以随机访问设备数据,程序可自动确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

网络

网卡也可以通过设备驱动程序控制,但在内核中属于特殊情况,因为网卡不能利用设备文件访问。原因在于在网络通信期间,数据打包到了各种协议层中。在接受到数据是,内核必须针对各协议层的处理,对数据进行拆包和分析,然后才能将有效数据传递给应用程序。在发送数据时,内核必须首先根据各个协议层的要求打包数据,然后才能发送。

为了支持通过文件接口处理网络连接(按照应用程序的观点),Linux使用了源于BSD的套接字抽象。套接字可以看做应用程序、文件接口、内核的网络实现之间的代理。