一款适用于 Subsonic 、Navidrome服务器的自托管音乐流媒体应用
  • Dart 77.9%
  • TypeScript 21.4%
  • Java 0.4%
  • JavaScript 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-19 12:22:44 +08:00
.assets 只编译最常用的 arm64 架构 2026-07-04 15:17:32 +08:00
.fvm v2 2023-04-28 12:26:02 +09:00
.vscode v2 2023-04-28 12:26:02 +09:00
android 取消编译副产物 2026-09-10 00:16:59 +08:00
assets 加入google sans flex字体 2026-09-10 15:55:32 +08:00
images v2 2023-04-28 12:26:02 +09:00
lib 加入google sans flex字体 2026-09-10 15:55:32 +08:00
metadata/en-US v2 2023-04-28 12:26:02 +09:00
scripts v2 2023-04-28 12:26:02 +09:00
subtracks-1.3.0 添加旧版源码对照 2026-07-05 13:41:18 +08:00
.env.example v2 2023-04-28 12:26:02 +09:00
.gitignore 编译和git配置 2026-07-05 23:38:46 +08:00
.gitlab-ci.yml 仅在tag时触发打包和发布 2026-07-05 13:50:21 +08:00
.metadata v2 2023-04-28 12:26:02 +09:00
.untranslated-messages.json 补充_InfoTile 自定义只读渲染组件类 2026-07-09 00:22:43 +08:00
analysis_options.yaml aab build, release signing 2023-04-28 12:26:02 +09:00
build.yaml v2 2023-04-28 12:26:02 +09:00
l10n.yaml v2 2023-04-28 12:26:02 +09:00
LICENSE add license 2021-08-23 14:48:24 +09:00
pubspec.lock 加入google sans flex字体 2026-09-10 15:55:32 +08:00
pubspec.yaml 加入google sans flex字体 2026-09-10 15:55:32 +08:00
README.md 编辑README.md 2026-09-19 12:22:13 +08:00
subtracks-ui-guide.md 去除日志并添加UI向导 2026-07-05 01:48:29 +08:00
TODO.md 更新依赖 2026-07-02 22:17:39 +08:00

subtracks logo

Subtracks 是一款专为 Subsonic 兼容 服务器(Subsonic、Navidrome、Airsonic 等)设计的 Android 开源音乐流媒体应用。它的设计旨在以现代媒体播放器的风格,为您提供整洁便捷的音乐访问体验。

GitLab Pipeline Status GitLab release F-Droid GitLab Repo stars

屏幕截图

首页 正在播放 媒体库专辑 专辑视图

下载

警告

上述每个下载源都使用不同的密钥进行签名,因此在不先卸载然后重新安装应用的情况下,您无法在它们之间切换。

功能

  • 默认显示专辑和艺术家封面(在详情/正在播放视图中为全分辨率)
  • 无缝播放
  • 支持多个服务器
  • 可筛选/排序的专辑和艺术家媒体库视图
  • 搜索艺术家、专辑和歌曲
  • 支持 Scrobble
  • 最大比特率和缓冲区大小设置
  • 循环和随机播放选项
  • 长按可显示上下文菜单快捷方式

即将推出™

  • 离线支持
  • 可自定义的首页分类
  • 支持按文件夹浏览(目前仅支持按标签浏览)
  • 识别多个音乐文件夹
  • 按年份/流派筛选专辑
  • 播放列表管理(添加/删除/排序/编辑)
  • 队列管理(添加/删除/排序)
  • 多选操作
  • 性能和动画改进
  • 更多随机播放模式

隐私政策

Subtracks 不包含广告,也不收集个人数据。我对广告或您的个人数据完全不感兴趣。Subtracks 没有服务器用于发送任何数据,因此没有任何信息会以任何方式传输给我或由我存储在您的设备之外。

存储在您设备上的唯一数据是关于您选择连接的服务器上的音乐信息。传输到这些服务器的数据受该服务器隐私政策的约束,我不会收集或存储这些数据。

构建

1. 安装 JDK 21(不要用系统默认最新版,Gradle 8.14.x 官方明确不支持 Java 24+)

下载 Eclipse Temurin 21: https://adoptium.net/temurin/releases/?version=21

安装完成后,让 Flutter 使用这个版本:

flutter config --jdk-dir="C:\Program Files\Eclipse Adoptium\jdk-21.0.11.10-hotspot"

2. 安装 Android SDK

方式一(省心,推荐):直接装 Android Studio,向导会自动配好 SDK、cmdline-tools、许可协议。 https://developer.android.com/studio

方式二(轻量,仅命令行工具):

# 下载 https://developer.android.com/studio#command-line-tools-only 的 zip
New-Item -ItemType Directory -Force -Path "C:\Android\sdk\cmdline-tools\latest"
Expand-Archive -Path "$env:USERPROFILE\Downloads\commandlinetools-win-*.zip" -DestinationPath "$env:TEMP\cmdline-tools-extract"
Move-Item -Path "$env:TEMP\cmdline-tools-extract\cmdline-tools\*" -Destination "C:\Android\sdk\cmdline-tools\latest\"

flutter config --android-sdk "C:\Android\sdk"

& "C:\Android\sdk\cmdline-tools\latest\bin\sdkmanager.bat" "platform-tools" "platforms;android-36" "build-tools;36.1.0"

flutter doctor --android-licenses

3. 验证环境

flutter doctor -v

确认:

  • Java version 显示 21.x(不是系统默认的最新版)
  • Android toolchain 是绿色 [√],SDK 路径不带空格

4. 克隆项目

git clone https://gitlab.com/guomengyao/subtracks.git
cd subtracks

如果遇到 Git 报 "dubious ownership"(仓库所有者和当前用户不一致):

git config --global --add safe.directory "路径"

5. 项目初始化(首次 clone 后需要跑一次)

Copy-Item .env.example .env
flutter pub get

android/local.properties 通常会自动生成;如果没有,手动补一个:

$flutterSdk = (Get-Command flutter).Source | Split-Path | Split-Path
"flutter.sdk=$flutterSdk" | Out-File -Encoding utf8 android\local.properties

日常打包流程(每次改完代码,重复这几步即可)

# 1. 只有依赖 (pubspec.yaml) 变了才需要
flutter pub get

# 2. 只有涉及 .g.dart / .freezed.dart 的模型/Provider 代码变了才需要
dart run build_runner build --delete-conflicting-outputs

# 3. 正式打包
flutter build apk --release --no-pub --no-version-check --no-tree-shake-icons --target-platform android-arm64

# 4.上述的打包找不到路径,使用原生路径
cd android

.\gradlew assembleRelease

已知问题:Flutter 工具报"找不到 APK 文件"

这是 Flutter 3.44.x 的 Gradle 插件已知 bug——Gradle 构建其实是成功的,只是没有把产物复制到 Flutter 期望检查的路径。看到这个报错不用慌,直接去 AGP 原生输出目录找:

Get-ChildItem android\app\build\outputs\apk\release\

app-release.apk 应该就在这里,直接复制出来安装:

Copy-Item "android\app\build\outputs\apk\release\app-release.apk" -Destination "$HOME\Desktop\app-release.apk"

常见坑速查

现象 原因 解决
Error resolving plugin ... > 25.0.2 本地 JDK 版本太新,Gradle 不兼容 用 flutter config --jdk-dir 指向 JDK 21
Android SDK location currently contains spaces 用户名/路径带空格 换不带空格的路径或新建不带空格的 Windows 账户
dubious ownership in repository Git 仓库所有者和当前系统用户不一致 git config --global --add safe.directory <路径>
改了 build.gradle 里的版本号,App 里显示还是旧的 忘记完全重新编译,或者手机装的是旧 APK 卸载手机上的旧版重装;确认改的是 android/app/build.gradle(不是根目录那个)
git status 冒出几百个文件 .gitignore 没排除 android/app/build/、android/.gradle/ 等目录 补充 .gitignore 规则,参考仓库里已配置好的版本
.g.dart 文件显示"已修改"但没手动改过 Windows 换行符 (CRLF) 与仓库 (LF) 不一致 git config --global core.autocrlf false,然后 git checkout -- <文件> 还原

许可证

Gitlab