ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Velune 构建与发布指南:从源码编译到 F-Droid、Obtainium、IzzyOnDroid 分发

Velune 构建与发布指南:从源码编译到 F-Droid、Obtainium、IzzyOnDroid 分发

【免费下载链接】Velune

A premium ad-free YouTube Music client for Android. Built with Kotlin & Jetpack Compose.

项目地址:https://gitcode.com/gh_mirrors/ve/Velune
点击查看免费下载

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 assembleDebugapp-debug.apk本地测试与功能开发
./gradlew assembleReleaseapp-release.apk生产级、R8 优化后的发布包
./gradlew bundleReleaseapp-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 构建的三大关键设置:

  1. R8 混淆 + 资源压缩:isMinifyEnabled = true与isShrinkResources = true同时开启,配合 app/proguard-rules.pro 中的保留规则(Kotlin Serialization 伴生对象、NewPipeExtractor 反射类、Media3 保护规则等),在缩包的同时保证运行时行为正确;
  2. release 签名:app/build.gradle.kts 会检测keystore/release.keystore是否存在,并从环境变量STORE_PASSWORD、KEY_ALIAS、KEY_PASSWORD读取签名凭据——密钥文件不入库,只在构建机或 CI 中注入,这是安全发布的基本盘;
  3. 版本号管理: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.

项目地址:https://gitcode.com/gh_mirrors/ve/Velune
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进