001 安卓概述
安卓概述
系统架构
安卓是基于Linux内核的一种在移动设备中非常常用的操作系统,从整体来看它分为以下几层:
Linux内核层
- 提供硬件驱动(显示、摄像头、蓝牙等)和OS的基本功能(进程调度、内存管理、电源管理、安全、网络协议栈…等)
- 基于开源Linux内核,在此基础上添加了部分安卓专用的驱动
安卓对于Linux内核的改动
1.出于效率,安卓没有使用glibc,而是采用了google开发的Bionic Libc
2.没有完全照搬Linux内核,除了修正一些Bug外,还加了不少内容,比如补充了一些文件系统
3.没有本地基于X服务的窗口系统
4.对Linux的驱动框架进行了增强,比如Binder、电源管理、USB…
硬件抽象层(HAL)
作用:标准化硬件接口(如相机、传感器),允许厂商定制驱动而不影响上层框架。保护了硬件厂商的知识产权,隐藏特定平台的硬件接口细节
实现形式:
- 传统 HAL(Android 8 之前):直接通过 动态库(.so) 调用驱动
- 现代 HAL(Android 8+):通过 HIDL/AIDL定义接口,实现进程隔离
HIDL和AIDL是”接口定义语言“,类似protobuf或者ROS的msg之类的
系统运行库层
核心作用:提供执行环境与高性能计算支持
系统运行库层分为2部分,C/C++程序库(Native)和Android运行时库
- Native库:
- 核心库:SQLite、OpenGL ES、WebKit
- 功能支持:为应用框架层提供C/C++底层能力
- Android运行时库:
- 核心库:提供JAVA语言核心库的大多数功能
- ART/Dalvik
- Dalvik虚拟机:类似JVM,每个Dalvik应用都是个独立的Linux进程。在Dalvik下,应用程序每次运行时,都通过JIT实时翻译成机器码来运行
- ART:在安卓5.0后替代Dalvik虚拟机,在应用第一次安装后,字节码就会预先编译成机器码,使其真正成为本地应用
应用框架层
应用框架层(JAVA Framework)提供应用开发的API与系统服务,这层由JAVA编写
应用层
系统内置应用以及所有非系统级的系统应用都是应用层,负责与用户直接进行交互,通常用JAVA开发
Framework层及APP层都是用JAVA开发的,如果需要调用内核或者Native库,则要用JNI来提供JAVA调用C/C++的能力
源码获取
跟移植Linux内核/U-Boot一样,获得安卓的源码也有3种途径:
- 主线安卓源码(AOSP):这是Google开源的原生安卓源码,这个源码支持的CPU比较少,一般除了芯片原厂都不会使用这个源码
- 芯片原厂为自己CPU移植的安卓源码:每当安卓主线更新后,芯片原厂会为自己的SoC移植安卓,比如海康用的RK3588的安卓SDK就是原厂提供的,并非他们自己移植的
- 设备厂商移植的安卓源码:如果设备厂商使用某个SoC自己设计了款硬件,为了能够在自己的设备上成功运行安卓,会基于芯片原厂的代码进一步修改,主要集中在驱动部分
如何把芯片原厂的安卓源码移植到自己的设备上呢?
- 按照系统启动的顺序:uboot -> kernel -> 安卓rootfs
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
