Один из первых вопросов, который я получил, когда объявил о публикации нового приложения с открытым исходным кодом в Google Play Store, был: «Как узнать, что ваш код на GitHub — это тот же самый код, с помощью которого создано приложение в Google Play?».
Сначала этот вопрос показался мне несколько нелепым. Стал бы кто-то публиковать код, который отличается от кода в его репозитории? К сожалению, некоторые недобросовестные разработчики регулярно практикуют такое поведение. Именно здесь особенно полезен F-Droid.
F-Droid — это каталог FOSS (Free and Open Source Software) приложений для платформы Android. Это действительно замечательный инструмент по нескольким причинам, помимо каталога приложений:
- Доверенный процесс CI-сборки, который создает ваше приложение непосредственно из исходного кода.
- Расширенное сканирование приложений на наличие библиотек и плагинов, не являющихся FOSS.
- Простая настройка для автоматического обновления версий.
- Подробные разрешения приложения, история версий сборки (легкий откат к другим версиям), трекер проблем, подробности про лицензии и многое другое.
Процесс публикации
Первым шагом в публикации на F-Droid является подготовка репозитория. Существует несколько различных способов, но я использовал рекомендуемый процесс с помощью инструмента под названием Fastlane.
Настройка Fastlane
Чтобы настроить репозиторий для работы с Fastlane, следуйте инструкциям, описанным в этом сниппете.
В качестве реального примера можно посмотреть репозиторий моего приложения здесь.
Оценка зависимостей (необязательно)
Когда я впервые попытался опубликовать приложение на F-Droid, у меня возникло несколько проблем с конвейером. Прочитав логи конвейера в GitLab, я понял, что база данных моего приложения (ObjectBox) не совсем соответствует требованиям FOSS и вызывает сбои в сборке. Следующий день был потрачен на перенос моего приложения на Room.
Это предварительный шаг, который поможет вам избежать головной боли и разочарований. Уверенность в том, что все зависимости приложения соответствуют стандартам FOSS, стоит того, чтобы потратить на это время.
Сборка вариантов (необязательно)
Этот шаг не является обязательным, однако я счел полезным создать особый вариант своего приложения для F-Droid. Будучи разработчиком-одиночкой и имея ограниченное время и возможности тестирования, Firebase Crashlytics стал для меня бесценным инструментом, помогающим распознавать и диагностировать проблемы, возникающие при работе приложения в реальных условиях. Однако использование Firebase в приложениях F-Droid (очевидно) запрещено.
Чтобы не удалять Firebase из приложения, я создал два варианта сборки. Один для F-Droid, который исключал мои зависимости от Firebase, а другой для моих общих релизов, которые включали эти зависимости. Как я настраивал эти варианты, можно посмотреть в моем репозитории в файлах project build.gradle.kts и app/build.gradle.kts. Я не хочу слишком подробно останавливаться на этом моменте (возможно, он заслуживает отдельной статьи), но мне показалось, что его стоит упомянуть.
Создание файла метаданных
Чтобы отправить свое приложение в F-Droid, необходимо выполнить запрос на слияние с их репозиторием в GitLab, содержащий метаданные для вашего приложения.
Вот порядок действий:
- Создайте учетную запись или войдите в GitLab здесь.
- Создайте форк этого репозитория.
- Создайте новую ветку в своем форке.
- Создайте и перейдите в каталог /metadata.
- Создайте здесь новый файл
<your-applicationId>.yml
(вы можете добавить этот файл через GUI GitLab или локально).
Более подробная информация приведена в документе F-Droid о внесении кода. Шаблоны содержимого этого файла можно найти здесь. Дополнительную информацию о значении и использовании каждого поля метаданных можно найти на справочной странице о метаданных здесь. Вот как выглядит мой файл метаданных:
Categories: - Connectivity - Security License: MIT AuthorName: Zane Schepke AuthorEmail: zanecschepke@gmail.com SourceCode: https://github.com/zaneschepke/wgtunnel IssueTracker: https://github.com/zaneschepke/wgtunnel/issues Changelog: https://github.com/zaneschepke/wgtunnel/releases Donate: https://ko-fi.com/zaneschepke AutoName: WG Tunnel RepoType: git Repo: https://github.com/zaneschepke/wgtunnel.git Builds: - versionName: 3.0.0 versionCode: 30000 commit: 1714618f0c237d69fd94197730c96d3cf5af377a subdir: app sudo: - apt-get update - apt-get install -y openjdk-17-jdk-headless - update-alternatives --auto java gradle: - fdroid prebuild: - sed -i -e '/com.google.gms/d' -e '/com.google.firebase/d' build.gradle.kts - sed -i -e '/libs.google.services/d' -e '/libs.firebase/d' ../build.gradle.kts AutoUpdateMode: Version UpdateCheckMode: Tags ^([3-9]+\.)?(\d+\.)?(\*|\d+)$ CurrentVersion: 3.0.0 CurrentVersionCode: 30000
Обратите внимание:
- На момент написания статьи, как мне кажется, в образ сборки F-Droid был установлен только JDK 8. Если ваше приложение использует более высокую версию Java, как у меня, вам понадобится поле «sudo», чтобы установить версию Java, соответствующую вашему проекту.
- Поле
prebuild
и полеgradle
необходимы, если вы используете подход разделения вариантов. Для F-Droid недостаточно того, что ваша сборка не будет включать не-FOSS-зависимости. Необходимо удалить все следы этих зависимостей из файлов Gradle. Это можно сделать с помощью скриптаprebuild
. Кроме того, в полеgradle
вы указываете имя вашего варианта («fdroid» в моем случае), или, если вы не используете варианта, вы просто ставитеyes
в качестве опции. - В поле
commit
указывается последний коммит и коды версий, которые должны совпадать по всему файлу. - Существует несколько способов настройки автообновления приложения (GitLab будет автоматически проверять ваш репозиторий на наличие новых версий). Я выбрал автообновление по меткам релизов GitHub. Каждый раз, когда я выкладываю новую сборку, я создаю новый релиз и помечаю его соответствующим образом. Вы можете проигнорировать регулярное выражение после слова
Tags
в моем полеUpdateCheckMode
.
Проверка CI-конвейера
Пуш файла метаданных в вашу ветку приведет к автоматическому запуску CI-конвейера. Перейдите в GitLab к своему форкнутому репозиторию и выберете кнопку «CI/CD Configuration». После этого вы переключитесь на свою ветку и увидите, что конвейер запущен для вашего последней коммита.
Перед отправкой запроса на слияние убедитесь, что все задания выполнены. Если задания не выполняются, просмотрите логи, чтобы найти проблему. Надеюсь, вам удалось избежать некоторых проблем, с которыми столкнулся я, и все задания были выполнены успешно.
Когда все задания станут зелеными, используйте кнопку «Create merge request» на вашем форк-репозитории для отправки запроса на слияние.
Завершение запроса на слияние
После того, как вы решите объединить изменения, вы попадете на страницу запроса на объединение, где выберите шаблон «app inclusion» для вашего мерджа. Заполните все соответствующие поля, отметив их знаком «X», и отправьте запрос.
Проверка CI-конвейера слияния
После отправки запроса на объединение будет запущен еще один конвейер для этого запроса. Этот конвейер несколько отличается от предыдущего. Поэтому могут возникнуть новые проблемы. Перейдите на вкладку «Merge requests» в основном репозитории F-Droid и найдите свой запрос на слияние. Устраните все проблемы, возникающие в процессе работы. Если вы застрянете, кто-нибудь из команды F-Droid свяжется с вами по запросу на слияние и поможет решить проблему (это мой опыт). В конце концов, ваш запрос должен быть принят.
Расслабьтесь и ждите
После завершения слияния остается только ждать, так что сядьте поудобнее, расслабьтесь и выпейте еще кофе. После того как я смерджил свой запрос, приложение появилось в каталоге F-Droid примерно через неделю, но все зависит от того, на каком этапе сборки находится ваше объединение. За ходом работ можно следить здесь. В частности, необходимо следить за конвейерами сборки f-droid и развертывания f-droid (последовательно). Сначала вы должны увидеть свое приложение в конвейере сборки f-droid в разделе «Успешные сборки», а затем, когда будет запущен конвейер развертывания f-droid, вы появитесь в магазине приложений. Поздравляю!