Logiciel système

Dans cette page, vous trouverez des informations sur la façon de développer un logiciel système, y compris comment le construire, le recompiler et le mettre à la disposition d’autres utilisateurs. La plupart des logiciels préinstallés dans votre appareil sont livrés sous la forme d’un paquet Debian. Ce format est utilisé par plusieurs distributions Linux (telles que Debian, Ubuntu, Mint) et énormément de documentation est disponible sur la façon de travailler avec, nous n’en parlerons donc pas ici. En outre, dans la plupart des cas, vous aurez besoin de modifier des logiciels existants, plutôt que de développer de nouveaux paquets à partir de zéro. Pour cette raison, ce guide traite principalement de la recompilation d’un paquet existant.

Il y a essentiellement trois façons de développer un logiciel système : la construction directement sur l’appareil, la compilation croisée ou le téléversement du code source vers un PPA Launchpad puis la construction par Launchpad. Nous allons examiner les trois méthodes et utiliser `address-book-app <https://github.com/ubports/address-book-app___ (l’application Contacts) comme exemple.

Construire sur l’appareil lui-même

C’est la méthode la plus rapide et la plus simple pour développer de petits changements et les tester en temps quasi réel. Selon les ressources de votre appareil, il se peut cependant que vous ne puissiez pas suivre ce chemin: si vous n’avez pas assez d’espace libre dans votre système de fichiers racine, vous ne pourrez pas installer toutes les dépendances de compilation de paquets; ou la RAM de votre périphérique pourrait ne pas être suffisante pour le compilateur. En supposant que vous avez la chance de ne pas rencontrer ces restrictions, et que cela ne vous dérange pas de reflasher votre appareil après (pour l’effacer de tous les paquets de développement que vous avez installés), lisez ce qui suit.

Vous pouvez accéder en ssh à l’appareil (via phablet-shell, par exemple) et ensuite installer tous les paquets nécessaires pour reconstruire le composant que vous voulez modifier (l’application Contacts, dans cet exemple) :

sudo apt-get build-dep address-book-app
sudo apt-get install fakeroot

Ceci installera un tas de paquets dans la racine de votre appareil. De plus, vous voudrez probablement installer git afin d’obtenir le code source de votre application dans l’appareil et ensuite pousser en retour vos changements dans le référentiel :

sudo apt-get install git
git clone git@github.com:ubports/address-book-app.git   # or your own clone
cd address-book-app

Maintenant, vous être prêt à construire le paquet :

DEB_BUILD_OPTIONS="parallel=2 debug" dpkg-buildpackage -rfakeroot -b

et enfin, installez-le. La commande dpkg-buildpackage imprimera la liste des paquets générés et ce sont ces noms de fichiers que vous devrez passer à la prochaine commande :

sudo dpkg -i ../<package>.deb [../<package2>.deb ...]

Notez, cependant, que vous n’aurez peut-être pas besoin d’installer tous les paquets : en général, vous pouvez ignorer tous les paquets dont le nom se termine par doc ou dev, puisqu’ils ne contiennent pas de code utilisé par l’appareil.

Construction croisée avec crossbuilder

C’est le moyen recommandé pour développer des changements importants et il convient à tous les périphériques car la compilation se fait sur votre PC de bureau (nous l’appelleront désormais « hôte ») et non sur l’appareil cible. C’est aussi extrêmement rapide et facile à utiliser.

Commencer par installer crossbuilder sur votre hôte :

git clone git@github.com:ubports/crossbuilder.git

C’est un script shell, donc vous n’avez pas besoin de le construire. Au lieu de cela, vous devrez ajouter son répertoire à votre variable d’environnement PATH, de sorte que vous puissiez l’exécuter à partir de n’importe quel répertoire :

echo "export PATH=$HOME/crossbuilder:$PATH" >> ~/.bashrc
# and add it to your own session:
export PATH="$HOME/crossbuilder:$PATH"

Ensuite, vous devez configurer LXD; heureusement, crossbuilder a une commande qui fait tout pour vous; il vous suffit de suivre attentivement ses instructions :

crossbuilder setup-lxd

Si c’est la première fois que vous utilisez LXD, vous devrez peut-être redémarrer votre hôte une fois que tout est terminé. Une fois LXD configuré, l’utilisation de crossbuilder est aussi simple que possible : il vous suffit de vous déplacer dans le répertoire où se trouve le code source de votre projet (par exemple ~/src/git/addresses-bookk-app) et de le lancer comme ceci :

cd ~/src/git/address-book-app
crossbuilder --ubuntu=15.04

Note: si votre périphérique est connecté au PC, vous n’avez pas besoin de spécifier le paramètre ``–ubuntu=15.04`` parce que crossbuilder trouvera la bonne version d’Ubuntu de lui-même. Si vous ne spécifiez aucun paramètre et que vous n’avez pas d’appareil connecté à votre PC, crossbuilder utilisera ``16.04`` (Xenial).

Crossbuilder fera tout pour vous : il créera le conteneur LXD, téléchargera l’image de développement, installera toutes les dépendances de construction de vos paquets, effectuera la construction et enfin, si votre appareil est connecté à votre hôte, il copiera les paquets sur la cible et les installera. Les deux premières étapes (créer l’image LXD et obtenir les dépendances) peuvent prendre quelques minutes mais ne seront exécutées que la première fois que vous lancerez crossbuilder pour un nouveau paquet.

Maintenant, chaque fois que vous changez le code source dans votre dépôt git, les mêmes changements seront disponibles dans le conteneur, et la prochaine fois que vous tapez la commande crossbuilder, seuls les fichiers modifiés seront reconstruits. Cela rend le développement itératif rapide.

Les tests unitaires

Par défaut crossbuilder n’exécute pas de tests unitaires; c’est à la fois pour des raisons de vitesse et parce que le conteneur créé par crossbuilder n’est pas destiné à exécuter des exécutables natifs (cible) : les outils de développement (qmake/cmake, make, gcc, etc.) sont tous exécutés dans l’architecture hôte, sans émulation (encore une fois, pour des raisons de rapidité). Cependant, l’émulation de qemu est disponible à l’intérieur du conteneur, il devrait donc être possible d’effectuer des tests unitaires à l’intérieur du conteneur. Vous pouvez le faire en mettant un shell à l’intérieur du conteneur

crossbuilder --ubuntu=15.04 shell

puis trouvez les tests unitaires et exécutez-les. Sachez que l’émulation n’est pas parfaite, donc il y a de très bonnes chances que les tests échouent, même s’ils auraient réussi autrement, dans un environnement approprié. Pour cette raison, il est probablement plus sage de ne pas s’inquiéter des tests unitaires lorsque vous travaillez avec crossbuilder et de ne les exécuter que lorsqu’il n” y a pas de compilation croisée.

Développer dans l’architecture hôte, déployer via PPA

Une autre façon de développer un logiciel système est de le développer localement sur votre machine de bureau, puis de pousser le code source vers un PPA de Launchpad et de le faire construire là pour l’architecture armhf. Selon que la fonctionnalité que vous développez peut être raisonnablement testée dans votre machine locale et si vous pouvez attendre que les développeurs de Launchpad commencent à travailler sur votre paquet (cela peut prendre quelques heures), ceci pourrait ou non être un moyen approprié de développement.

Note: depuis la fin de 2017, Launchpad n’est plus compatible pour les PPA basés sur vivid. Donc, si vous ciblez les appareils Ubports 15.04 actuels, cette méthode ne vous convient pas.

Commencez par obtenir VirtualBox et une image d’Ubuntu correspondant à l’image de base de votre appareil. Vous pouvez obtenir l’image d’Ubuntu ici :

Démarrez votre machine VirtualBox avec l’image d’Ubuntu que vous avez téléchargée et une fois l’installation terminée et que vous arrivez à un terminal, ajoutez le Stable Phone Overlay PPA comme ceci :

sudo add-apt-repository ppa:ci-train-ppa-service/stable-phone-overlay
sudo apt-get update
sudo apt-get dist-upgrade

Vous pouvez ensuite installer les outils de développement dont vous avez besoin, ainsi que les dépendances de compilation du composant sur lequel vous souhaitez travailler :

sudo apt-get install vim git devscripts
sudo apt-get build-dep address-book-app

et ensuite construire le paquet localement :

DEB_BUILD_OPTIONS="parallel=4 debug" dpkg-buildpackage -rfakeroot -b

Modifiez l’option parallel en fonction du nombre de cœurs de processeurs que vous avez mis à disposition de VirtualBox afin d’optimiser la vitesse de compilation. La commande ci-dessus va construire votre paquet et exécuter tous les tests unitaires qui lui sont associés, donc c’est un moyen facile (bien que insuffisant! ) de vérifier que vos modifications ne casseront pas les fonctionnalités existantes. Vous pouvez maintenant développer vos modifications et les tester localement (bien que, si votre composant a besoin d’accéder à la partie matérielle du téléphone, cela ne fonctionnera évidemment pas) , jusqu” à ce que vous soyez satisfait du résultat.

Une fois que vous arrivez à un état où vous pensez que vos changements devraient fonctionner, vous pouvez les pousser dans un PPA, de sorte qu’ils seront construits pour votre appareil Ubports et vous (et d’autres utilisateurs) serez en mesure de les tester. D’abord, créez un PPA en visitant https://launchpad.net/~/+activate-ppa; entrez un nom et une description, puis cliquez sur le bouton Créer et sur la page suivante, choisissez le lien « Modifier les détails » près du coin supérieur droit. Vous pouvez ensuite activer l’architecture de votre téléphone (avec une forte probabilité, c’est « ARM ARMv7 Hard Float »), désactiver toutes les architectures qui ne vous intéressent pas et cliquer sur « Enregistrer ». Supposons que votre nom d’utilisateur Launchpad soit « ubdeveloper » et que le PPA s’appelle « myppa », alors les commandes pour pousser vos changements au PPA seront comme suit :

debuild -S
dput ppa:ubdeveloper/myppa ../address-book-app_*_source.changes

où le nom exact du fichier . changes sera imprimé par la commande debuild vers la fin de sa sortie. Notez que pour que le téléchargement réussisse, vous aurez besoin d’avoir une configuration de clé GPG valide et elle doit être ajoutée à Launchpad. Si vous êtes novice dans ce domaine, il est recommandé de lire attentivement la documentation dans Launchpad.

Une fois que le paquet a été téléchargé, vous devriez recevoir un e-mail par launchpad vous indiquant si le téléchargement a été accepté; si c’est le cas, cela signifie que Launchpad essaiera de compiler le paquet source pour toutes les architectures supportées par votre PPA et, si c’est une réussite, publiera finalement le (s) paquet (s) résultant (s) dans celui-ci. Maintenant tout ce qui reste à faire est d’installer les paquets dans votre téléphone : pour cela, vous pouvez utiliser phablet-shell pour accéder à votre téléphone et de là taper les commandes suivantes :

sudo add-apt-repository ppa:ubdeveloper/myppa
sudo apt-get update
sudo apt-get install <your new package(s)>

Vous pouvez également donner les mêmes instructions d’installation aux autres membres de la communauté, si vous voulez qu’ils testent vos modifications avant de les soumettre en amont pour révision.