David Madore's WebLog: Pourquoi l'environnement Android est-il si hostile aux bidouilleurs ?

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

↓Entry #2281 [older| permalink|newer] / ↓Entrée #2281 [précédente| permalien|suivante] ↓

(dimanche)

Pourquoi l'environnement Android est-il si hostile aux bidouilleurs ?

Je me suis acheté un Nexus 5. Principalement parce que j'en avais marre de mon ancien téléphone (un Nexus 4) dont le capteur de proximité merdait, ce qui le rendait très pénible à utiliser, mais aussi à cause d'un bug qui rend Google ridicule, surtout que deux mois plus tard il n'a toujours pas été corrigé (et toutes les façons de le contourner que j'ai essayées se sont avérées merdiques) — bizarrement, il se trouve que ce bug affecte les Nexus (Nexi ?) 4 et 6 mais pas le 5, ce qui est d'autant plus mystérieux que ce n'est certainement pas un problème matériel. Mais la raison secondaire de l'avoir acheté maintenant est que le Nexus 5 ne sera pas disponible indéfiniment ; le Nexus 6 ne me convient pas du tout parce qu'outre le bug sus-mentionné il est vraiment trop grand pour mes poches (je ne comprends décidément pas du tout pourquoi les gens aiment les phablets) ; et il y a une chose que j'ai apprise en achetant des choses en ligne, c'est qu'il ne faut jamais supposer qu'un produit disponible un jour le sera encore dans un mois. D'ailleurs, j'ai vu juste puisque, même pas une semaine plus tard, le Nexus 5 n'a plus l'air vendu par Google.

Pour autant, je ne vais pas spécialement en parler, puisque je n'ai pas rencontré de problème particulier, et le but de ce blog est quand même avant tout de déverser mes râleries. À la place, je vais donc parler d'Android en général, et de pourquoi j'en suis mécontent, pas pour une raison logicielle ou matérielle particulière, mais pour, disons, l'ambiance générale. Qui, il faut le dire, pue, au moins quand on est habitué au monde Unix/Linux.

Au début, quand j'ai entendu parler d'Android, je me suis dit, chouette, enfin un système qui va apporter un peu d'ouverture dans le monde des mobiles où tout est verrouillé : enfin, on va pouvoir décider un peu ce qui se passe sur son téléphone, changer des choses, le « bidouiller » (le hacker, au sens qu'avait ce mot avant que la presse le tranforme en quelque chose de négatif), bref, en être vraiment propriétaire. Las ! Android est tombé bien loin de ces espérances.

Alors certes, le cœur du système est libre / Open Source. Du moins, il faut le dire vite, parce qu'il y a plein de restrictions à ça. Primo, ce qui est libre, c'est uniquement le système avec un ensemble minimal d'applications : en fait, la grande majorité des systèmes Android autres que les versions chinoises à deux balles tournent avec, en plus, les Google Apps, qui, elles, ne sont pas libres du tout (et le bug dont je me plaignais est dans les Google Apps, ce qui fait que je ne peux pas, même ne principe, le corriger). Il y a des choses dans les Google Apps dont je comprends plus ou moins qu'elles ne soient pas libres (Google Maps, par exemple), il y en a aussi qui font plus ou moins doublons avec des applications libres d'Android (voir cet article d'Ars Technica pour un exposé de la situation), mais le truc est surtout en train de se transformer en une énorme moussaka qui contrôle totalement le téléphone au-dessus d'Android (les Google Play Services), et le problème est que non seulement c'est propriétaire, mais en plus il faut soit tout accepter en bloc, soit tout rejeter — d'où la gravité du bug que j'ai rencontré, et qui ne pouvait se résoudre qu'en coupant, de fait, tous les services Google.

Secundo, la version libre officielle d'Android (AOSP, pour Android Open Source Project), elle ne tourne que sur un tout petit ensemble de téléphones, peut-être même aucun. Sans même parler des pilotes propriétaires (comme le firmware radio, et de façon plus gênante, les pilotes graphiques), la plupart des téléphones d'Android sur le marché, en gros tout ce qui n'est pas un Nexus de Google (e.g., le Samsung Galaxy Nimportelequel), vient avec une version d'Android lourdement modifiée par le vendeur, et vous pouvez toujours rêver pour avoir les sources de ce truc-là. Bon, il existe bien une version dérivée d'Android, libre (aux pilotes et à quelques bricoles près), qui tourne sur pas mal de téléphones, et c'est celle que j'utilise, CyanogenMod, et différentes versions sous-dérivées de celle-ci, mais ce n'est déjà pas pareil que de dire qu'on a des systèmes libres sur la plupart des téléphones du marché : ce n'est tout simplement pas le cas. D'ailleurs, CyanogenMod est devenu un projet commercial, et je suis persuadé qu'il ne va pas rester libre très longtemps. On voit plein de petits signes montrant qu'il est de plus en plus fermé. (J'ai aussi plein de reproches pratiques à leur faire, comme le fait que leur système de nommage des versions est incompréhensible et qu'ils n'arrivent jamais à produire une version stable de quoi que ce soit, mais c'est un autre sujet.)

Tertio, quand bien même vous trouvez une version libre d'Android qui tourne sur votre téléphone, si vous espérez que parce que c'est libre vous allez facilement pouvoir faire des changements dessus, détrompez-vous. Recompiler un Android est très, très, très (très) difficile. Essentiellement, il faut une machine dédiée à ça (éventuellement une machine virtuelle, certes), avec exactement la bonne version d'Ubuntu, exactement la bonne version de Java, exactement la bonne version des différents outils. Plein de gigas d'espace disque (vraiment plein). Plein de mémoire. Plein de temps. Et plein de bande passante réseau. Le problème principal, c'est qu'Android n'est pas du tout conçu pour qu'on puisse bidouiller avec (je cherche un équivalent français du mot tinkering) : on compile tout en bloc. Recompiler une unique application système après l'avoir un petit peu modifiée n'est pas du tout prévu ou supporté. (Par exemple, j'avais fini par trouver comment recompiler l'application clavier standard pour la modifier et y mettre notamment mon propre dictionnaire et quelques caractères Unicode supplémentaires : j'en ai énormément bavé pour y arriver. Et je n'ai jamais trouvé le courage d'en faire autant pour l'application téléphonie pour contourner le problème du capteur de proximité cassé sur mon Nexus 4.)

Mais il y a un problème plus fondamental : l'écosystème Android est extrêmement hostile au logiciel libre. Voyez le Google Play Store : il n'y a aucune indication de quelles applications dessus sont libres / Open Source. Pire, il n'y a aucun moyen standardisé pour un développeur Android de mettre une information indiquant qu'une application est libre (il peut juste l'étiqueter gratuite, ce qui n'est pas du tout pareil), ou pour indiquer où sont les sources, ou quelle est la licence. Google n'offre même pas un réglage caché pour développeurs ou enthousiastes du libre pour dire je voudrais voir en priorité, ou exclusivement, des applications libres. Il y a bien un marché alternatif, F-Droid, pour ça, mais comme il est alternatif, il n'a aucune publicité de la part de Google, du coup il est très confidentiel, et il n'y a quasiment rien d'intéressant dessus. Et de fait, il y a très peu d'applications libres pour Android. Et les rares qui le sont ont même tendance à cesser de l'être au bout d'un certain temps, quand le développeur se rend compte que, tient, il pourrait peut-être monétariser le succès de son application (ou pour je ne sais quelle autre raison) : j'en ai vu plein, comme ça, qui étaient annoncées libres au début, et qui au bout de quelques versions ne l'étaient plus (exemple au pif : l'application d'écran de démarrage ADW Launcher, qui eut été libre et qui ne l'est plus du tout).

Cette atmosphère est très surprenante quand on vient du monde des Unix libres, où on peut à peu près tout faire avec des programmes libres (preuve qu'il y a bien des gens prêts à en écrire !). Sous Android, quasiment toutes les applications vous laissent le choix entre une version gratuite, lourdement limitée et/ou très généreusement décorée de bandeaux publicitaires, et une version payante. La mentalité de petits connards des programmeurs qui croient opportun de demander paiement pour une petite merde qu'ils ont écrite alors qu'à côté, dans le monde du logiciel libre pour PC de bureau, il y a des gens qui écrivent des compilateurs C, des suites bureautiques, des navigateurs Web, etc., et qui ne mettent pas de pub dedans ni ne gardent leur code secret, me laisse sans voix. (J'imagine un monde où gcc proposerait le choix entre une version payante et une version gratuite, cette dernière refusant de compiler un programme de plus de 2000 lignes et affichant au milieu des messages de compilation des messages publicitaires vous informant qu'il y a sans doute des célibataires dans votre région.) Et avant que quelqu'un me sorte l'argument débile si tu n'es pas content de ces programmes, tu n'as qu'à ne pas les utiliser : ce n'est pas si simple, parce qu'en étant le petit connard qui développe une petite merde pour Android dont on ne donne pas les sources, on met un frein psychologique au développement d'un logiciel libre remplissant la même fonction.

(Et je pense que c'est vraiment un problème psychologique lié à la « décision par défaut ». Si Google poussait pour que la décision par défaut quand on écrit une application Android, soit qu'elle soit libre, je suis persuadé que l'immense majorité des développeurs ne se comporteraient pas comme ça comme des connards. I.e., la différence entre Android et les Unix libres n'est pas tellement, à mon avis, dans l'origine des développeurs, que dans le fait que dans un cas publier le code source est considéré comme normal et dans l'autre cas ça ne l'est pas. Pour une explication du genre de phénomènes qui me fait penser ça, voyez cet exposé à TED de Dan Ariely, et ce qu'il dit sur le don d'organes dans différents pays.)

Et le problème est d'autant plus aigu que la réponse à n'importe quel problème sous Android est toujours There's An App For That : là où la bonne réponse à un problème dans Android, si le système était véritablement ouvert, devrait être quelque chose commme commentez la ligne 66 du fichier server/InterfaceController.cpp dans le dépôt platform/system/netd et recompilez votre système, la réponse est en fait installez MyNetworkControlApp sur le Google Play Store et cliquez sur disable IPv6 privacy. Ce qui est peut-être plus pratique pour le neuneu moyen, mais pour ma part je n'ai aucune envie d'installer la petite merde MyNetworkControlApp pour réparer les problèmes de mon téléphone, et surtout pas de lui donner des droits exorbitants sans avoir vu le code, ou au moins, sans avoir eu la possibilité en principe de voir ce code.

Même si on met de côté le problème du code libre ou non, le système Android n'est généralement pas favorable à la « bidouille » telle qu'un unixien va avoir tendance à la comprendre et à la pratiquer. Ceci se reflète par exemple dans le fait que peu de choses peuvent se faire en ligne de commande (on peut réussir à se connecter à un shell sur un téléphone Android, mais le plus souvent on ne peut pas y faire grand-chose). Entre autres parce que les interfaces internes d'Android (tout ce qui n'est pas utilisé par un programme final en Java) est mal documenté ou pas documenté du tout : même les outils internes du système (les choses comme pm, dumpsys, etc.) sont difficiles à utiliser entre autres faute de documentation. J'ai commencé il y a un certain temps à écrire une page où je rassemble les différentes choses que je réussis à glaner par ci par là, mais ça reste extrêmement fragmentaire. Un exemple emblématique pourrait être le format APK qui sert à distribuer les applications Android : il est extrêmement difficile d'extraire un APK, de le modifier, et de le remettre en place (par exemple pour lui retirer de force une permission qu'il aurait demandée), et le fait que les APK soient signés n'est que le début des difficultés !

Un exemple concret. Pour ne pas perdre mes données en passant de mon Nexus 4 à mon nouveau Nexus 5, je me suis dit que j'allais recopier la partition de données utilisateur (/data) de l'un vers l'autre (après avoir installé exactement la même version de CyanogenMod sur les deux, bien sûr, pour minimiser les emmerdes, et quitte à effacer quelques données particulières au téléphone, comme la clé android_id de la table secure dans la base de données /data/data/com.android.providers.settings/databases/settings.db). Au final, ça a marché. Mais non sans mal. Par exemple, parce que le format .img des images acceptées par la commande fastboot du bootloader Android de Google, elle est certes documentée, mais dans un header obscur qu'il faut aller chercher soi-même au milieu du fatras des sources d'Android. Et il n'y a bien sûr aucun outil standard pour convertir agréablement vers ce format. Après ça, je n'avais encore, bien sûr, aucune idée de ce qu'il faut et ne faut pas recopier dans /data d'un téléphone vers l'autre (ce qui fait partie, disons, de ma personnalisation du téléphone et ce qui fait partie de la configuration du matériel précis). La réponse de Google à ce problème est quelque chose comme : confiez-nous vos données (par exemple, tous vos contacts), nous vous permettrons de les sychroniser sur tous vos téléphones — seulement, moi, je n'ai pas envie de confier ces données à Google (par exemple parce que je ne suis pas certain que tous mes amis seraient d'accord pour que leur adresse soit communiquée par moi à Google). Mais je digresse.

Il existe bien des bidouilleurs Android. Un de leurs points de rassemblement est le forum en ligne XDA-Developers (par exemple, ce document est encore ce que j'ai trouvé de mieux comme documentation sur comment compiler Android). Mais, outre que ce forum est merdique pour des simples raisons de forme (outre l'abus de Comic Sans, il est surtout impossible d'y retrouver quoi que ce soit), cette sous-communauté souffre de beaucoup des mêmes défauts que la communauté Android en général : si vous exposez un problème, on va vous dire d'installer telle ou telle application dont on ne vous montrera pas les sources ; et des versions complètes d'Android s'y échangent par des liens douteux vers des sites d'hébergement de binaires louches, sans qu'on sache si les sources sont disponibles quelque part. Et je pense que c'est un problème assez profond, ou au moins le symptôme d'un problème assez profond, que les développeurs Android chez Google ne parlent essentiellement pas à cette communauté-là.

Tout ceci me décourage beaucoup. J'aimerais passer mes téléphones à autre chose qu'Android, mais il n'y a rien d'autre. Ce n'est même pas la peine de parler de Windows mobile ou d'iOS, ce dernier est auss ouvert que la Corée du Nord, alors évidemment, Android, en comparaison, paraît vraiment paradisiaque. J'aimerais énormément que Firefox OS ait du succès, parce que Mozilla m'a l'air d'être un agent très bénéfique en direction de l'ouverture du Web et il pourrait jouer un rôle semblable sur le marché des mobiles (et par ailleurs j'aime bien l'idée d'unifier les applications mobile et les pages Web, surtout quand la plupart des applications mobiles sont, de fait des versions merdiques de sites Web), mais il faut dire que trouver un mobile sous Firefox OS, ce n'est pas évident (je me suis acheté un Geeksphone Revolution, mais c'est une merde pour plein de raisons que je n'ai pas le temps d'expliquer ici, et en tout cas il n'est pas du tout ouvert) ; les téléphones développeur Firefox OS ont l'air tous épuisés. Quant à Tizen, il n'a pas l'air promis à un grand succès, et pour commencer le SDK est propriétaire (et Mer et Sailfish ont l'air encore plus confidentiels). Peut-être qu'Ubuntu Touch apportera une embellie, mais je n'y crois pas des masses non plus. En attendant, je suis à peu près coincé sous Android.

↑Entry #2281 [older| permalink|newer] / ↑Entrée #2281 [précédente| permalien|suivante] ↑

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]