安卓概述

系统架构

安卓是基于Linux内核的一种在移动设备中非常常用的操作系统,从整体来看它分为以下几层:

image-20251031104359230

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