Animation Garden项目架构深度解析:从客户端到服务端的全景视角
项目概述
Animation Garden(简称Ani)是一个跨平台的动漫观看解决方案,采用现代化架构设计,支持Android、iOS和桌面平台。本文将深入剖析其技术架构,帮助开发者理解其设计理念和实现细节。
整体架构设计
Ani采用分层架构设计,各层职责明确,耦合度低:
- 服务层:提供弹幕服务、排行榜缓存和新番时间表等高级功能
- 客户端层:跨平台用户界面和业务逻辑实现
- 数据源层:对接多种动漫数据服务
核心服务依赖关系
Ani客户端依赖多个外部服务协同工作:
- Bangumi服务:提供番剧元数据、剧集信息和用户认证
- 弹弹play服务:补充弹幕数据源
- 自建服务端:处理OAuth中转、数据缓存和高级查询
这种多服务架构设计既保证了功能丰富性,又通过缓存机制减轻了对上游服务的压力。
客户端架构详解
模块化设计
Ani客户端采用Gradle多模块架构,主要模块包括:
| 模块类别 | 功能描述 | |----------------|--------------------------------------------------------------------------| | 基础工具(utils) | 提供日志、序列化等基础能力 | | 数据源(datasource) | 对接Bangumi、Ikaros等多种数据源 | | 弹幕(danmaku) | 实现弹幕获取、渲染和发送功能 | | 种子(torrent) | 基于libtorrent的BT下载功能 | | 应用核心(app) | 包含所有平台共享代码和各平台入口 |
核心分层架构
Ani严格遵循分层架构原则:
graph TD
UI[UI层] --> Domain[业务层] --> Data[数据层] --> Platform[平台层]
平台层(Platform)
负责平台差异化适配:
- 构建配置管理
- 平台权限处理
- 硬件功能访问控制
数据层(Data)
数据获取和持久化实现:
- 网络请求封装
- 本地缓存管理
- 数据库操作(Room/SQLite)
- 轻量存储(DataStore)
业务层(Domain)
核心业务逻辑实现:
- 媒体资源获取器(MediaFetcher)
- 智能资源选择器(MediaSelector)
- 播放状态管理器(EpisodeFetchSelectPlayState)
- 各类UseCase封装
UI层
基于Compose Multiplatform的现代化UI:
- 基础组件(ui-foundation)
- 自适应布局(ui-adaptive)
- 各功能模块(ui-comment, ui-settings等)
- 播放器界面(video-player)
关键技术选型
- Kotlin Multiplatform:实现跨平台业务逻辑共享
- Compose Multiplatform:统一多平台UI开发
- Room+SQLite:本地数据持久化
- Ktor:网络请求处理
- Koin:依赖注入管理
最佳实践建议
-
代码定位技巧:
- 从UI组件入手,通过ViewModel找到对应业务逻辑
- 使用全局搜索快速定位关键代码
-
业务逻辑封装:
- 简单CRUD操作可直接在ViewModel中处理
- 复杂业务必须封装为Domain层的UseCase或Processor
-
UI开发规范:
- 新功能优先采用独立的ui-*模块
- 参考ui-exploration模块的现代实现方式
- 避免在UI层直接访问数据层
独立组件项目
Ani将部分核心功能独立为组件项目:
-
Mediamp:跨平台媒体播放引擎
- 提供基础播放能力
- UI控制仍保留在主项目中
-
Anitorrent:BT下载引擎
- 基于libtorrent封装
- 下载管理功能在主项目中实现
架构演进方向
当前架构仍在持续优化中:
- 逐步将遗留代码迁移到标准分层架构
- 完善各模块的单元测试覆盖
- 增强跨平台一致性
- 优化性能关键路径
通过这样的架构设计,Animation Garden实现了功能丰富性与代码可维护性的平衡,为开发者提供了清晰的扩展路径。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考