第三章 源码目录结构:内核层、系统服务层、框架层与应用层
好,咱们直接进入正题。拿到鸿蒙源码包,第一件事是什么?不是急着编译,而是先把目录结构摸清楚。我刚开始接触鸿蒙时,面对那一堆文件夹也懵过——这玩意儿跟 Linux 内核的目录习惯完全不一样。今天我就带你一层层剥开它。
3.1 内核层目录解析
内核层,说白了就是操作系统的“心脏”。鸿蒙支持多内核,所以它的目录设计也很有意思。
先看顶层:kernel/ 文件夹。里面不是只有一个内核,而是多个。
kernel/
├── liteos_a/ # 针对 Cortex-A 系列处理器
├── liteos_m/ # 针对 Cortex-M 系列微控制器
└── linux/ # Linux 内核适配层
我个人习惯先看 liteos_a。为什么?因为它是鸿蒙的主力内核,跑在手机、平板这类设备上。它的目录结构是这样的:
| 目录/文件 | 作用 |
|---|---|
| arch/ | 架构相关代码,比如 ARM、RISC-V |
| kernel/ | 核心调度、任务管理、IPC |
| fs/ | 文件系统支持 |
| net/ | 网络协议栈 |
| drivers/ | 设备驱动框架 |
嗯,这里要注意:arch/ 目录是你移植时最常打交道的地方。比如你要把鸿蒙跑在一块新的 ARM 芯片上,就得改 arch/arm/ 下的启动代码和中断向量表。
再看 liteos_m,这是给单片机用的。它的目录更精简:
kernel/liteos_m/
├── arch/ # 同样有架构目录
├── components/ # 组件,比如 shell、crypto
├── kernel/ # 微型内核核心
└── osdep/ # 操作系统依赖抽象层
我曾经在一个 IoT 项目里用 liteos_m 移植到 STM32 上。当时踩了个坑:osdep/ 里的抽象层没配好,导致定时器中断一直不触发。后来发现是时钟配置的宏定义没对上。所以移植时,osdep/ 一定要仔细核对。
3.2 系统服务层目录解析
系统服务层,你可以把它理解成“中间件层”。它架在内核之上,为上层提供各种能力。
核心目录是 foundation/。这个名字起得好——它是整个系统的基石。
foundation/
├── ability/ # 能力管理
├── communication/ # 通信服务(Wi-Fi、蓝牙等)
├── distributed/ # 分布式软总线
├── graphic/ # 图形子系统
├── multimedia/ # 多媒体服务
└── security/ # 安全服务
你想想看,为什么叫“系统服务层”?因为这些模块都是独立运行的进程或服务。比如 communication/ 里的 Wi-Fi 服务,它就是一个常驻后台的 daemon。
我建议你重点关注 distributed/ 目录。这是鸿蒙区别于其他系统的核心卖点——分布式能力。里面有个 softbus/ 子目录,就是软总线的实现。我在做多设备协同项目时,就是在这里改的通信协议。
还有一个目录 services/,它存放的是系统服务的具体实现代码。比如:
services/
├── appspawn/ # 应用孵化器
├── account/ # 账号服务
└── netmanager/ # 网络管理
说白了,foundation/ 是接口和框架,services/ 是干活的具体代码。
3.3 框架层与应用层目录解析
框架层,就是给应用开发者用的 API 和运行时环境。目录是 interface/ 和 frameworks/。
先看 interface/:
interface/
├── sdk/ # 对外发布的 SDK 接口
└── inner_api/ # 系统内部接口
sdk/ 里的东西,是应用开发者直接调用的。比如 js/ 子目录,存放的是 JavaScript 框架的接口定义。而 inner_api/ 是系统模块之间调用的,不对外开放。
再看 frameworks/:
frameworks/
├── ace/ # ACE 框架(Ability 运行环境)
├── ai/ # AI 框架
├── app/ # 应用框架
└── multimedia/ # 多媒体框架
这里我要重点提一下 ace/。ACE 是 Ability Cross-platform Environment 的缩写。它是鸿蒙应用运行的“容器”。你写的 JS 或 eTS 代码,最终都在 ACE 里解析执行。
应用层就简单了,目录是 applications/:
applications/
├── sample/ # 示例应用
├── launcher/ # 桌面启动器
├── settings/ # 设置应用
└── camera/ # 相机应用
这些就是预装的应用。裁剪时,如果你不需要相机功能,直接把 camera/ 删掉就行。但要注意,launcher/ 不能删——没有它,系统启动后就是个黑屏。
settings/ 应用会调用 frameworks/app/ 里的接口。所以裁剪应用时,要确保依赖的框架模块还在。
最后,我总结一下这三层的关系:
- 内核层:管硬件,管任务调度,管内存。
- 系统服务层:管通信、管图形、管安全。
- 框架层与应用层:管界面、管交互、管业务逻辑。
你想想看,这三层就像盖房子:内核是地基,系统服务是承重墙,框架和应用是装修。地基不稳,房子会塌;承重墙拆错了,结构就坏了;装修嘛,可以随便换。
嗯,目录结构就讲到这里。下一章我们开始动手,实际裁剪一个最小系统。到时候你会更深刻地理解,哪些目录能删,哪些目录碰不得。