Rays 技术栈速览:从 Room 到 ML Kit
技术栈总览
Rays 的核心技术组件来自 Google 的 Jetpack 和 AndroidX 生态,外加一些第三方库。按功能分类:
架构与基础
| 组件 | 作用 |
|---|---|
| Kotlin | 主语言 |
| Jetpack Compose | 声明式 UI 框架 |
| MVI Architecture | 应用架构模式 |
| Kotlin Coroutines + Flow | 异步处理与响应式数据流 |
| ViewModel | UI 状态容器(AndroidX Lifecycle) |
| Hilt | 依赖注入 |
| Splash Screen | Android 12+ 启动页 API |
| Navigation Compose | 页面导航 |
数据存储
| 组件 | 作用 |
|---|---|
| Room | 本地关系数据库(表情、标签、OCR 结果等) |
| DataStore | 键值对存储(设置项) |
图像与媒体
| 组件 | 作用 |
|---|---|
| Coil | 异步图片加载(Compose 友好) |
| Lottie | 动画效果 |
机器学习 / AI
| 组件 | 作用 |
|---|---|
| ML Kit | 文字识别(OCR)、其他视觉能力 |
| LiteRT | 轻量级模型推理引擎 |
| 自研 StickerClassification | 表情包分类模型(见 SkyD666/StickerClassification) |
系统集成
| 组件 | 作用 |
|---|---|
| AIDL | 进程间通信(自动分享功能可能用到) |
| Profile Installer | 应用间数据传递 |
| Paging | 列表分页加载(表情多的时候) |
每个组件在 Rays 里的角色
Room(数据库)
Rays 的表情库是一个 Room 数据库。主要的表可能包括:
| 表 | 存什么 |
|---|---|
| sticker | 表情基本信息(路径、添加时间、收藏标记) |
| tag | 标签列表 |
| sticker_tag | 表情和标签的多对多关系 |
| ocr_result | 每张图的 OCR 识别结果 |
| title | 每张图的自定义标题 |
Room 的好处是类型安全 + SQL + Kotlin Flow 响应式查询——搜"原神"这样的查询可以写成一个 Flow,结果变化自动通知 UI。
DataStore(设置存储)
DataStore 存简单的键值对:
- 搜索域默认值
- 主题设置
- WebDAV 配置信息
- 其他应用级设置
比 SharedPreferences 更现代、类型安全、协程友好。
ML Kit(OCR)
ML Kit 是 Google 的移动端机器学习工具集。Rays 用它做:
- 文字识别(Text Recognition) —— 把表情包上的文字读出来存进 ocr_result 表
- 可能还有图片分类、人像分割等(取决于版本)
ML Kit 的模型在设备本地跑,不联网。
Coil(图片加载)
在表情库里显示缩略图需要高效的图片加载。Coil 是 Compose 时代最流行的图片加载库:
- 异步加载
- 自动缓存(内存 + 磁盘)
- Compose
AsyncImage组件直接用 - 内存管理好(及时回收不在屏幕上的图)
Hilt(依赖注入)
Hilt 是 Google 推荐的依赖注入框架。Rays 的 Repository、DataSource、ViewModel 等都通过 Hilt 注入,不用手动 new 来 new 去。
好处:
- 代码解耦
- 测试方便(可以注入 mock 对象)
- 生命周期自动管理
为什么选这些组件
Rays 用的每个组件都有更轻量或更重量级的替代品。作者的选择体现了一个够用就行的原则:
- 用 Room 而不是 ObjectBox/Realm —— Google 官方推荐、文档多、社区大
- 用 DataStore 而不是 SharedPreferences —— 更现代
- 用 Coil 而不是 Glide/Picasso —— Compose 友好
- 用 ML Kit 而不是自研 OCR —— 成熟稳定
- 用 LiteRT 而不是 TFLite 完整版 —— 更轻量
整套技术栈都是 Google 官方推荐的 Modern Android Development(MAD)组件的子集,没有特别偏门的东西。