[Android取经之路] 系列文章:
《系统启动篇》
Android系统架构
Android是怎么启动的
Android 10.0系统启动之init进程
Android10.0系统启动之Zygote进程
Android 10.0 系统启动之SystemServer进程
Android 10.0 系统服务之ActivityMnagerService
Android10.0系统启动之Launcher(桌面)启动流程
Android10.0应用进程创建过程以及Zygote的fork流程
Android 10.0 PackageManagerService(一)工作原理及启动流程
Android 10.0 PackageManagerService(二)权限扫描
Android 10.0 PackageManagerService(三)APK扫描
Android 10.0 PackageManagerService(四)APK安装流程
《日志系统篇》
Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现
《Binder通信原理》:
Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
Android10.0 Binder通信原理(二)-Binder入门篇
Android10.0 Binder通信原理(三)-ServiceManager篇
Android10.0 Binder通信原理(四)-Native-C\C++实例分析
Android10.0 Binder通信原理(五)-Binder驱动分析
Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
Android10.0 Binder通信原理(七)-Framework binder示例
Android10.0 Binder通信原理(八)-Framework层分析
Android10.0 Binder通信原理(九)-AIDL Binder示例
Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
Android10.0 Binder通信原理(十一)-Binder总结
《HwBinder通信原理》
HwBinder入门篇-Android10.0 HwBinder通信原理(一)
HIDL详解-Android10.0 HwBinder通信原理(二)
HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
HwServiceManager篇-Android10.0 HwBinder通信原理(五)
Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
HwBinder原理总结-Android10.0 HwBinder通信原理(十一)
《编译原理》
编译系统入门篇-Android10.0编译系统(一)
编译环境初始化-Android10.0编译系统(二)
make编译过程-Android10.0编译系统(三)
Image打包流程-Android10.0编译系统(四)
Kati详解-Android10.0编译系统(五)
Blueprint简介-Android10.0编译系统(六)
Blueprint代码详细分析-Android10.0编译系统(七)
Android.bp 语法浅析-Android10.0编译系统(八)
Ninja简介-Android10.0编译系统(九)
Ninja提升编译速度的方法-Android10.0编译系统(十)
Android10.0编译系统(十一)
本文主要介绍Android的系统架构,Android使用linux内核(Marco kernel),但是Android的架构又与Linux系统有所不同,因此在介绍Android系统架构之前,我们先一起来了解一下Linux系统的架构。
Linux系统架构
Linux架构如下图所示:
Computer Resources:硬件资源
Kernel:内核
Shell:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器
Programs/Utilities/Tools:库函数、工具等
File systems:文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。
User Application: Linux应用,标准的Linux系统一般都有一套被称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公套件、Internet工具和数据库等
Linux系统一般由4个组成部分:内核Kernel、shell、文件系统和应用程序。内核、shell和文件系统一起组成了基本的操作系统结构,它们让用户可以管理文件、运行程序并使用系统。
Linux开机后,内核启动,激活内核空间,抽象硬件、初始化硬件参数等,运行并维护虚拟内存、调度器、信号及进程间通信(IPC)。
内核启动后,再加载Shell和用户应用程序,用户应用程序使用C\C++编写,被编译成机器码,形成一个进程,通过系统调用(Syscall)与内核系统进行联通。进程间交流需要使用特殊的进程间通信(IPC)机制。
看完了Linux架构,我们再来一起看看Android系统架构。Android的系统非常复杂和庞大,底层以Linux内核为基础,上层采用带有虚拟机的JAVA层,通过JNI技术,将上下层打通。
先来看一张Google提供经典Android架构图,从上往下依次为应用层(System Apps)、应用框架层(Java API Framework)、运行层(系统Native库和Android运行时环境)、硬件抽象层(HAL)、Liunx 内核(Marco Kernel)。每一层都有对应的进程、系统库。
应用层(System Apps)
该层中包含所有的Android应用程序,包括电话、相机、日历等,我们自己开发的Android应用程序也被安装在这层;大部分的应用使用JAVA开发,现在Google也开始力推kotlin进行开发
应用框架层(Java API Framework)
这一层主要提供构建应用程序是可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用API来构建自己的应用程序。
运行层
1)系统Native库
Android包含一些C/C++库,这些库能被Android系统中不同的组件使用
2)Android运行时环境
Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。虚拟机也在该层启动。
每个Android应用都有一个专有的进程,这些进程每个都有一个Dalivik虚拟机实例,并在该实例中运行。
硬件抽象层(HAL)
Android的硬件驱动与Linux不同,传统的Liunx内核驱动完全存在于内核空间中。但是Android在内核外部增加了一个硬件抽象层(HAL-Hardware Abstraction Layer),把一部分硬件驱动放到了HAL层。
为什么Android要这么做呢?
Linux内核采用了GPL协议,如果硬件厂商需要支持Linux系统,就需要遵照GPL协议公开硬件驱动的源代码,这势必会影响到硬件厂家的核心利益。
Android的HAL层运行在用户空间,HAL是一个“空壳”,Android会根据不同的需要,加载不同的动态库。这些动态库由硬件厂家提供。硬件厂家把相关硬件功能写入动态库,内核中只开放一些基本的读写接口操作。这样一些硬件厂家的驱动功能就由内核空间移动到了用户空间。
Android的HAL层遵循Apache协议,并不要求它的配套程序,因此厂家提供的驱动库不需要进行开放,保护了硬件厂家的核心利益。
Liunx 内核(Marco Kernel)
Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。