Android随笔-平台架构

Android 系统架构采用分层设计,从上到下大致分为五层。

一、总体架构图

┌─────────────────────────────────────────────────────────────┐ │ 第 5 层:应用层 (Applications) │ │ System UI、Launcher、Settings、微信、抖音... │ │ (Java/Kotlin 代码,SDK API) │ ├─────────────────────────────────────────────────────────────┤ │ 第 4 层:应用框架层 (Application Framework) │ │ ActivityManagerService、WindowManagerService、 │ │ PackageManagerService、ContentProvider、ResourceManager... │ │ (Java 代码,system_server 进程) │ ├─────────────────────────────────────────────────────────────┤ │ 第 3 层:系统运行库层 (Native Libraries & Android Runtime) │ │ SurfaceFlinger、OpenGL ES、SQLite、WebView、Media Codec、 │ │ ART 虚拟机、libc、Binder IPC 库... │ │ (C/C++ 代码,.so 共享库) │ ├─────────────────────────────────────────────────────────────┤ │ 第 2 层:硬件抽象层 (HAL - Hardware Abstraction Layer) │ │ Camera HAL、Audio HAL、Sensors HAL、GPS HAL、Wi-Fi HAL... │ │ (C/C++ 接口,由厂商实现) │ ├─────────────────────────────────────────────────────────────┤ │ 第 1 层:Linux 内核层 (Linux Kernel) │ │ 进程调度、内存管理、网络协议栈、电源管理、 │ │ Binder 驱动、显示驱动、输入子系统、Camera 驱动... │ │ (C 代码,内核态) │ └─────────────────────────────────────────────────────────────┘

二、逐层详解

第 1 层:Linux 内核层

这是 Android 的地基,负责硬件资源管理和进程隔离

模块说明
进程管理调度 CPU 时间片,管理进程生命周期(fork、kill、信号)
内存管理虚拟内存、OOM 机制、Ashmem(匿名共享内存)
Binder 驱动你之前问的 Binder IPC 机制的核心。内核态的 Binder 驱动负责跨进程通信的数据拷贝和线程调度
显示驱动Framebuffer、DRM/KMS,最终把图像数据送到屏幕
输入子系统管理触摸屏、按键的底层事件(/dev/input/event*
网络协议栈TCP/IP、Wi-Fi 驱动、蓝牙协议栈

关联知识:Zygote 进程通过 fork() 系统调用(内核提供)孵化应用进程;Binder 驱动是 Framework 层所有 IPC 的根基。

第 2 层:硬件抽象层(HAL)

Android 不想把硬件访问代码直接塞进内核(避免 GPL 传染、方便厂商闭源),所以在内核之上加了一层标准化接口

应用 → Framework → HAL 接口定义(AIDL/HIDL)→ 厂商 HAL 实现 → 内核驱动 → 硬件
类型说明
Legacy HAL早期以共享库(.so)形式存在,由 Framework 直接 dlopen
HIDL HALAndroid 8.0 引入,通过 Binder IPC 调用,支持独立更新
AIDL HALAndroid 11 起逐步替代 HIDL,统一用 AIDL

例子:Camera 拍照流程

Camera App → CameraManager (Framework) → CameraService (Native) → Camera HAL (厂商实现,如 Qualcomm CAMX) → Camera 驱动 → 硬件传感器

第 3 层:系统运行库层

这一层是 Native 世界,包含两部分:

A. Android Runtime(ART)
特性说明
AOT 编译安装时把字节码编译成机器码(.oat/.vdex),运行时直接执行
GC并发标记清除(Concurrent Copying GC),减少卡顿
JIT 回退Android 7+ 混合模式,热代码 JIT 编译,冷代码 AOT
Profile-S Guided根据用户使用习惯优化编译

Kotlin/Java 代码最终在这里被 ART 翻译成 CPU 指令。

B. Native Libraries
用途
SurfaceFlinger你之前问过的,负责合成所有 Layer 的图像,送显
OpenGL ES / Vulkan图形渲染,Skia、HWUI 都依赖它
WebView / Chromium网页渲染引擎
MediaCodec音视频硬解码,通过 OMX/Codec2 调用 HAL
SQLite本地数据库
Binder IPC 库(libbinder)Framework 的Binder.java底层就是调这个
第 4 层:应用框架层(Application Framework)

SystemServer 所在的位置。

服务/组件职责对应进程
ActivityManagerService (AMS)管理 Activity 生命周期、进程调度、任务栈system_server
WindowManagerService (WMS)管理窗口层级、Surface 分配、输入事件分发system_server
PackageManagerService (PMS)APK 安装/卸载/权限管理、组件解析system_server
ContentProvider跨进程数据共享各应用进程 / system_server
View System / ResourceManagerUI 测量布局绘制、资源加载应用进程
NotificationManager通知栏管理system_server
LocationManagerGPS/网络定位system_server

关键机制:

  • SystemServer 启动后,在这里注册各种 Service。
  • 应用通过 Context.getSystemService() 获取 Binder Proxy,与 system_server 里的 Binder Stub 通信。
  • Activity 启动流程,就是应用进程↔ AMS ↔ WMS 在这一层的协作。

第 5 层:应用层

最上层,直接面向用户。

类型例子
系统应用Phone、Contacts、Settings、Launcher、SystemUI
第三方应用微信、抖音、你的 App

每个应用运行在独立的沙箱进程中,拥有独立的 UID 和虚拟机实例。应用之间默认不能互相访问内存,必须通过 Framework 提供的 IPC 机制通信。

三、层与层之间如何通信

1. 应用层 ↔ Framework 层

// 你写的代码valam=getSystemService(Context.ACTIVITY_SERVICE)asActivityManager

底层通过 Binder IPC 调用 system_server 里的 AMS。

2. Framework 层 ↔ Native 层

Framework 的 Java 代码通过 JNI(Java Native Interface) 调用 C/C++ 库。

// Surface.javaprivatenativelongnativeCreateFromSurfaceTexture(...);

3. Native 层 ↔ HAL 层

通过 HIDL/AIDL 接口 或直接的函数调用(Legacy HAL)。

4. HAL 层 ↔ 内核层

标准的 Linux 系统调用、ioctl、读写设备节点(/dev/xxx)。

四、AOSP 源码目录对应

层级AOSP 路径
应用层packages/apps/
Frameworkframeworks/base/(AMS、WMS、PMS 在这里)
Native 库frameworks/native/(SurfaceFlinger、Input)
HALhardware/interfaces/(HIDL/AIDL 定义)
内核kernel/common/(Binder 驱动、各子系统)
ARTart/
Bionic libcbionic/

五、总结

内核层管硬件和进程,HAL 层隔离厂商实现,Native 层做图形/媒体/虚拟机,Framework 层管应用生命周期和系统服务,应用层写业务逻辑。
层与层之间靠 Binder IPC(跨进程)、JNI(跨语言)、HAL 接口(跨硬件)粘合。