第三章 源码目录结构:内核层、系统服务层、框架层与应用层

好,咱们直接进入正题。拿到鸿蒙源码包,第一件事是什么?不是急着编译,而是先把目录结构摸清楚。我刚开始接触鸿蒙时,面对那一堆文件夹也懵过——这玩意儿跟 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/ 下的启动代码和中断向量表。

我的经验: 移植时别一上来就改 kernel/ 核心调度代码。先动 arch/ 和 drivers/,把板级支持包调通。内核调度层,说实话,99% 的情况不需要动。

再看 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/ 子目录,就是软总线的实现。我在做多设备协同项目时,就是在这里改的通信协议。

避坑指南: 系统服务层的裁剪要谨慎。我曾经为了省内存,把 graphic/ 服务整个砍掉了。结果发现上层应用启动时直接崩溃——因为应用框架依赖图形服务来创建窗口。所以裁剪前,一定要先看依赖关系。

还有一个目录 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/ 不能删——没有它,系统启动后就是个黑屏。

注意: 应用层代码虽然看起来独立,但它们依赖框架层的 API。比如 settings/ 应用会调用 frameworks/app/ 里的接口。所以裁剪应用时,要确保依赖的框架模块还在。

最后,我总结一下这三层的关系:

  • 内核层:管硬件,管任务调度,管内存。
  • 系统服务层:管通信、管图形、管安全。
  • 框架层与应用层:管界面、管交互、管业务逻辑。

你想想看,这三层就像盖房子:内核是地基,系统服务是承重墙,框架和应用是装修。地基不稳,房子会塌;承重墙拆错了,结构就坏了;装修嘛,可以随便换。

嗯,目录结构就讲到这里。下一章我们开始动手,实际裁剪一个最小系统。到时候你会更深刻地理解,哪些目录能删,哪些目录碰不得。