- PVSM.RU - https://www.pvsm.ru -

Упаковка приложения в F-Droid

Упаковка приложения в F-Droid - 1

tl;dr: упаковываю и отправляю приложение без троянов для управления своими лампами в F-Droid без каких-либо знаний в разработке для Android.

У меня есть политическая позиция, я сторонник СПО во многом согласен со Столлманом. Как это часто бывает, такая позиция дополняется лёгкой паранойей. Я стараюсь избавляться от проприетарных приложений, особенно, если они работают через сторонние сервера.

А ещё у меня есть «умные» лампы Xiaomi Yeelight, которые контролируются приложением, работающим через сервера Xiaomi. Но в нём есть возможность включить в лампе API [1], работающее внутри локалки. Чтобы чувствовать себя спокойней, я пошёл искать приложение в Github и Gitlab и теперь намереваюсь продвинуть его в F-Droid, чтобы поддержать наше параноидальное сообщество.

Сборка и проверка

Для того, чтобы приложение попало в каталог, оно должно хотя бы собираться и, по-хорошему, работать. Мой выбор оказался скудным [2], а на Gitlab ничего не нашлось ни одного приложения. Из доступных приложений я смог собрать лишь два, а запустилось в итоге только одно из них. Я очень далёк от разработки под Android, за несколько дней я освоил только простую сборку с помощью Gradle, её дальше и опишу.

Нам понадобится: git, Java Runtime Environment, Android SDK, Android Debugging Bridge и свежий Gradle. JRE, ADB и git для Debian Testing можно установить из пакетов apt install git adb openjdk-11-jre-headless.

Android SDK обычно устанавливается вместе с Android Studio, но я воспользовался консольной утилитой sdkmanager [3]:

unzip commandlinetools-linux-6609375_latest.zip
export PATH=$PATH:$PWD/tools/bin/
mkdir android-sdk
export ANDROID_SDK_ROOT=$PWD/android-sdk/

Если вам показалось, что я пропустил установку собственно Android SDK, то вам не показалось. Потом объясню. В репозиториях Debian лежит протухшая версия Gradle, сборка с ней не работает, свежую тоже придётся устанавливать с сайта [4]:

wget https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
unzip gradle-6.6.1-bin.zip
export PATH=$PATH:$PWD/gradle-6.6.1/bin/

Репозиторий я форкнул к себе и почистил автосгенерированный мусор. Собирается всё так:

yes | sdkmanager --licenses --sdk_root=$ANDROID_SDK_ROOT
git clone https://github.com/asz/OpenLight.git
cd OpenLight/
gradle wrapper
./gradlew assemble

Первой командой оптом принимаем все лицензионные условия, как того требует sdkmanager для неинтерактивной установки. При автогенерации обёртки (gradle wrapper) Gradle сам распарсит и установит все необходимые зависимости. Скачивание нужной версии Android SDK, сборочного инструментария и других специфичных для Android зависимостей выполняется именно с помощью sdkmanager, поэтому руками это делать не обязательно, а лицензии придётся принять заранее.

image

Самое время включить API в официальном приложении. Включите в смартфоне отладку по USB [5], подключите его к компьютеру и устанавливайте сгенерированный отладочный пакет: adb install app/build/outputs/apk/debug/app-debug.apk. Не забудьте разрешить отладку с вашего компьютера во всплывающем окне на телефоне. Если приложение на телефоне демонстрирует признаки жизни, то можно продолжать.

Подготовка патча в F-Droid

У F-Droid есть правила [6] для включения приложения в каталог. Основные довольно простые: никаких несвободных зависимостей сборки, проблемы с приватностью и любые несвободные зависимости самого приложения должны быть помечены [7]. Я не стал проверять зависимости самостоятельно, ведь у F-Droid есть CI и собственная система сборки, это позволяет просто прогнать коммит через пайплайн.

Теперь пойдём на GitLab, где ведётся разработка F-Droid. Сначала обязательно проверьте, что вашим приложением ещё никто не занимается. Подобная активность сосредоточена в запросах на упаковку [8] и в запросах на слияние [9]. Форкайте репозиторий Data [10] и клонируйте его из своего профиля.

Для того, чтобы приложение оказалось в F-Droid, достаточно одного YML-файла. Найдите любой подходящий YML-файл в подкаталоге metadata/ вашего репозитория и скопируйте его в аналогичном формате: applicationId.yml. Значение applicationId для вашего приложения можно достать из какого-нибудь build.gradle его же репозитория, в моём случае из app/build.gradle. Не помню, какой из файлов я взял в качестве референса, покажу лишь итоговый файл metadata/grmasa.com.open_light.yml:

AntiFeatures:
- NonFreeDep
Categories:
- Connectivity
License: GPL-2.0-or-later
AuthorWebSite: https://github.com/grmasa
SourceCode: https://github.com/grmasa/Open_light
IssueTracker: https://github.com/grmasa/Open_light/issues
Changelog: https://github.com/grmasa/Open_light/tags

AutoName: Open Light
Summary: Control Xiaomi Yeelight WiFi smart bulbs
Description: |-
Control Xiaomi Yeelight smart bulbs within your Local Area Network.
Only fits WiFi controlled bulbs.

This app requires enabled LAN control for bulbs: open the official app, set up
all the bulbs, go to LAN control in the menu, and enable it for every device.

RepoType: git
Repo: https://github.com/grmasa/Open_light.git

Builds:
- versionName: 1.1.2
versionCode: 1
commit: v1.1.2
subdir: app
gradle:
- yes

AutoUpdateMode: Version v%v
UpdateCheckMode: Tags
CurrentVersion: 1.1.2
CurrentVersionCode: 1

Мне было сложно выбрать конкретную AntiFeature, но доскональная точность не требуется, указал NonFreeDep. Категория Connectivity подходит для приложений-компаньонов устройств. Ключ Build описывает, из какого коммита/тега собирать приложение. versionCode также можно найти в build.gradle. Если вы не хотите обновлять приложение вручную, то можно заполнить UpdateCheckMode и AutoUpdateMode (v%v описывает формат тега).

Для базовой проверки файла потребуется утилита fdroid из репозитория F-Droid Server [11], его зависимости и переменная ANDROID_HOME:

git clone https://gitlab.com/fdroid/fdroidserver.git
export PATH=$PATH:$PWD/fdroidserver
apt -y install python3-git python3-pyasn1 python3-pyasn1-modules python3-yaml python3-requests
export ANDROID_HOME=$ANDROID_SDK_ROOT

Можно вернуться в директорию fdroiddata и проверить, рабочие ли метаданные:

fdroid readmeta
fdroid lint grmasa.com.open_light
fdroid build -v -l grmasa.com.open_light

Первые две команды проверяют синтаксис, третья собирает приложение. На выходе у вас должен появиться APK: unsigned/grmasa.com.open_light_1.apk.

Можно на всякий случай запустить fdroid checkupdates grmasa.com.open_light для проверки обновлений и fdroid rewritemeta grmasa.com.open_light для корректного перезаполнения файла с метаданными, после чего перепроверить сборку.

Почти счастливый конец

Теперь можно коммитить и проверять пайплайн Gitlab CI. У меня всё прошло [12]!

Я заполнил Merge Request [13], его проверили и попросили уведомить автора оригинального приложения. Если автор будет игнорировать меня больше двух недель, я просто перепишу ссылки в метаданных на свой форк и тогда его примут.

image

Теперь я могу убрать подальше свой специальный телефон для троянов. И у меня даже останется возможность извращённым образом управлять ими из интернета [14] даже забанив им локалку [15]!

Как ни печально, в иллюстрации в заголовке есть доля правды. В приложении обнаружился неприятный баг на втором шаге [16] визарда: из списка обнаруженных ламп, чаще всего добавляется не та, которую я выбрал. Из-за этого лампы в основном списке. Чтобы обойти эту проблему, я заводил лампы в приложение поочерёдно. Надеюсь, когда-нибудь я разберусь, в чём проблема, или упакую другое приложение.

Автор: morq

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/356833

Ссылки в тексте:

[1] API: https://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf

[2] скудным: https://github.com/search?q=android+yeelight&type=Repositories

[3] sdkmanager: https://developer.android.com/studio#cmdline-tools

[4] сайта: https://gradle.org/install/

[5] отладку по USB: https://developer.android.com/studio/debug/dev-options#enable

[6] правила: https://f-droid.org/en/docs/Inclusion_Policy/

[7] помечены: https://f-droid.org/docs/Anti-Features/

[8] запросах на упаковку: https://gitlab.com/fdroid/rfp/-/issues?scope=all&utf8=%E2%9C%93&state=opened

[9] запросах на слияние: https://gitlab.com/fdroid/fdroiddata/-/merge_requests

[10] Data: https://gitlab.com/fdroid/fdroiddata/

[11] F-Droid Server: https://gitlab.com/fdroid/fdroidserver

[12] прошло: https://gitlab.com/1y/fdroiddata/-/pipelines/186583148/builds

[13] Merge Request: https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7368

[14] управлять ими из интернета: https://habr.com/post/515758/

[15] забанив им локалку: https://habr.com/post/515758/#comment_21975600

[16] на втором шаге: https://github.com/asz/OpenLight/blob/master/app/src/main/java/grmasa/com/open_light/device_setup/Setup_step2.java

[17] Источник: https://habr.com/ru/post/518350/?utm_source=habrahabr&utm_medium=rss&utm_campaign=518350