
NuvioTV架构完全解析从Hilt依赖注入到Supabase跨设备同步的设计之道【免费下载链接】NuvioTVOfficial Nuvio Android TV Repository项目地址: https://gitcode.com/gh_mirrors/nu/NuvioTVNuvioTV 是一款免费开源的 Android TV 媒体应用你自带片源它自动补全海报、评分、字幕并让上次看到哪里在所有屏幕上保持一致。本文完整拆解 NuvioTV 的架构设计——Hilt 依赖注入如何组织 8 个核心模块、Supabase 快照 增量游标如何实现跨设备同步带你快速看懂这个项目的工程之道。 先认识 NuvioTV开源 Android TV 媒体播放器NuvioTV 的定位很清晰Bring your own sources自带片源把零散的资源变成一个有封面、评分、字幕的媒体库并且进度在所有设备上实时同步。它的技术栈是当下 Android 开发的主流组合技术用途Kotlin Jetpack Compose全部 UI 用声明式界面构建TV Material 3电视端 D-Pad 遥控器交互规范Media3 (ExoPlayer)播放核心HLS/Dolby Vision 等格式支持Hilt (Dagger)依赖注入贯穿整个应用Retrofit / OkHttp / Ktor多服务网络层TMDB、Trakt、Debrid、Supabase…Supabase (Postgrest)账号认证与跨设备数据同步后端想从源码构建只需一条命令需 Android Studio JDK Android SDKgit clone https://gitcode.com/gh_mirrors/nu/NuvioTV cd NuvioTV ./gradlew :app:assembleFullDebug 分层架构core / data / domain / ui 各司其职打开 app/src/main/java/com/nuvio/tv/ 目录你会发现代码被严格分层——这是 NuvioTV 可读性高的根本原因层职责代表模块uiCompose 界面、导航、主题ui/screens/core认证、网络、同步、DI、播放core/di/、core/sync/domain只定义仓库接口与领域模型domain/repository/data本地存储、远程 API、仓库实现data/remote/、data/local/关键设计domain层只声明接口如StreamRepositorydata层给出实现如StreamRepositoryImpl二者在 Hilt 模块中完成绑定。上层 UI 永远不关心数据来自 Supabase、TMDB 还是本地文件——这就是典型的面向接口编程。 Hilt 依赖注入8 个模块撑起整个应用应用入口 NuvioApplication.kt 标注了HiltAndroidApp由此开启全局注入容器。所有依赖都安装在SingletonComponent应用级单例中core/di/ 下恰好有 8 个模块分工一目了然Hilt 模块职责RepositoryModule.kt用Binds把 8 个仓库接口绑定到实现类NetworkModule.kt构建 OkHttp 客户端与十几个 Retrofit 服务SupabaseModule.kt创建 Supabase 客户端认证 数据库 存储ProfileModule.kt多用户资料Profile管理TorrentModule.kt种子/磁力播放引擎TrackingModule.kt观看追踪Trakt/Simkl 等LibrarySyncModule.kt媒体库同步数据源MdbListModule.ktMDBList 列表源支持两种绑定方式体现了 Hilt 的两种典型用法Binds抽象绑定RepositoryModule.kt 中每个方法形如实现类 → 接口零构造逻辑编译期即可检查Provides工厂绑定用于第三方库OkHttp、SupabaseClient 这类无法由 Hilt 直接构造的对象在 SupabaseModule.kt 中可以看到完整的客户端装配过程。 网络层的三个巧思NetworkModule.kt 是全项目最工程化的文件之一几个细节值得学习多命名客户端隔离用Named(addonPermissive)、Named(directDebrid)等区分严格校验的官方接口客户端、容忍自签名证书的自建源客户端、Debrid 专用客户端互不污染50 MB 磁盘缓存 错误不缓存网络拦截器给所有 4xx/5xx 响应强制加上Cache-Control: no-store避免把错误响应缓存下来IPv4 优先 DNSIPv4FirstDns.kt 让电视这类弱网环境优先走 IPv4显著降低连接失败率。Supabase 侧Ktor 客户端则额外装配了限流协调器与自动重试认证刷新遇到瞬时故障会抛出可识别的TransientAuthRefreshException而非直接崩溃。 Supabase 跨设备同步快照 增量游标这是 NuvioTV 最有意思的架构部分——进度在所有设备保持同步背后是一套全量快照 增量拉取策略。总调度器StartupSyncServiceStartupSyncService.kt 是同步系统的总指挥构造函数一次性注入了 10 个专项同步服务监听AuthManager的登录状态流在账号变为FullAccount时自动触发拉取同步服务同步内容PluginSyncService插件列表AddonSyncService自建片源Addon配置LibrarySyncService收藏媒体库WatchProgressSyncService每部作品的观看进度WatchedItemsSyncService已看记录CollectionSyncService收藏集合ProfileSyncService用户资料与个性化设置ProfileSettingsSyncService主题、布局等界面偏好ProviderCredentialSyncService各第三方服务凭据它还内置了节流策略启动拉取有 6 小时 TTL、前台激活拉取间隔 2 分钟、周期性拉取 15 分钟一次避免频繁请求后端。核心机制先拉快照再拉增量以媒体库为例SupabaseLibrarySyncRemoteDataSource.kt 通过 Postgrest RPC 调用三个数据库函数sync_pull_library全量快照首次登录时按页拉取整个媒体库一次性建立本地基线sync_get_library_delta_cursor读取游标返回当前设备的同步位点一个递增的event_idsync_pull_library_delta增量拉取只拉取event_id之后的新增/变更/删除事件按 LIBRARY_MUTATION_BATCH_SIZE 分批提交。这套快照 → 游标 → 增量的模式让日常同步流量极小设备 A 收藏了一部电影设备 B 下次前台激活时只需拉几条增量事件即可追平而不是重新下载整个库。同时 SyncClientIdentity.kt 为每台设备维护唯一身份写入操作携带来源客户端 ID便于多端冲突归因与调试。数据一致性的小设计本地先写、远端后发本地变更先进入 WatchStateMutationStore.kt 变更队列用户操作零延迟生效拉取与推送分离拉取pull在应用启动/前台时自动发生推送push在变更发生后异步进行二者通过游标对齐失败可恢复任何一步网络失败都只影响增量窗口下次同步会自动补齐不会丢数据。 上手路径从哪个文件开始读如果你是第一次接触这个仓库推荐按以下顺序阅读NuvioApplication.kt —— 应用入口与全局单例装配RepositoryModule.kt —— 30 秒看懂接口 ↔ 实现的绑定方式StartupSyncService.kt —— 同步系统的调度全景SupabaseLibrarySyncRemoteDataSource.kt —— 快照/增量数据源的完整实现扩展文档docs/architecture/mdblist-library.md —— 一份真实贡献的架构说明展示了团队如何用端口 实现模式接入新的第三方服务。✅ 总结值得借鉴的三条设计经验分层 面向接口domain只定义契约data负责实现core/di负责装配——任何一层都可以独立替换与测试DI 模块按领域拆分8 个 Hilt 模块各管一摊Binds管自家实现、Provides管第三方对象新人十分钟能定位任何依赖快照 增量游标同步用最小的网络开销实现了全设备进度一致的用户体验且天然可恢复。NuvioTV 证明了一个功能丰富的电视应用依然可以拥有清晰、克制、可长期演进的架构。【免费下载链接】NuvioTVOfficial Nuvio Android TV Repository项目地址: https://gitcode.com/gh_mirrors/nu/NuvioTV创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考