NeriPlayer 是一款基于 Jetpack Compose 与 Media3 的原生 Android 音频播放器,整合网易云、Bilibili 与 YouTube Music 多源能力,强调本地优先与隐私可控。它提供歌词体验、自建同步、可选 WebDAV/GitHub 备份、桌面小组件与悬浮歌词,3K+ Star、持续活跃迭代,是开源 Android 音乐 App 中少见的「多源 + 本地 + 自托管」一体化方案。
适用人群:
适用场景:
推荐理由:如果你正在寻找一款不强迫你把数据交出去的 Android 音乐客户端,又不想在不同平台 App 之间来回切换,NeriPlayer 值得一试。它用 Compose 与 Media3 搭起现代架构,又把多源播放与本地控制、自建同步做进同一份代码里,开源、活跃、克制,是少见的「多源 + 本地 + 自托管」一体化方案。
项目定位与背景
在主流音乐 App 普遍走向订阅化、中心化的今天,用户往往要在三四个客户端之间切换,还要忍受云端历史与推荐算法的「绑架」。NeriPlayer 给出的解法很明确:不造自己的曲库,只做「壳」,把网易云音乐、Bilibili 与 YouTube Music 的账号能力整合进同一个原生 Android 应用,强调「账号即能力」与「本地优先」。项目名称与图标取自动画《星空铁道与シロの旅》中的角色「风又音理」,由 cwuom 主导开发,采用 Kotlin + Jetpack Compose + Media3,最低支持 Android 9,目前在 GitHub 拥有 3K+ Star、107 Fork,Trending Shift 榜单上长期上榜,社区活跃度可观。
核心功能与技术架构
NeriPlayer 的功能可以归纳为「播放、体验、恢复」三个层面。播放侧,它以 Media3/ExoPlayer 为内核,支持多源在线播放、本地歌曲、缓存与下载、播放队列和歌单管理,并通过 GitHub Actions 持续出包。体验侧覆盖很全:Karaoke 歌词、悬浮/状态栏歌词、桌面小组件与启动器快捷方式、均衡器(含 USB 独占输出)、GLSL Shader 流体背景、Material You 主题与动态取色等都属于「标配」。恢复侧则提供安全模式、崩溃日志、ANR 记录和调试探针,对开发者和折腾玩家都友好。
架构上,项目采用「单 Activity + Compose NavHost」的现代写法,所有页面围绕 NavHost、动态底栏、Mini Player 与 Now Playing 覆盖层组织。启动链路也相当完善:正常启动走 LollipopApplicationStyle → MainActivity 的常规路径,崩溃后则进入 CrashReportActivity,引导用户在安全模式下重启,便于排查 Compose、WebSocket、GLSL 等模块的兼容性问题。
创新点与亮点
相比常见的本地播放器或单一源在线播放器,NeriPlayer 有三个差异化亮点。第一是「可选自托管同步」:用户可以把歌单、收藏、最近播放、播放统计等元数据同步到自己的 GitHub 私有仓库或 WebDAV 远端,应用内一键创建私有仓库,零额外服务器成本。这种「数据归用户所有」的设计在主流音乐 App 中几乎不存在。
第二是「Listen Together 一起听」自建服务端:通过 WebSocket 在两端同步播放状态、音量与队列进度,部署文档齐全,适合朋友、情侣甚至小社群异地共听。项目不提供任何中心化的「一起听」云端服务,所有会话都跑在用户自己的基础设施上。
第三是「体验细节拉满」:GLSL Shader 流体背景、Karaoke 逐字歌词、悬浮歌词、桌面与启动器快捷方式、USB 独占输出与均衡器等模块单拎出来都足以作为独立小项目展示。对开发者而言,这是阅读 Compose、Media3、ExoPlayer 扩展点(音频渲染、效果器、字幕)的一份活教材。
与同类项目对比
和同样主打本地的 Auxio、Vinyl、Phonograph 相比,NeriPlayer 胜在「多源」与「同步」,本地播放体验未必比这些专注本地库的播放器更极简,但换来的是不再需要「一个 App 播本地、另一个 App 搜新歌」。与主流平台的官方 App 相比,它没有推荐流、没有评论区、没有平台级社交,但换来了不锁账号、不上传历史、跨平台统一体验。值得注意的是,README 中明确不向第三方平台回写本地历史,这一克制是有意为之——避免触发风控、保护账号安全,但也意味着它无法提供「全平台统一收听历史」,是设计上的代价。
上手指南与注意事项
上手分两条路:纯用户从 Releases 页面下载最新 APK,最低 Android 9 即可安装,首次启动按提示登录第三方平台账号即可使用多源能力;想折腾「一起听」的用户,按 README 中「Listen Together 部署」章节自建服务端,常见部署方式是 VPS 或家用服务器,配置好 WebSocket 端口即可使用 GitHub 或 WebDAV 同步。开发者则可直接 clone 仓库,用最新 Android Studio 打开 Gradle 工程,模块化结构清晰,Compose 与 Media3 相关的实践值得借鉴。务必注意 README 顶部两条警告:本项目仅供学习研究,不提供媒体内容、密钥或绕过 DRM 的方案,也不接受任何形式的赞助捐赠。
总结与展望
NeriPlayer 不是一个「替代 Spotify」的产品,而是一份关于「多源 + 本地 + 自托管」的现代化 Android 实践。它把用户最关心的三件事——内容来源的统一、数据归属的自主、播放体验的品质——用一份 Kotlin 代码串了起来,并保持了活跃迭代。对想摆脱单一平台绑定、又愿意动手自建同步或一起听服务的用户来说,NeriPlayer 是当下最值得尝试的开源 Android 音乐客户端之一;对 Android 开发者来说,它也是阅读 Compose、Media3 与多模块协作的优质样本。后续若能在桌面端(如平板/折叠屏布局)、Linux 兼容(Waydroid 等场景)与同步冲突合并上继续打磨,将进一步巩固在自托管音乐 App 领域的口碑。
项目信息
| 项目名称 | cwuom/NeriPlayer |
| 编程语言 | Kotlin |
| Star 数 | 3110 |
| Fork 数 | 107 |
| 主题标签 | android, equalizer, exoplayer, glsl, jetpack-compose, karaoke-lyrics, listen-together, media3, music, native-apps, player, privacy-focused, self-hosted, shaders, usb-exclusive, webdav, websocket |