【免费下载链接】Velune
A premium ad-free YouTube Music client for Android. Built with Kotlin & Jetpack Compose.
Velune 是一款用 Kotlin 与 Jetpack Compose 打造的高端无广告 YouTube Music 安卓客户端。本文将带你完整走一遍Velune 构建与发布流程:从本地源码编译、release 签名打包,到通过 F-Droid、Obtainium、IzzyOnDroid 三大渠道把安装包安全地交付给全球用户。
一、先认识 Velune 的 3 大分发渠道
与上架 Google Play 不同,Velune 主要依靠开源社区的 3 条分发链路触达用户,这也是它"无广告、无订阅"理念的自然延伸:
| 渠道 | 类型 | 特点 |
|---|---|---|
| F-Droid | 开源应用商店 | 面向完全开源项目的商店,强调可复现构建与透明供应链 |
| IzzyOnDroid | 独立 F-Droid 仓库 | 由个人维护的 F-Droid 仓库,收录了包名为com.nikhil.yt的 Velune |
| Obtainium | 应用更新工具 | 基于 GitHub Releases 自动拉取并验证签名,用户"添加即自动更新" |
💡 这三条渠道都要求构建产物可验证、签名一致,因此构建与签名环节的正确性直接决定了用户能否顺利安装和更新。
二、环境准备:JDK、Android Studio 与 SDK
按照官方工程指南 CONTRIBUTING.md 的"Operational Readiness"章节,推荐环境如下:
- IDE:Android Studio Ladybug(2024.2.1)或更新版本
- JDK:项目使用 AGP 9.1.1,并在 app/build.gradle.kts 中通过
jvmToolchain(21)锁定 Java 21 工具链,建议直接安装JDK 21 - Android SDK:
compileSdk = 36、minSdk = 26(见 app/build.gradle.kts) - Git:2.40 以上
克隆仓库并初始化:
git clone https://gitcode.com/gh_mirrors/ve/Velune cd Velune然后在local.properties中配置 SDK 路径:
sdk.dir=/path/to/your/android/sdk🔑 构建脚本支持从local.properties或环境变量读取可选密钥(app/build.gradle.kts):LASTFM_API_KEY、LASTFM_SECRET、TOGETHER_BEARER_TOKEN。本地构建不填也可以,对应功能自动降级。
三、本地构建 Velune:4 条核心命令
所有构建统一走 Gradle Wrapper,官方推荐的命令矩阵如下(来自 CONTRIBUTING.md):
| 命令 | 产物 | 适用场景 |
|---|---|---|
./gradlew assembleDebug | app-debug.apk | 本地测试与功能开发 |
./gradlew assembleRelease | app-release.apk | 生产级、R8 优化后的发布包 |
./gradlew bundleRelease | app-release.aab | 分发用 Bundle 格式 |
./gradlew clean | — | 清空构建缓存,解决同步异常 |
⚠️ 注意:Velune 定义了5 个 ABI 变体(universal/arm64/armeabi/x86/x86_64,见 app/build.gradle.kts),release 产物按变体区分,例如 arm64 构建对应arm64Release变体,仓库中的 output-metadata.json 即为该变体的产物元数据(app-arm64-release.apk)。
发布前的 3 道质量门禁
提交或发布前,开发者需依次通过:
./gradlew lintDebug—— Android XML / Compose 静态规范检查./gradlew ktlintCheck—— Kotlin 代码风格一致性./gradlew testDebugUnitTest—— 架构级单元测试
四、解析 release 构建:R8 混淆、签名与版本管理
打开 app/build.gradle.kts 可以看到 release 构建的三大关键设置:
- R8 混淆 + 资源压缩:
isMinifyEnabled = true与isShrinkResources = true同时开启,配合 app/proguard-rules.pro 中的保留规则(Kotlin Serialization 伴生对象、NewPipeExtractor 反射类、Media3 保护规则等),在缩包的同时保证运行时行为正确; - release 签名:app/build.gradle.kts 会检测
keystore/release.keystore是否存在,并从环境变量STORE_PASSWORD、KEY_ALIAS、KEY_PASSWORD读取签名凭据——密钥文件不入库,只在构建机或 CI 中注入,这是安全发布的基本盘; - 版本号管理:
versionCode与versionName集中定义在 app/build.gradle.kts,每次发版必须递增,否则 F-Droid / Obtainium 等渠道会拒绝更新。
🛠 构建性能方面,gradle.properties 为 Gradle 与 Kotlin 守护进程各预留了 4 GB 堆内存并开启并行构建;若遇到GC overhead limit exceeded,可参照 CONTRIBUTING.md 的排障建议调大org.gradle.jvmargs。依赖版本则统一收敛在 gradle/libs.versions.toml(Version Catalog),由 renovate.json 驱动的 Renovate 机器人自动提 PR 升级,避免版本漂移。
五、F-Droid 打包的关键考量
F-Droid 对"全开源 + 可复现构建"有严格要求,Velune 在工程配置里为此做了专门适配:
- settings.gradle.kts 中明确注释:
F-Droid doesn't support foojay-resolver plugin,因此 foojay-resolver-convention 插件被刻意禁用,保证在 F-Droid 构建器(buildserver)环境下可正常执行; - 多模块结构(
app/innertube/kugou/lrclib/lastfm/simpmusic/betterlyrics/kizzy/canvas)全部为 Gradle 子项目(settings.gradle.kts),F-Droid 侧只需声明app为入口模块即可整体打包; - settings.gradle.kts 还保留了本地替换 NewPipeExtractor 的
includeBuild方案注释,方便维护者在依赖源不稳定时切换到本地源码构建,提升供应链韧性。
六、通过 Obtainium 与 IzzyOnDroid 触达用户
进入 fastlane/metadata/android/en-US/ 目录,你能看到完整的商店元数据:title.txt、short_description.txt、full_description.txt以及按版本归档的更新日志(changelogs/8.txt 记录了 ListenTogether 上线与播放中断修复等内容)。这些文件同样服务于 Obtainium / IzzyOnDroid 渠道的展示与审计,并且整套文案已扩展至 15+ 个语种(de-DE、es、fr-FR、it、ja等目录)。
两条渠道的工作方式:
- Obtainium:用户通过深链接把 Velune 的 Releases 页面加入 Obtainium,工具会持续监控新 Release、下载对应 ABI 的 APK 并做签名验证,实现"类系统应用商店"的更新体验;
- IzzyOnDroid:作为独立 F-Droid 仓库,用户添加仓库源后即可像安装任何 F-Droid 应用一样安装与更新
com.nikhil.yt。
🌐 国际化由 crowdin.yml 驱动:以strings.xml/velune_strings.xml为源文件,自动分发到各values-xx目录,翻译与构建流水线解耦。
七、内置更新机制:让 Release 闭环跑起来
发布只是起点,Velune 还内置了完整的更新链路:
- Release 轮询:Updater.kt 定时拉取 Releases API,采用ETag 协商缓存 + 6 小时间隔策略降低流量,
getLatestDownloadUrl()会根据BuildConfig.ARCHITECTURE精确拼接对应 ABI 的 APK 下载地址(Updater.kt); - 后台检查任务:UpdateCheckWorker.kt 基于 WorkManager 周期性比对
BuildConfig.VERSION_NAME与最新版本,仅在 STABLE 渠道推送更新通知,NIGHTLY 渠道交由外部工具处理; - 渠道分工:MainActivity.kt 中可以看到针对 IzzyOnDroid 渠道关闭内置更新弹窗的注释——由宿主仓库负责更新,避免双重提示。
八、常见问题速查
| 症状 | 原因与对策 |
|---|---|
GC overhead limit exceeded | 堆内存不足,调大 gradle.properties 中的jvmargs |
| Compose 编译器报错 | 检查 Compose Compiler 版本与 Kotlin 版本是否匹配(统一由 Version Catalog 管理) |
| 依赖下载超时 | 项目已为 JitPack 预留 180s 超时(gradle.properties),仍失败可检查网络 |
| F-Droid 构建失败 | 确认未启用 foojay-resolver 等 F-Droid 不兼容的插件 |
小结:Velune 的发布体系 = Gradle KTS 多 ABI 构建 + R8 混淆签名 + fastlane 元数据 + F-Droid / Obtainium / IzzyOnDroid 三渠道分发 + 内置 ETag 轮询更新。掌握这条链路,你就能理解一个现代开源安卓客户端是如何做到"安全、透明、可复现"地交付到每位用户手中的。🎧
【免费下载链接】Velune
A premium ad-free YouTube Music client for Android. Built with Kotlin & Jetpack Compose.
相关推荐
WebLLM构建指南:从源码编译到打包发布
WebLLM构建指南:从源码编译到打包发布 概述 WebLLM是一个革命性的浏览器内大语言模型推理引擎,它将高性能的LLM(Large Language Mod
人工智能大模型推理引擎本地部署RustDesk 如何按 F-Droid 构建流程编译 F-Droid 版 Android APK?
RustDesk 如何按 F Droid 构建流程编译 F Droid 版 Android APK? 如果你在自行构建 RustDesk 的 Android 包
音视频通信网络Angel 3.3.0 编译指南:从源码手动构建与 Docker 构建到发布包
Angel 3.3.0 编译指南:从源码手动构建与 Docker 构建到发布包 本篇编译指南以 Angel(Tencent 开源的大规模机器学习参数服务器,仓库
人工智能机器学习分布式训练图计算后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考