2、Android系统架构概览:Linux内核层、硬件抽象层(HAL)、系统服务层、应用框架层。

好,咱们今天来聊聊Android系统的“骨架”。很多初学者一上来就写应用,觉得底层跟自己没关系。但我个人习惯是,先搞清楚系统怎么搭的,出了问题才知道去哪找答案。Android系统不是一块铁板,它是一层一层堆起来的。你想想看,就像盖房子,有地基、有框架、有水电、最后才是装修。

Android的架构,从下往上,主要分为四层:Linux内核层硬件抽象层(HAL)系统服务层应用框架层。每一层都有它的活,谁也替不了谁。

应用框架层 (Application Framework) Activity Manager | Window Manager | Content Providers | View System Package Manager | Telephony Manager | Resource Manager | Location Manager 系统服务层 (System Services) SurfaceFlinger | AudioFlinger | MediaServer | Sensor Service Binder IPC 驱动 | 系统守护进程 (servicemanager, installd) 硬件抽象层 (HAL) Camera HAL | Audio HAL | Sensors HAL | GPS HAL | Wi-Fi HAL Bluetooth HAL | Graphics HAL (Gralloc, HWComposer) Linux内核层 (Linux Kernel) 进程调度 | 内存管理 | 文件系统 | 网络协议栈 硬件驱动 (Display, Camera, Audio, Wi-Fi, Bluetooth, USB) 数据流与调用方向(自下而上:硬件 → 内核 → HAL → 服务 → 应用) 每一层都依赖下一层提供的接口,上层无需关心下层的具体实现

1. Linux内核层:系统的地基

Android系统最底下,就是Linux内核。说白了,它就是Android和硬件之间的翻译官。没有它,你的手机就是一坨废铁。我刚开始做嵌入式时,总觉得内核离我很远,直到有一次调试一个触摸屏驱动,才发现内核直接决定了硬件能不能正常工作。

这一层负责的事情很杂,但核心就几样:

  • 进程管理:谁该运行,谁该睡觉,内核说了算。
  • 内存管理:App多了怎么办?内核来分配和回收。
  • 硬件驱动:摄像头、屏幕、Wi-Fi、蓝牙……所有硬件都要通过驱动跟系统对话。
  • 安全机制:基于Linux的用户权限模型,每个App都是一个独立的Linux用户。

关键点:Android用的不是标准Linux,而是经过Google改造的。比如它加了wakelock(唤醒锁)机制,用来管理手机的休眠和唤醒。我遇到过一个问题:App后台频繁获取wakelock,导致手机一晚上掉电30%。嗯,这就是内核层没管好。

2. 硬件抽象层(HAL):给硬件穿上“马甲”

Linux内核之上,就是HAL层。你可能会问:为什么要有这一层?直接让系统服务调用内核驱动不行吗?

答案是:不行。因为硬件厂商太多了。每家做的摄像头、音频芯片都不一样。如果系统服务直接跟驱动打交道,那Google得累死——每换一个硬件就要改一次系统服务。

HAL的作用,就是给硬件定义一个统一的接口。厂商只需要按照这个接口实现自己的驱动库,系统服务不用管底层是谁家的硬件。说白了,就是“接口标准化”。

常见的HAL模块有:

  • Camera HAL:控制摄像头预览、拍照、录像。
  • Audio HAL:管理音频输入输出。
  • Sensors HAL:处理加速度计、陀螺仪等传感器数据。
  • Graphics HAL:包括Gralloc(图形缓冲区管理)和HWComposer(硬件合成器)。

避坑指南:我曾经在移植一个音频HAL时,发现声音总是断断续续。查了两天,最后发现是HAL层返回的缓冲区大小跟内核驱动不匹配。所以,写HAL时一定要跟内核驱动对好“暗号”——缓冲区大小、采样率、格式,一个都不能错。

3. 系统服务层:系统的“大管家”

再往上,就是系统服务层。这一层是Android系统的核心,所有重要的功能都在这里实现。你平时用的打电话、看视频、听音乐,背后都是系统服务在干活。

系统服务层运行在独立的进程中,通过Binder IPC(进程间通信)跟应用层打交道。我刚开始学Binder时觉得特别绕,后来理解了:它就是Android版的“快递员”,负责把数据从一个进程送到另一个进程。

主要的系统服务包括:

服务名称 功能描述
SurfaceFlinger 负责合成所有应用的界面,然后输出到屏幕
AudioFlinger 管理音频的播放和录制
MediaServer 处理视频、音频的编解码
Sensor Service 统一管理所有传感器数据
Activity Manager 管理应用的生命周期和任务栈

注意:系统服务层如果挂了,整个系统就会重启(俗称“软重启”)。我遇到过SurfaceFlinger崩溃,屏幕直接黑掉,然后过几秒又亮起来。所以,写系统服务时一定要做好异常处理,别让一个bug拖垮整个系统。

4. 应用框架层:开发者的“工具箱”

最上面这一层,就是咱们开发者最熟悉的——应用框架层。它提供了一整套API,让你不用关心底层怎么实现,直接调用就行。

比如你想显示一个界面,调用Activity;想弹个提示,调用Toast;想存数据,调用SharedPreferences。这些类都在应用框架层里。

应用框架层的主要组件:

  • Activity Manager:管理Activity的生命周期。
  • Window Manager:管理窗口的显示和布局。
  • Content Providers:实现跨应用的数据共享。
  • View System:构建用户界面的基础,比如Button、TextView。
  • Package Manager:管理应用的安装、卸载、权限。
  • Resource Manager:管理资源文件,比如字符串、图片、布局。

我的经验:做嵌入式Android开发时,应用框架层往往不是瓶颈。真正的坑在HAL和内核层。比如你写一个App调用摄像头,如果底层Camera HAL没写好,你的App再怎么优化也没用。所以,我建议做嵌入式开发的朋友,一定要把下面三层搞明白,不然出了问题你都不知道从哪查起。

各层之间的协作

这四层不是孤立的,它们通过固定的接口互相调用。举个例子:

  1. 用户点击屏幕上的“拍照”按钮(应用框架层)。
  2. 应用通过Binder调用Camera Service(系统服务层)。
  3. Camera Service调用Camera HAL的接口(硬件抽象层)。
  4. Camera HAL通过内核驱动控制摄像头硬件(Linux内核层)。
  5. 摄像头采集到数据后,原路返回:内核→HAL→服务→应用。

你看,一次简单的拍照,背后四层都在干活。哪一层出了问题,照片都拍不出来。

小技巧:调试时可以用logcat看应用层的日志,用dmesg看内核层的日志。如果应用层报错但内核没报错,问题大概率在HAL或系统服务层。反过来,如果内核报错了,那基本就是驱动或硬件的问题。

好了,Android系统架构的四层结构就讲到这里。记住:底层决定上限,上层决定效率。做嵌入式开发,别只盯着应用层,多往下看看,你会打开新世界的大门。


公众号:蓝海资料掘金营,微信deep3321