Empaquetage d'une application dans F-Droid





tl; dr : emballage et expédition d'une application sans cheval de Troie pour contrôler mes lampes dans F-Droid sans aucune connaissance en développement Android.



J'ai une position politique, je suis un partisan du logiciel libre à bien des égards, je suis d'accord avec Stallman. Comme c'est souvent le cas, cette position est complétée par une légère paranoïa. J'essaie de me débarrasser des applications propriétaires, surtout si elles fonctionnent via des serveurs tiers.



Et j'ai aussi des lampes "intelligentes" Xiaomi Yeelight, qui sont contrôlées par une application exécutant les serveurs Xiaomi. Mais il a la capacité d'activer l' API qui fonctionne à l'intérieur du LAN dans la lampe. Pour me sentir à l'aise, je suis allé chercher l'application sur Github et Gitlab et maintenant j'ai l'intention de la promouvoir auprès de F-Droid pour soutenir notre communauté paranoïaque.



Construire et vérifier



Pour que l'application entre dans le catalogue, elle doit au moins construire et, à l'amiable, fonctionner. Mon choix s'est avéré maigre , et aucune application n'a été trouvée sur Gitlab. Parmi les applications disponibles, je n'ai pu en collecter que deux, et à la fin, une seule d'entre elles a démarré. Je suis très loin de développer pour Android, en quelques jours je n'ai maîtrisé qu'un simple assemblage à l'aide de Gradle, je vais le décrire plus loin.



Nous avons besoin de: git, Java Runtime Environment, Android SDK, Android Debugging Bridge et un nouveau Gradle. JRE, ADB et git pour Debian Testing peuvent être installés à partir de paquets apt install git adb openjdk-11-jre-headless.



Le SDK Android est généralement installé avec Android Studio, mais j'ai utilisé l' utilitaire de console sdkmanager :



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


Si vous pensiez avoir manqué d'installer le SDK Android lui-même, cela ne vous a pas semblé. Je vous l'expliquerai plus tard. Les référentiels Debian contiennent une version pourrie de Gradle, la construction ne fonctionne pas avec elle, la nouvelle devra également être installée depuis le site :



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/


J'ai bifurqué le référentiel pour moi-même et nettoyé les déchets générés automatiquement. Tout se passe comme ça:



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


Par la première commande, nous acceptons en bloc toutes les conditions de licence requises sdkmanagerpour une installation non interactive. Lors de la génération automatique du wrapper ( gradle wrapper), Gradle analysera et installera toutes les dépendances nécessaires. Le téléchargement de la version requise du SDK Android, de la boîte à outils d'assemblage et d'autres dépendances spécifiques à Android se fait avec l'aide sdkmanager, vous n'avez donc pas à le faire à la main et vous devrez accepter la licence à l'avance.



image



Il est temps d'activer l'API dans l'application officielle. Transformez votre smartphone débogage de l'USB , connectez - le à votre ordinateur et installer le package de débogage généré: adb install app/build/outputs/apk/debug/app-debug.apk. N'oubliez pas d'activer le débogage depuis votre ordinateur dans la fenêtre contextuelle de votre téléphone. Si l'application sur le téléphone montre des signes de vie, vous pouvez continuer.



Préparation d'un patch dans F-Droid



F-Droid a des règles pour cataloguer une application. Les bases sont assez simples: aucune dépendance de construction non libre, aucun problème de confidentialité et aucune dépendance non libre de l'application elle-même ne doivent être signalés . Je n'ai pas vérifié les dépendances moi-même, car F-Droid a un CI et son propre système de construction, cela vous permet d'exécuter simplement le commit via le pipeline.



Passons maintenant à GitLab, où F-Droid est en cours de développement. Tout d'abord, assurez-vous de vérifier que personne ne travaille encore sur votre application. Ce type d'activité est concentré dans les demandes de conditionnement et de fusion des demandes . Forkez le référentiel de données et clonez-le à partir de votre profil.



Un fichier YML suffit pour que l'application apparaisse dans F-Droid. Trouvez n'importe quel fichier YML approprié dans un sous-répertoire metadata/de votre référentiel et copiez-le dans le même format applicationId.yml. La valeur applicationIdde votre application peut être obtenue à partir de certains de build.gradleses propres référentiels, dans mon cas à partir de app/build.gradle. Je ne me souviens plus lequel des fichiers que j’ai pris comme référence, je n’afficherai que le fichier final metadata/grmasa.com.open_light.yml: c’était difficile pour moi de choisir une AntiFonction spécifique, mais une précision détaillée n’est pas requise, a indiqué . Catégorie adaptée aux applications associées aux appareils. La clé décrit la validation / balise à partir de laquelle créer l'application. peut également être trouvé dans . Si vous ne souhaitez pas mettre à jour l'application manuellement, vous pouvez remplir



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




NonFreeDepConnectivityBuildversionCodebuild.gradleUpdateCheckModeet AutoUpdateMode( v%vdécrit le format de l'étiquette).



Pour la vérification de base des fichiers, vous avez besoin d'un utilitaire fdroiddu référentiel F-Droid Server , de ses dépendances et d'une variable 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


Vous pouvez retourner dans le répertoire fdroiddataet vérifier si les métadonnées fonctionnent:



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


Les deux premières commandes vérifient la syntaxe, la troisième construit l'application. A la sortie , vous devriez voir l'APK: unsigned/grmasa.com.open_light_1.apk.



Au cas où, vous pouvez l'exécuter fdroid checkupdates grmasa.com.open_lightpour rechercher des mises à jour et fdroid rewritemeta grmasa.com.open_lightpour remplir correctement le fichier avec des métadonnées, puis revérifier l'assemblage.



Fin presque heureuse



Vous pouvez maintenant valider et vérifier le pipeline Gitlab CI. C'est fini pour moi !



J'ai rempli une demande de fusion , je l'ai vérifiée et j'ai demandé à informer l'auteur de l'application d'origine. Si l'auteur m'ignore pendant plus de deux semaines, je réécrirai simplement les liens dans les métadonnées vers ma fourchette et ensuite cela sera accepté.



image



Maintenant, je peux mettre mon téléphone Trojan à l'écart. Et j'aurai même l'occasion de les contrôler depuis Internet de manière perverse, même en interdisant le LAN avec eux !



Malheureusement, il y a une certaine vérité dans l'illustration du titre. Un bug désagréable a été trouvé dans l'application à la deuxième étapeassistant: dans la liste des lampes détectées, le plus souvent, ce n'est pas celle que j'ai sélectionnée qui est ajoutée. Pour cette raison, les lampes sont sur la liste principale. Pour contourner ce problème, j'ai mis les lampes dans l'application une par une. J'espère qu'un jour je découvrirai quel est le problème ou créerai une autre application.










All Articles