A modern Material 3 music player built with Flutter & Rust.
一个以 Material 3 与 Apple Music 风格体验为核心的 Android 音乐客户端。
MD3Music 是一款基于酷狗音乐 API 的 Flutter 音乐播放器,内置嵌入式 Rust API 服务器,无需外部服务器即可使用。支持手机/平板自适应、MD3 与 Apple Music 风格播放页、逐字歌词和多种音频输出能力。本项目仅供学习,请勿用于商业用途,详情见免责声明。
版本说明:V5 之前的所有版本与分支均已废弃并彻底删除,请勿使用过时版本。最新版请前往 GitHub Releases。
由于私有库开发同步会覆盖公开库代码,公开库代码现由脚本全量推送至公开库
rust-local-force分支。投屏功能声明:投屏采用行业标准的通用传输协议(DLNA/AirPlay),仅用于在个人家庭网络内将音乐流转至用户本人合法拥有的播放设备,不涉及对音乐文件的再存储、分发或向公众传播。
请勿用于公共场所播放或多人同步观看场景,否则由此引发的一切法律责任由使用者自行承担。
README 中展示的是静态趋势预览。点击图表打开开源榜交互页面后,可将鼠标悬停在曲线上查看对应日期、Stars 和单日增长。数据由 GitHub Actions 定时读取 GitHub API,并保存为仓库内的每日历史快照。
┌───────────────────────────────────────────────────────────────┐
│ MD3Music App │
│ ┌───────────────────────┐ ┌─────────────────────────┐ │
│ │ Flutter UI (Dart) │ │ 嵌入式 Rust API 服务器 │ │
│ │ │ │ (127.0.0.1) │ │
│ └───────────┬───────────┘ └───────────┬─────────────┘ │
│ │ JNI / FFI │ │
│ └─────────────────┬────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 本地数据 / 缓存 │ │
│ └──────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────┘
libkugou_server.so(JNI/MethodChannel)启动本地 tiny_http 服务器(127.0.0.1),所有酷狗 API 请求在本地处理项目已配置 GitHub Actions 自动构建,推送 v* 标签即可触发:
.so 可跳过)已验证构建环境:Flutter 3.47.5、Dart 3.12.x、Android NDK 28。
git clone https://github.com/zzyoxml/md3Music.git
cd md3Music
flutter pub get
libkugou_server.so 已提交进 Git 仓库,通常无需重新编译。仅当你修改了 kugou_api_server/rust/src/ 下的代码时才需要重建:
# 主机编译验证
cd kugou_api_server/rust
cargo build --release
# 安卓交叉编译(4 个 ABI,需要 NDK)
./build_android.sh
# 连接 Android 设备后执行
flutter run
# 一键打包(Rust 交叉编译按需 + Flutter 分包;默认 release / 两个 flavor / 全部 ABI)
.\scripts\md3.ps1 android
# 输出位置(产物已按中文命名,便于区分;<版本> 取自 pubspec.yaml,如 5.7.0):
# build/app/outputs/flutter-apk/(推荐)MD3音乐-<版本>-标准版-64位.apk (arm64-v8a,推荐默认下载项)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-标准版-32位.apk (armeabi-v7a,较旧设备)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-标准版-模拟器.apk (x86_64)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-3D封面版-64位.apk (内置 3D 深度封面)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-随身听兼容版-64位.apk (Vivo 原子随身听;包名 com.apple.android.music)
中文名由打包脚本在构建完成后重命名(Flutter/Gradle 内部仍用
app-<abi>-<flavor>-<type>.apk)。 直接调用flutter build apk --release --flavor standard --split-per-abi得到的仍是英文原生名。
md3Music/
├── lib/ # Flutter 应用代码
│ ├── main.dart # 应用入口
│ ├── app.dart # 主应用组件
│ ├── core/ # 核心模块
│ │ ├── layout/ # 响应式布局
│ │ ├── services/ # 平台服务(音频/USB 独占/均衡器/DLNA 投屏/频谱/桌面歌词/词幕/小组件)
│ │ ├── theme/ # 主题配置
│ │ └── utils/ # 工具类
│ ├── data/ # 数据层
│ │ ├── models/ # 数据模型
│ │ └── repositories/ # 数据仓库(设置/收藏/历史)
│ ├── modules/ # 功能模块
│ │ ├── home/ # 主页(每日推荐等)
│ │ ├── launchpad/ # LaunchPad 导航
│ │ ├── discover/ # 发现页
│ │ ├── charts/ # 排行榜
│ │ ├── coverflow/ # 封面流(CoverFlow 3D)
│ │ ├── player/ # 播放器(含评论视图/MV 播放)
│ │ ├── playlist/ # 歌单详情
│ │ ├── search/ # 搜索
│ │ ├── album/ # 专辑详情
│ │ ├── artist/ # 歌手详情
│ │ ├── personal_fm/ # 私人 FM
│ │ ├── ip/ # 编辑精选
│ │ ├── audiobook/ # 听书
│ │ ├── scene/ # 场景音乐
│ │ ├── channel/ # 频道
│ │ ├── brush/ # 刷刷(竖屏视频流)
│ │ ├── user/ # 用户中心(签到/收藏/历史/听歌排行)
│ │ ├── library/ # 音乐库(本地音乐/云盘)
│ │ ├── settings/ # 设置(含均衡器)
│ │ ├── login/ # 登录
│ │ ├── onboarding/ # 新手引导
│ │ └── recognition/ # 听歌识曲
│ ├── providers/ # 状态管理
│ ├── services/ # 服务层(本地 API 客户端 / 服务器启动)
│ └── widgets/ # 公共组件
│ └── apple_lyrics/ # Apple Music 风格歌词
├── kugou_api_server/ # 嵌入式 Rust API 服务器
│ ├── rust/ # Rust crate(tiny_http + ureq)
│ │ ├── src/
│ │ │ ├── lib.rs # FFI/JNI 导出符号
│ │ │ ├── server.rs # HTTP 服务器:路由分发、CORS、缓存
│ │ │ ├── modules/ # 160+ 个 API 模块
│ │ │ ├── crypto.rs # MD5/SHA1/AES/RSA 加密
│ │ │ ├── request.rs # 上游转发(ureq)
│ │ │ └── device.rs # 设备信息持久化
│ │ ├── tests/smoke.rs # 本地冒烟测试
│ │ ├── build_android.sh # 一键交叉编译脚本
│ │ └── Cargo.toml
│ └── module/ # 旧 JS 模块(已废弃,仅供参考)
├── img/ # 界面预览截图(README 用)
│ ├── phone/ # 手机:md3 / applemusic / other
│ └── pad/ # 平板:md3 / applemusic / other
├── assets/ # 资源文件
│ ├── images/ # 图片资源
│ └── fonts/ # 字体文件
├── android/ # Android 平台配置
│ └── app/src/main/
│ ├── cpp/ # USB 独占输出 C++ 驱动(CMake)
│ ├── kotlin/ # KugouApiService(启动本地服务器)/ MainActivity
│ └── jniLibs/ # libkugou_server.so(四个架构)
└── pubspec.yaml # Flutter 配置
| 类别 | 技术 |
|---|---|
| UI 框架 | Flutter 3.47.0+ |
| 状态管理 | Provider |
| 动效 | m3e_core(M3 Expressive Motion) |
| 音频播放 | just_audio + just_audio_background |
| 音频焦点 | audio_session |
| 网络请求 | Dio |
| 本地存储 | SharedPreferences + SQLite |
| 图片缓存 | cached_network_image |
| 嵌入式服务器 | Rust(tiny_http + ureq) |
| 加密 | rsa / aes / md-5 / sha1 / sha2 |
| 元数据读写 | audio_metadata_reader + JAudioTagger (MP3/FLAC/M4A) |
| DLNA 投屏 | dlna_dart |
| MV 播放 | video_player + chewie |
| USB 独占输出 | 原生 JNI + CMake C++(usbdevfs) |
| 取色 | palette_generator + dynamic_color + material_color_utilities |
| 桌面歌词 | Lyricon Provider |
| 状态栏歌词 | Flyme 状态栏 ticker(魅族私有 flag) |
| 听歌识曲 | record(录音)+ Rust PCM 预处理 |
| 原生通知 | fluttertoast(Toast) |
| 文件/权限 | permission_handler + path_provider |
| 桌面快捷方式 | quick_actions |
| 音频均衡器 | just_audio 平台均衡器 |
| 音乐源 | 酷狗音乐 API |
应用启动时自动启动本地 Rust 服务器(libkugou_server.so),监听 127.0.0.1 的随机端口(10000~60000,被占用自动更换),实际端口由服务器启动后回传给应用,无需任何配置。
| 音质 | 格式 | 比特率 |
|---|---|---|
| 标准 | MP3 | 128 kbps |
| 高质 | MP3 | 320 kbps |
| 无损 | FLAC | ~1000 kbps |
| Hi-Res | FLAC/MKV | ~2000+ kbps |
kugou_api_server/rust/src/ 目录下的 Rust 源代码cd kugou_api_server/rust
cargo build --release
cargo test # 运行测试
cargo clippy # 静态检查
./build_android.sh在 kugou_api_server/rust/src/modules/ 下新建 .rs 文件,实现对应的 API 端点处理函数,然后在 server.rs 中注册路由即可。
若要在本地(不嵌入 App)调试 API 服务器:
cd kugou_api_server/rust
cargo test # 本地测试
**Q: 有没有Windows版本? A: 有,由于主要开发Android版本 ,没有那么多精力再多维护windows ,不过我们在https://github.com/zzyoxml/md3Music/blob/rust-local-force/scripts/tasks/windows.ps1 提供了构建打包脚本 ,可以自行打包 ,大部分功能可用 ,少部分 失效。
Q: 应用启动后无法搜索或播放音乐?
A: 检查日志确认 Rust 服务器是否成功启动。在 Android Studio Logcat 中搜索 KugouApiService 查看启动日志。
Q: 登录功能无法使用?
A: 登录/注册/验证码已全部本地化:由嵌入式 Rust 服务器直连酷狗官方接口处理,不再依赖第三方云端。请确保设备可正常联网,并在 Logcat 中搜索 KugouApiService 确认本地服务器已成功启动。
Q: 如何修改 API 服务器代码?
A: 修改 kugou_api_server/rust/src/ 下的 Rust 代码,运行 cargo build --release 编译验证,安卓侧执行 ./build_android.sh 交叉编译,再重新编译 App。
Q: 为什么 Rust 服务器需要 NDK?
A: Rust 的 TLS 依赖(ring crate)需要交叉编译为 Android 平台的 .so 文件。NDK 提供了 aarch64-linux-android-clang 等交叉编译工具链。
Q: 设置里找不到「状态栏歌词」开关?
A: 该开关仅在魅族 Flyme 机型上出现(由设备能力探测决定),其他品牌不显示。
decent-usb-audio-driver)感谢所有为 MD3Music 做出贡献的朋友:
本项目采用 GNU AGPL-3.0 许可证。
Made with ❤️ by zzyoxml
Dart
81.6%
Kotlin
9.4%
Rust
7.5%
A modern Material 3 music player built with Flutter & Rust.
一个以 Material 3 与 Apple Music 风格体验为核心的 Android 音乐客户端。
MD3Music 是一款基于酷狗音乐 API 的 Flutter 音乐播放器,内置嵌入式 Rust API 服务器,无需外部服务器即可使用。支持手机/平板自适应、MD3 与 Apple Music 风格播放页、逐字歌词和多种音频输出能力。本项目仅供学习,请勿用于商业用途,详情见免责声明。
版本说明:V5 之前的所有版本与分支均已废弃并彻底删除,请勿使用过时版本。最新版请前往 GitHub Releases。
由于私有库开发同步会覆盖公开库代码,公开库代码现由脚本全量推送至公开库
rust-local-force分支。投屏功能声明:投屏采用行业标准的通用传输协议(DLNA/AirPlay),仅用于在个人家庭网络内将音乐流转至用户本人合法拥有的播放设备,不涉及对音乐文件的再存储、分发或向公众传播。
请勿用于公共场所播放或多人同步观看场景,否则由此引发的一切法律责任由使用者自行承担。
README 中展示的是静态趋势预览。点击图表打开开源榜交互页面后,可将鼠标悬停在曲线上查看对应日期、Stars 和单日增长。数据由 GitHub Actions 定时读取 GitHub API,并保存为仓库内的每日历史快照。
┌───────────────────────────────────────────────────────────────┐
│ MD3Music App │
│ ┌───────────────────────┐ ┌─────────────────────────┐ │
│ │ Flutter UI (Dart) │ │ 嵌入式 Rust API 服务器 │ │
│ │ │ │ (127.0.0.1) │ │
│ └───────────┬───────────┘ └───────────┬─────────────┘ │
│ │ JNI / FFI │ │
│ └─────────────────┬────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ 本地数据 / 缓存 │ │
│ └──────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────┘
libkugou_server.so(JNI/MethodChannel)启动本地 tiny_http 服务器(127.0.0.1),所有酷狗 API 请求在本地处理项目已配置 GitHub Actions 自动构建,推送 v* 标签即可触发:
.so 可跳过)已验证构建环境:Flutter 3.47.5、Dart 3.12.x、Android NDK 28。
git clone https://github.com/zzyoxml/md3Music.git
cd md3Music
flutter pub get
libkugou_server.so 已提交进 Git 仓库,通常无需重新编译。仅当你修改了 kugou_api_server/rust/src/ 下的代码时才需要重建:
# 主机编译验证
cd kugou_api_server/rust
cargo build --release
# 安卓交叉编译(4 个 ABI,需要 NDK)
./build_android.sh
# 连接 Android 设备后执行
flutter run
# 一键打包(Rust 交叉编译按需 + Flutter 分包;默认 release / 两个 flavor / 全部 ABI)
.\scripts\md3.ps1 android
# 输出位置(产物已按中文命名,便于区分;<版本> 取自 pubspec.yaml,如 5.7.0):
# build/app/outputs/flutter-apk/(推荐)MD3音乐-<版本>-标准版-64位.apk (arm64-v8a,推荐默认下载项)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-标准版-32位.apk (armeabi-v7a,较旧设备)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-标准版-模拟器.apk (x86_64)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-3D封面版-64位.apk (内置 3D 深度封面)
# build/app/outputs/flutter-apk/MD3音乐-<版本>-随身听兼容版-64位.apk (Vivo 原子随身听;包名 com.apple.android.music)
中文名由打包脚本在构建完成后重命名(Flutter/Gradle 内部仍用
app-<abi>-<flavor>-<type>.apk)。 直接调用flutter build apk --release --flavor standard --split-per-abi得到的仍是英文原生名。
md3Music/
├── lib/ # Flutter 应用代码
│ ├── main.dart # 应用入口
│ ├── app.dart # 主应用组件
│ ├── core/ # 核心模块
│ │ ├── layout/ # 响应式布局
│ │ ├── services/ # 平台服务(音频/USB 独占/均衡器/DLNA 投屏/频谱/桌面歌词/词幕/小组件)
│ │ ├── theme/ # 主题配置
│ │ └── utils/ # 工具类
│ ├── data/ # 数据层
│ │ ├── models/ # 数据模型
│ │ └── repositories/ # 数据仓库(设置/收藏/历史)
│ ├── modules/ # 功能模块
│ │ ├── home/ # 主页(每日推荐等)
│ │ ├── launchpad/ # LaunchPad 导航
│ │ ├── discover/ # 发现页
│ │ ├── charts/ # 排行榜
│ │ ├── coverflow/ # 封面流(CoverFlow 3D)
│ │ ├── player/ # 播放器(含评论视图/MV 播放)
│ │ ├── playlist/ # 歌单详情
│ │ ├── search/ # 搜索
│ │ ├── album/ # 专辑详情
│ │ ├── artist/ # 歌手详情
│ │ ├── personal_fm/ # 私人 FM
│ │ ├── ip/ # 编辑精选
│ │ ├── audiobook/ # 听书
│ │ ├── scene/ # 场景音乐
│ │ ├── channel/ # 频道
│ │ ├── brush/ # 刷刷(竖屏视频流)
│ │ ├── user/ # 用户中心(签到/收藏/历史/听歌排行)
│ │ ├── library/ # 音乐库(本地音乐/云盘)
│ │ ├── settings/ # 设置(含均衡器)
│ │ ├── login/ # 登录
│ │ ├── onboarding/ # 新手引导
│ │ └── recognition/ # 听歌识曲
│ ├── providers/ # 状态管理
│ ├── services/ # 服务层(本地 API 客户端 / 服务器启动)
│ └── widgets/ # 公共组件
│ └── apple_lyrics/ # Apple Music 风格歌词
├── kugou_api_server/ # 嵌入式 Rust API 服务器
│ ├── rust/ # Rust crate(tiny_http + ureq)
│ │ ├── src/
│ │ │ ├── lib.rs # FFI/JNI 导出符号
│ │ │ ├── server.rs # HTTP 服务器:路由分发、CORS、缓存
│ │ │ ├── modules/ # 160+ 个 API 模块
│ │ │ ├── crypto.rs # MD5/SHA1/AES/RSA 加密
│ │ │ ├── request.rs # 上游转发(ureq)
│ │ │ └── device.rs # 设备信息持久化
│ │ ├── tests/smoke.rs # 本地冒烟测试
│ │ ├── build_android.sh # 一键交叉编译脚本
│ │ └── Cargo.toml
│ └── module/ # 旧 JS 模块(已废弃,仅供参考)
├── img/ # 界面预览截图(README 用)
│ ├── phone/ # 手机:md3 / applemusic / other
│ └── pad/ # 平板:md3 / applemusic / other
├── assets/ # 资源文件
│ ├── images/ # 图片资源
│ └── fonts/ # 字体文件
├── android/ # Android 平台配置
│ └── app/src/main/
│ ├── cpp/ # USB 独占输出 C++ 驱动(CMake)
│ ├── kotlin/ # KugouApiService(启动本地服务器)/ MainActivity
│ └── jniLibs/ # libkugou_server.so(四个架构)
└── pubspec.yaml # Flutter 配置
| 类别 | 技术 |
|---|---|
| UI 框架 | Flutter 3.47.0+ |
| 状态管理 | Provider |
| 动效 | m3e_core(M3 Expressive Motion) |
| 音频播放 | just_audio + just_audio_background |
| 音频焦点 | audio_session |
| 网络请求 | Dio |
| 本地存储 | SharedPreferences + SQLite |
| 图片缓存 | cached_network_image |
| 嵌入式服务器 | Rust(tiny_http + ureq) |
| 加密 | rsa / aes / md-5 / sha1 / sha2 |
| 元数据读写 | audio_metadata_reader + JAudioTagger (MP3/FLAC/M4A) |
| DLNA 投屏 | dlna_dart |
| MV 播放 | video_player + chewie |
| USB 独占输出 | 原生 JNI + CMake C++(usbdevfs) |
| 取色 | palette_generator + dynamic_color + material_color_utilities |
| 桌面歌词 | Lyricon Provider |
| 状态栏歌词 | Flyme 状态栏 ticker(魅族私有 flag) |
| 听歌识曲 | record(录音)+ Rust PCM 预处理 |
| 原生通知 | fluttertoast(Toast) |
| 文件/权限 | permission_handler + path_provider |
| 桌面快捷方式 | quick_actions |
| 音频均衡器 | just_audio 平台均衡器 |
| 音乐源 | 酷狗音乐 API |
应用启动时自动启动本地 Rust 服务器(libkugou_server.so),监听 127.0.0.1 的随机端口(10000~60000,被占用自动更换),实际端口由服务器启动后回传给应用,无需任何配置。
| 音质 | 格式 | 比特率 |
|---|---|---|
| 标准 | MP3 | 128 kbps |
| 高质 | MP3 | 320 kbps |
| 无损 | FLAC | ~1000 kbps |
| Hi-Res | FLAC/MKV | ~2000+ kbps |
kugou_api_server/rust/src/ 目录下的 Rust 源代码cd kugou_api_server/rust
cargo build --release
cargo test # 运行测试
cargo clippy # 静态检查
./build_android.sh在 kugou_api_server/rust/src/modules/ 下新建 .rs 文件,实现对应的 API 端点处理函数,然后在 server.rs 中注册路由即可。
若要在本地(不嵌入 App)调试 API 服务器:
cd kugou_api_server/rust
cargo test # 本地测试
**Q: 有没有Windows版本? A: 有,由于主要开发Android版本 ,没有那么多精力再多维护windows ,不过我们在https://github.com/zzyoxml/md3Music/blob/rust-local-force/scripts/tasks/windows.ps1 提供了构建打包脚本 ,可以自行打包 ,大部分功能可用 ,少部分 失效。
Q: 应用启动后无法搜索或播放音乐?
A: 检查日志确认 Rust 服务器是否成功启动。在 Android Studio Logcat 中搜索 KugouApiService 查看启动日志。
Q: 登录功能无法使用?
A: 登录/注册/验证码已全部本地化:由嵌入式 Rust 服务器直连酷狗官方接口处理,不再依赖第三方云端。请确保设备可正常联网,并在 Logcat 中搜索 KugouApiService 确认本地服务器已成功启动。
Q: 如何修改 API 服务器代码?
A: 修改 kugou_api_server/rust/src/ 下的 Rust 代码,运行 cargo build --release 编译验证,安卓侧执行 ./build_android.sh 交叉编译,再重新编译 App。
Q: 为什么 Rust 服务器需要 NDK?
A: Rust 的 TLS 依赖(ring crate)需要交叉编译为 Android 平台的 .so 文件。NDK 提供了 aarch64-linux-android-clang 等交叉编译工具链。
Q: 设置里找不到「状态栏歌词」开关?
A: 该开关仅在魅族 Flyme 机型上出现(由设备能力探测决定),其他品牌不显示。
decent-usb-audio-driver)感谢所有为 MD3Music 做出贡献的朋友:
本项目采用 GNU AGPL-3.0 许可证。
Made with ❤️ by zzyoxml
Dart
81.6%
Kotlin
9.4%
Rust
7.5%