ADR-001: 大美丽单引擎分层架构

状态: 已接受 (Accepted)
日期: 2026-04-17 最后同步: 2026-06-04(与 beauty-engine/src/main/java/com/picme/beauty/ 代码结构对齐)
决策: RD
PM Review: 已完成


1. 背景与问题陈述

重构前架构

App Layer → 大美丽模块 (混合业务逻辑+GPU实现)

核心问题: 1. 层次越界: 大美丽直接包含 GPU 渲染代码,违反 Clean Architecture 2. 强耦合: App 层直接依赖引擎内部类,无法 Mock 测试 3. 复用阻塞: 渲染逻辑被业务逻辑污染,无法独立作为视觉能力库输出 4. 性能风险: EGL Context 管理分散,线程模型混乱

演进说明: 架构经过多次迭代,最终沉淀为单引擎方案,当前仅保留自研大美丽(BIG_BEAUTY)引擎。


2. 决策目标架构

┌─────────────────────────────────────────────────────────┐
│                    App Layer                            │
│              ↓ 依赖 beauty-engine:api                   │
└────────────────────┬──────────────────────────────────┘
                     │
┌────────────────────▼──────────────────────────────────┐
│  Domain Layer: beauty-engine:api                        │
│  ├─ BeautyPreviewProvider (Interface)                 │
│  ├─ BeautyPreviewEngine (Interface)                   │
│  ├─ PhotoProcessor (Interface)                        │
│  ├─ BeautyParams / FaceData / FilterType              │
│  └─ BeautyPerfStats / FrameSyncResult                 │
└────────────────────┬──────────────────────────────────┘
                     │
┌────────────────────▼──────────────────────────────────┐
│  Data Layer: beauty-engine:render                       │
│  ├─ GlBeautyPreviewProvider (Provider 实现)           │
│  ├─ CameraPreviewRenderer (自研 OpenGL ES 管线)      │
│  ├─ BeautyRenderer (美颜 Shader 渲染器)              │
│  ├─ PhotoProcessorImpl (拍照 GPU 离屏渲染)           │
│  ├─ FaceMakeupPass (唇色/腮红三角网格 Pass)          │
│  └─ EGLCore / WindowSurface                           │
└────────────────────┬──────────────────────────────────┘
                     │
┌────────────────────▼──────────────────────────────────┐
│              BIG_BEAUTY (自研引擎)                      │
└─────────────────────────────────────────────────────────┘

3. 关键决策

决策项 方案
分层策略 Domain(api) / Data(render) / External 三层分离
依赖方向 App → api → render → 底层 GPU 驱动 (单向)
接口定义 BeautyPreviewProvider / BeautyPreviewEngine / PhotoProcessor 接口类,对外唯一出口
引擎封装 自研引擎统一走 render/ 包,OpenGL ES 调用集中在 CameraPreviewRenderer / BeautyRenderer
线程模型 独立渲染线程(CameraPreviewRenderer),EGLCore 管理 EGLContext;PhotoProcessorImpl 独立 EGL 上下文

4. 技术实现

4.1 模块结构

beauty-engine/src/main/java/com/picme/beauty/
├── api/                    # Domain Layer - 实现层 API(依赖 :beauty-api 共享类型)
│   ├── BeautyPreviewProvider.kt   # 预览 Provider 接口
│   ├── BeautyPreviewEngine.kt     # 组合接口(Provider + Capability)
│   ├── BeautyPreviewCapability.kt # GL 能力扩展(FaceWarp/LipMask)
│   ├── PhotoProcessor.kt          # 拍照后处理接口
│   ├── BeautyParams.kt            # Shader 参数(来自 :beauty-api)
│   ├── BeautyPerfStats.kt         # 性能统计(来自 :beauty-api)
│   ├── FilterTypeExt.kt           # FilterType 扩展(来自 :beauty-api)
│   ├── StyleFilterExt.kt          # StyleFilter 扩展(来自 :beauty-api)
│   ├── FrameId.kt                 # 帧同步标识(来自 :beauty-api)
│   ├── FrameSyncConfig.kt         # 帧同步配置(来自 :beauty-api)
│   └── FrameSyncResult.kt         # 帧同步结果(来自 :beauty-api)
│   > **Note**: `BeautyParams`, `FilterType`, `StyleFilter`, `FaceData`, `FrameId`, `FrameSyncConfig`, `FrameSyncResult`, `BeautyPerfStats` 等类型定义在 `:beauty-api` 模块,`beauty-engine:api/` 仅保留实现相关接口。
└── render/                 # Data Layer - 自研引擎 GL 渲染实现
    ├── GlBeautyPreviewProvider.kt   # Provider 接口实现
    ├── CameraPreviewRenderer.kt     # 渲染管线核心
    ├── BeautyRenderer.kt            # 美颜 Shader 渲染器
    ├── BeautyPass.kt                # 通用渲染 Pass 基类
    ├── FaceMakeupPass.kt            # 唇色/腮红三角网格 Pass
    ├── StyleEffectShader.kt         # 风格特效 Shader
    ├── PhotoProcessorImpl.kt        # 拍照 GPU 离屏渲染实现
    ├── EGLCore.kt                   # EGL 上下文管理
    ├── WindowSurface.kt             # EGL Window Surface 封装
    ├── Framebuffer.kt               # FBO 封装
    ├── FramebufferPool.kt           # FBO 对象池
    └── ShaderProgram.kt             # Shader 编译与链接

4.2 依赖规则 (Gradle)

// App 层(只允许依赖 api 层类型)
dependencies {
    implementation project(':beauty-api')      // 共享类型契约(BeautySettings, FilterType, StyleFilter, Face 等)
    implementation project(':beauty-engine')     // 实现层
    // 禁止: implementation project(':beauty-engine:render')
}

// render 模块(内部实现)
dependencies {
    api project(':beauty-engine:api')
}

4.3 ArchUnit 依赖检查

// 规则: App 层严禁直接依赖 render 内部实现包
noClasses()
    .that().resideInAPackage("..app..")
    .should().dependOnClassesThat()
    .resideInAPackage("..beautyengine.render..")

5. 后果分析

正面影响

负面影响


6. 状态

阶段 状态 日期
接口提取 (Phase 1) ✅ 完成 2026-04-17
实现迁移 (Phase 2) ✅ 完成 2026-04-17
App层适配 (Phase 3) ✅ 完成 2026-04-17
引擎归一 (单引擎化) ✅ 完成 2026-04-17
编译验证 ✅ 通过 2026-04-17
安装运行 ✅ 成功 2026-04-17

7. 相关文档