# appspawn 系统架构文档 ## 1. 系统概述 appspawn 是 OpenHarmony 操作系统的**应用进程孵化器**(Application Process Spawner),负责接收应用框架(如 Ability Manager Service)的命令,孵化(fork)出应用进程,并为其配置安全沙箱、权限、UID/GID 等运行时环境。appspawn 在系统启动时由 init 进程拉起,通过本地 socket 监听来自客户端的孵化请求。 appspawn 支持多种孵化模式,包括标准应用孵化(appspawn)、NWeb 渲染进程孵化(nwebspawn)、原生进程孵化(nativespawn)、混合孵化(hybridspawn)以及 CJ 应用孵化(cjappspawn)。此外还支持冷启动模式(cold run),即在已 fork 的子进程中直接执行应用,跳过 fork 步骤以加速启动。 系统采用**模块化 Hook 架构**:核心服务通过 Hook 机制(`appspawn_hook.h` 中定义的 `AppSpawnHookStage`)将各个功能模块(沙箱、权限、SPM、ACE 适配等)以插件形式挂载到孵化流程的不同阶段。模块通过 `MODULE_CONSTRUCTOR` 宏在加载时自动注册 Hook,实现了核心逻辑与扩展功能的解耦。 --- ## 2. 架构图 ### 2.1 系统组件架构 ```mermaid graph TD subgraph 客户端 AMS[Ability Manager Service] CLIENT[appspawn_client
客户端 SDK] end subgraph appspawn服务端 MAIN[appspawn_main
主入口] SERVICE[appspawn_service
核心服务] MSGMGR[appspawn_msgmgr
消息管理] APPMGR[appspawn_appmgr
应用管理] FDMGR[appspawn_fd_manager
FD管理] SERVER[appspawn_server
通用服务层] end subgraph Hook模块系统 MODULEMGR[modulemgr
模块管理器] HOOKENGINE[module_engine
Hook引擎] SANDBOX[sandbox
沙箱模块] SPM[spm
权限管理模块] COMMON[common
通用模块] ACEADAPTER[ace_adapter
ACE适配器] NATIVEADAPTER[native_adapter
原生适配器] NWEBADAPTER[nweb_adapter
NWeb适配器] SYSEVENT[sysevent
系统事件] ASAN[asan
ASAN检测器] end subgraph 客户端接口 API[appspawn.h
公共API] MSG[msg.h
消息定义] end subgraph 工具层 UTIL[util
工具类] end AMS -->|Socket IPC| CLIENT CLIENT -->|Socket| MSGMGR MSGMGR --> SERVICE MAIN --> SERVICE SERVICE --> SERVER SERVICE --> APPMGR SERVICE --> FDMGR SERVICE --> MODULEMGR MODULEMGR --> HOOKENGINE HOOKENGINE --> SANDBOX HOOKENGINE --> SPM HOOKENGINE --> COMMON HOOKENGINE --> ACEADAPTER HOOKENGINE --> NATIVEADAPTER HOOKENGINE --> NWEBADAPTER HOOKENGINE --> SYSEVENT HOOKENGINE --> ASAN SERVICE --> UTIL SANDBOX --> UTIL SPM --> UTIL ``` ### 2.2 进程孵化数据流 ```mermaid flowchart TD A[客户端构建请求
AppSpawnReqMsg] -->|Socket发送| B[appspawn_msgmgr
接收消息] B --> C{消息类型判断} C -->|SPAWN| D[创建AppSpawningCtx] C -->|TERMINATE| E[查找进程并终止] D --> F[Pre-Fork Hooks
STAGE_PARENT_PRE_FORK] F --> G[fork子进程] G -->|父进程| H[Post-Fork Hooks
STAGE_PARENT_POST_FORK] G -->|子进程| I[Child Execute Hooks
STAGE_CHILD_EXECUTE] I --> J[设置沙箱/权限/UID/GID] J --> K[exec应用入口] H --> L[等待子进程响应] L --> M[返回结果给客户端] ``` ### 2.3 Hook 阶段流程 ```mermaid sequenceDiagram participant Client as 客户端 participant MsgMgr as 消息管理器 participant Service as 核心服务 participant HookMgr as Hook引擎 participant Child as 子进程 Client->>MsgMgr: Socket发送TLV消息 MsgMgr->>Service: ProcessRecvMsg Service->>HookMgr: STAGE_PARENT_PRE_FORK HookMgr->>HookMgr: 执行沙箱预配置/权限准备 Service->>Child: fork() Child->>HookMgr: STAGE_CHILD_EXECUTE HookMgr->>HookMgr: 沙箱挂载/UID/GID设置/DEC策略 Child->>Service: 通过pipe返回结果 Service->>HookMgr: STAGE_PARENT_POST_FORK Service->>Client: 返回AppSpawnResult ``` --- ## 3. 模块清单 ### Module: standard(标准系统核心) - **位置**: `standard/` - **职责**: appspawn 标准系统核心实现,包含主入口、核心服务、消息管理器、应用管理器、FD 管理器、看门狗等 - **关键文件**: - `standard/appspawn_main.c` - 主入口,解析参数并启动服务 - `standard/appspawn_service.c` - 核心服务实现(fork、消息处理、子进程管理) - `standard/appspawn_msgmgr.c` - 消息接收与分发 - `standard/appspawn_appmgr.c` - 已孵化应用进程的管理 - `standard/appspawn_fd_manager.c` - 文件描述符管理 - `standard/appspawn_manager.h` - 核心数据结构定义(AppSpawnMgr、AppSpawningCtx 等) - **依赖**: common, modules/module_engine, modules/modulemgr, util - **被依赖**: 无(顶层模块) ### Module: common(通用服务层) - **位置**: `common/` - **职责**: 提供 appspawn 服务注册和 trace 追踪等通用功能 - **关键文件**: - `common/appspawn_server.c` - 服务创建与 socket 监听 - `common/appspawn_server.h` - `AppSpawnContent` 结构体和运行模式定义 - `common/appspawn_trace.cpp` - 性能追踪(HiTrace) - **依赖**: util, interfaces/innerkits - **被依赖**: standard, lite ### Module: sandbox(沙箱模块) - **位置**: `modules/sandbox/` - **职责**: 应用沙箱的创建、挂载管理、DEC 策略、权限控制 - **关键文件**: - `modules/sandbox/normal/sandbox_core.cpp` - 沙箱核心逻辑 - `modules/sandbox/normal/sandbox_common.cpp` - 沙箱通用工具 - `modules/sandbox/normal/sandbox_shared_mount.cpp` - 共享挂载管理 - `modules/sandbox/normal/sandbox_unlock_mount.cpp` - 解锁挂载 - `modules/sandbox/appspawn_permission.c` - 沙箱权限 - `modules/sandbox/sandbox_dec.c` - DEC(分布式加密)策略 - **依赖**: modules/module_engine, util, common - **被依赖**: 通过 Hook 被 standard 调用 ### Module: spm(安全进程管理器) - **位置**: `modules/spm/` - **职责**: SPM(Security Process Manager)内核安全进程管理,包括 tokenid/uid 引用计数管理、权限位图重建 - **关键文件**: - `modules/spm/spm.c` - SPM 核心逻辑 - `modules/spm/spm_permission.c` - 权限操作 - `modules/spm/tlv_builder.c` - TLV 消息构建 - **依赖**: modules/module_engine, interfaces/innerkits/permission - **被依赖**: 通过 Hook 被 standard 调用 ### Module: modulemgr(模块管理器) - **位置**: `modules/modulemgr/` - **职责**: 管理动态模块的加载/卸载,Hook 注册与执行 - **关键文件**: - `modules/modulemgr/appspawn_modulemgr.c` - 模块管理实现 - `modules/modulemgr/appspawn_modulemgr.h` - 模块类型定义和接口 - **依赖**: modules/module_engine - **被依赖**: standard ### Module: module_engine(Hook 引擎) - **位置**: `modules/module_engine/` - **职责**: 定义 Hook 阶段、Hook 优先级、扩展数据结构等基础设施 - **关键文件**: - `modules/module_engine/include/appspawn_hook.h` - Hook 阶段和接口定义 - `modules/module_engine/include/appspawn_msg.h` - TLV 消息类型定义 - **依赖**: interfaces/innerkits/include - **被依赖**: 几乎所有其他模块 ### Module: common_modules(通用功能模块) - **位置**: `modules/common/` - **职责**: 提供 namespace 管理、cgroup 配置、ASAN 检测、DFX 转储、进程隔离等通用 Hook 模块 - **关键文件**: - `modules/common/appspawn_adapter.cpp` - 适配层 - `modules/common/appspawn_cgroup.c` - Cgroup 配置 - `modules/common/appspawn_namespace.c` - 命名空间管理 - `modules/common/appspawn_isolate.c` - 进程隔离 - `modules/common/appspawn_custom_config.cpp` - 自定义配置 - `modules/common/appspawn_encaps.c` - 封装工具 - `modules/common/appspawn_silk.c` - SILK 引擎集成 - **依赖**: modules/module_engine - **被依赖**: 通过 Hook 被 standard 调用 ### Module: ace_adapter(ACE 适配器) - **位置**: `modules/ace_adapter/` - **职责**: ACE(ArkUI Cross-platform Engine)适配,包括 checkpoint 管理、命令解析、预加载 - **关键文件**: - `modules/ace_adapter/ace_adapter.cpp` - ACE 适配主文件 - `modules/ace_adapter/appspawn_checkpoint.c` - Checkpoint 管理 - `modules/ace_adapter/command_lexer.cpp` - 命令解析器 - `modules/ace_adapter/dfx_preload.cpp` - DFX 预加载 - **依赖**: modules/module_engine - **被依赖**: 通过 Hook 被 standard 调用 ### Module: client(客户端 SDK) - **位置**: `interfaces/innerkits/client/` - **职责**: 提供 appspawn 客户端 API,供 AMS 等外部服务调用 - **关键文件**: - `interfaces/innerkits/client/appspawn_client.c` - 客户端实现 - `interfaces/innerkits/client/appspawn_msg.c` - 请求消息构造 - `interfaces/innerkits/client/appspawn_client.h` - 客户端数据结构 - `interfaces/innerkits/include/appspawn.h` - 公共 API 头文件 - **依赖**: 无(独立客户端库) - **被依赖**: AMS, 外部服务 ### Module: util(工具类) - **位置**: `util/` - **职责**: 通用工具函数,包括错误码定义、JSON 工具、parcel 序列化、DFX 工具 - **关键文件**: - `util/include/appspawn_utils.h` - 通用工具宏和函数 - `util/include/appspawn_error.h` - 错误码定义 - `util/src/appspawn_utils.c` - 工具函数实现 - `util/src/appspawndf_utils.cpp` - DFX 工具实现 - **依赖**: 无 - **被依赖**: 几乎所有模块 ### Module: lite(小型系统) - **位置**: `lite/` - **职责**: 小型系统(轻量级设备)的 appspawn 实现 - **关键文件**: - `lite/main.c` - 主入口 - `lite/appspawn_service.c` - 服务实现 - `lite/appspawn_message.c` - 消息处理 - `lite/appspawn_process.c` - 进程孵化 - **依赖**: interfaces/innerkits - **被依赖**: 无(独立于标准系统) ### Module: hnp(原生包管理服务) - **位置**: `service/hnp/` - **职责**: HNP(Harmony Native Package)原生包安装和管理服务 - **关键文件**: - `service/hnp/hnp_main.c` - HNP 服务主入口 - `service/hnp/installer/src/hnp_installer.c` - 安装器 - `service/hnp/pack/src/hnp_pack.c` - 打包器 - `service/hnp/base/hnp_file.c` - 文件操作 - `service/hnp/base/hnp_json.c` - JSON 处理 - **依赖**: interfaces/innerkits/hnp - **被依赖**: 无(独立服务) ### Module: devicedebug(设备调试服务) - **位置**: `service/devicedebug/` - **职责**: 设备调试功能,包括进程 kill 操作 - **关键文件**: - `service/devicedebug/devicedebug_main.c` - 主入口 - `service/devicedebug/kill/src/devicedebug_kill.c` - Kill 操作 - **依赖**: 无 - **被依赖**: 无(独立服务) --- ## 4. 数据流 ### 4.1 应用孵化请求流程 1. **客户端构建请求**: AMS 调用 `AppSpawnReqMsgCreate()` 构建请求消息句柄,通过 `AppSpawnClientAddBundleInfo()` 等 API 填充 TLV 字段(bundle name, DAC info, permission 等),定义在 `interfaces/innerkits/include/appspawn.h:39-45` 2. **Socket 发送**: 客户端通过 `AppSpawnClientSendMsg()` 将消息通过本地 socket 发送给 appspawn 服务端,实现在 `interfaces/innerkits/client/appspawn_client.c` 3. **消息接收与解析**: appspawn_msgmgr 在 socket 上收到数据后,通过 `GetAppSpawnMsgFromBuffer()` 解析 TLV 格式消息,验证 magic(`APPSPAWN_MSG_MAGIC 0xEF201234`),定义在 `modules/module_engine/include/appspawn_msg.h:45` 4. **Hook 执行与 fork**: 核心服务在 `appspawn_service.c` 中按顺序执行 Hook: - `STAGE_PARENT_PRE_FORK`: fork 前准备(沙箱路径计算、权限准备) - `fork()`: 创建子进程 - `STAGE_CHILD_EXECUTE`(子进程中): 沙箱挂载、UID/GID 设置、DEC 策略 - `STAGE_PARENT_POST_FORK`(父进程中): 结果收集 5. **结果返回**: 子进程通过 pipe 向父进程返回 `AppSpawnResult`(包含 pid 和 result),父进程通过 socket 返回给客户端 ### 4.2 消息格式 消息采用 TLV(Type-Length-Value)格式,定义在 `modules/module_engine/include/appspawn_msg.h:54-66`: | TLV 类型 | 说明 | |----------|------| | TLV_BUNDLE_INFO | 应用包信息(bundle name, index) | | TLV_MSG_FLAGS | 消息标志位 | | TLV_DAC_INFO | DAC 信息(UID, GID, GID 表) | | TLV_DOMAIN_INFO | 域信息(APL 等级) | | TLV_OWNER_INFO | 所有者信息 | | TLV_ACCESS_TOKEN_INFO | AccessToken | | TLV_PERMISSION | 权限位图 | | TLV_INTERNET_INFO | 网络权限 | | TLV_RENDER_TERMINATION_INFO | 渲染终止信息 | | TLV_CHECK_POINT_INFO | Checkpoint 信息 | --- ## 5. 关键接口 | 接口 | 提供方 | 使用方 | 机制 | |------|--------|--------|------| | AppSpawnClientInit/SendMsg | client SDK | AMS 等外部服务 | Socket IPC | | AppSpawnReqMsgCreate | client SDK | AMS 等外部服务 | 函数调用 | | StartSpawnService | standard/service | main 入口 | 函数调用 | | AddAppSpawnHook | 各功能模块 | module_engine | Hook 注册 | | AppSpawnHookExecute | modulemgr | standard/service | Hook 执行 | | SetAppSandboxProperty | sandbox | 通过 CHILD_EXECUTE Hook | Hook 调用 | | OnMessageRebuildFromSPM | spm | 通过 PARENT_MSG_DECODE Hook | Hook 调用 | | AppSpawnCreateContent | common/server | standard/service | 函数调用 | --- ## 6. 外部依赖 | 依赖 | 用途 | 来源 | |------|------|------| | init_socket | Socket 创建与连接 | OpenHarmony init | | loop_event | 事件循环(IO 多路复用) | OpenHarmony | | hookmgr | Hook 管理器框架 | OpenHarmony | | modulemgr | 动态模块加载框架 | OpenHarmony | | cJSON | JSON 解析 | 第三方 | | parameter | 系统参数读取 | OpenHarmony | | securec | 安全 C 函数库 | OpenHarmony | | hisysevent | 系统事件上报 | OpenHarmony | | access_token | 访问令牌 | OpenHarmony | | selinux | SELinux 安全上下文 | 系统 | | seccomp | 系统调用过滤 | 系统 | --- ## 7. 跨模块关系 (Cross-Module Relationships) ### 7.1 跨模块数据流 ```mermaid sequenceDiagram participant Client as 客户端(client_api) participant Standard as 核心(standard) participant Engine as Hook引擎(modulemgr_engine) participant Sandbox as 沙箱(sandbox) participant SPM as 权限(spm) participant Child as 子进程 Client->>Standard: TLV消息(Socket) Standard->>Engine: STAGE_PARENT_MSG_DECODE Engine->>SPM: OnMessageRebuildFromSPM SPM-->>Standard: 重建后的权限消息 Standard->>Engine: STAGE_PARENT_PRE_FORK Standard->>Child: fork() Child->>Engine: STAGE_CHILD_EXECUTE Engine->>Sandbox: SetAppSandboxProperty Sandbox-->>Child: 沙箱挂载完成 Child->>Standard: pipe返回结果 Standard->>Engine: STAGE_PARENT_POST_FORK Standard->>Client: AppSpawnResult ``` ### 7.2 共享数据结构 | Structure | Used By | Purpose | |-----------|---------|---------| | AppSpawnMgr | standard, sandbox, spm, common_modules | 全局管理器(孵化队列、服务状态) | | AppSpawningCtx | standard, sandbox, spm, ace_adapter | 孵化请求上下文(消息、fork pipe、SPM 引用计数) | | AppSpawnMsg | client_api, standard, modulemgr_engine | TLV 消息头(magic、msgType、processName) | | AppSpawnContent | standard, server_common, sandbox | 服务内容(模式、函数指针表) | | AppSpawnHookStage | modulemgr_engine, sandbox, spm, common_modules | Hook 阶段枚举 | ### 7.3 接口契约 | Contract | Provider | Consumer | Description | |----------|----------|----------|-------------| | TLV 消息格式 | client_api | standard | 客户端构造 TLV,服务端解析 TLV | | Hook 注册 | modulemgr_engine | 所有功能模块 | 通过 `MODULE_CONSTRUCTOR` + `AddAppSpawnHook` | | AppSpawningCtx 生命周期 | standard | sandbox, spm | standard 创建/销毁,其他模块读取 | | 沙箱配置 JSON | sandbox(读取) | 根目录(定义) | `appdata-sandbox-*.json` 配置文件 | --- ## 8. 系统级模式 (System-Level Patterns) ### 8.1 Hook 驱动模式 所有功能扩展通过 Hook 实现。模块使用 `MODULE_CONSTRUCTOR` 在 .so 加载时注册 Hook,核心服务通过 `AppSpawnHookExecute` 按优先级执行。 ### 8.2 函数指针表多态 `AppSpawnContent` 使用函数指针(`runAppSpawn`、`runChildProcessor`、`coldStartApp`)实现不同孵化模式的多态分发。 ### 8.3 UID 白名单安全 仅允许特定 UID(root / foundation / app_fwk_update / storage_manager)的客户端连接,开发者模式下允许 shell。 ### 8.4 引用计数资源管理 SPM 模块使用位图(`spmRefAdded`)跟踪 tokenid/uid 引用计数,确保 spawn abort 和进程退出时正确回收。