想让你的开源Flutter应用触达那批最挑剔的隐私敏感用户?F-Droid是个绝佳渠道。但从本地项目到GitHub Actions流水线,再到F-Droid严苛的构建服务器,这条路坑不少。这篇指南基于GitHub托管代码的假设,其他平台流程类似,CI/CD步骤需自行调整。
本地项目准备:先过三道关
![]()
自动化之前,先搞定Android项目的F-Droid合规改造。
![]()
第一关是"反功能"清理。F-Droid对专有软件零容忍,检查你的依赖:有没有闭源的Google Play服务、分析追踪器、专有崩溃报告工具?如果确实需要,必须在元数据中声明。不确定的话,先读F-Droid的Anti-Features文档。
第二关改build.gradle.kts。三个目标:动态加载签名配置、剔除Google专有依赖块、按架构拆分APK(F-Droid强烈推荐)。关键配置如下:
签名配置段检测CI环境变量,自动切换release或debug签名。release构建开启代码压缩和资源缩减。dependenciesInfo块设置includeInApk和includeInBundle为false,彻底剥离Google专有信息。最后加上ABI拆分版本号生成逻辑,armeabi-v7a、arm64-v8a、x86_64分别映射版本号后缀1、2、3。
第三关生成密钥库。终端执行keytool命令创建.jks文件,务必记住密码并备份——丢了就永远无法更新应用。接着转Base64:base64 -i <文件名>.jks > keystore_b64.txt,方便安全传入GitHub Actions。
GitHub Actions自动化:构建流水线配置
密钥准备好了,现在搭自动化流水线。把Base64字符串存入GitHub Secrets,命名建议KEYSTORE_B64。工作流文件核心步骤:检出代码、设置Flutter环境、解码密钥库、注入环境变量、构建多架构APK。
![]()
环境变量需要配置KEY_ALIAS、KEY_PASSWORD、KEYSTORE_PATH、KEYSTORE_PASSWORD四项,均从Secrets读取。构建命令用flutter build apk --split-per-abi,产出按架构分离的包。
F-Droid元数据:最后一公里的格式战
GitHub侧跑通后,向F-Droid提交合并请求。需要在他们的data仓库创建应用元数据文件,格式是YAML。核心字段包括:Categories、License、SourceCode、IssueTracker、Changelog等链接,以及Build段的版本信息。
Build段最关键:指定commit哈希、versionName、versionCode,以及构建命令。F-Droid服务器会用你提供的步骤从零构建APK,再与你GitHub Release上传的签名APK比对——完全一致才放行。这意味着你的本地构建和F-Droid服务器构建必须比特级一致,任何环境差异都会导致校验失败。
常见卡点:Flutter版本锁定(用submodules或精确版本号)、依赖预下载(避免构建时网络波动)、NDK版本对齐。建议先用fdroidserver本地工具链验证元数据,再提MR,能省掉几轮往返。
整个流程走通一次后,后续版本更新只需 bump versionCode、打tag、推Release,GitHub Actions自动构建,F-Droid检测到新tag后自动触发收录——隐私极客们就能在客户端收到更新通知了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.