Android随笔-平台架构

发布时间:2026/7/25 22:46:24
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 层硬件抽象层HALAndroid 不想把硬件访问代码直接塞进内核避免 GPL 传染、方便厂商闭源所以在内核之上加了一层标准化接口。应用 → Framework → HAL 接口定义AIDL/HIDL→ 厂商 HAL 实现 → 内核驱动 → 硬件类型说明Legacy HAL早期以共享库.so形式存在由 Framework 直接 dlopenHIDL 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 RuntimeART特性说明AOT 编译安装时把字节码编译成机器码.oat/.vdex运行时直接执行GC并发标记清除Concurrent Copying GC减少卡顿JIT 回退Android 7 混合模式热代码 JIT 编译冷代码 AOTProfile-S Guided根据用户使用习惯优化编译Kotlin/Java 代码最终在这里被 ART 翻译成 CPU 指令。B. Native Libraries库用途SurfaceFlinger你之前问过的负责合成所有 Layer 的图像送显OpenGL ES / Vulkan图形渲染Skia、HWUI 都依赖它WebView / Chromium网页渲染引擎MediaCodec音视频硬解码通过 OMX/Codec2 调用 HALSQLite本地数据库Binder IPC 库(libbinder)Framework 的Binder.java底层就是调这个第 4 层应用框架层Application FrameworkSystemServer 所在的位置。服务/组件职责对应进程ActivityManagerService (AMS)管理 Activity 生命周期、进程调度、任务栈system_serverWindowManagerService (WMS)管理窗口层级、Surface 分配、输入事件分发system_serverPackageManagerService (PMS)APK 安装/卸载/权限管理、组件解析system_serverContentProvider跨进程数据共享各应用进程 / system_serverView System / ResourceManagerUI 测量布局绘制、资源加载应用进程NotificationManager通知栏管理system_serverLocationManagerGPS/网络定位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 层// 你写的代码valamgetSystemService(Context.ACTIVITY_SERVICE)asActivityManager底层通过 Binder IPC 调用 system_server 里的 AMS。2. Framework 层 ↔ Native 层Framework 的 Java 代码通过 JNIJava 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、InputHALhardware/interfaces/HIDL/AIDL 定义内核kernel/或common/Binder 驱动、各子系统ARTart/Bionic libcbionic/五、总结内核层管硬件和进程HAL 层隔离厂商实现Native 层做图形/媒体/虚拟机Framework 层管应用生命周期和系统服务应用层写业务逻辑。层与层之间靠 Binder IPC跨进程、JNI跨语言、HAL 接口跨硬件粘合。