• # Lineage OS sur Zuk Z1 - Et backup d'apk

    Posté par (Mastodon) . En réponse au journal LineageOS. Évalué à 9.

    Sommaire

    Suite à cette dépêche, je me suis décidé à passer mon Zuk Z1 sur Lineage OS.
    Pour info c'est un téléphone livré de base avec Cyanogen OS, qui n'a reçu qu'une unique mise à jour, il y a bien longtemps.
    La marque Zuk n'existe plus je crois, c'était Lenovo derrière, mais ils font maintenant directement des téléphone Lenovo

    L'installation

    Premier point : il n'était pas rooté, n'avait pas de recovery spécial, il y avait donc tout à faire, et donc... tout à perdre :)
    Impossible de passer outre le "fastboot oem unlock" qui nettoie absolument tout et réinitialise l'OS d'origine, pour pouvoir installer TWRP, puis Lineage OS.

    Grosso modo, la doc officielle sur Lineage OS est au poil :
    https://wiki.lineageos.org/devices/ham/install
    * À noter que fastboot (à la différence d'adb) ne reconnaît pas le téléphone s'il est branché sur le port USB-C de mon ordinateur (le Zuk Z1 utilise l'USB-C et pas le micro-USB), mais sur un port USB standard ça fonctionne bien.

    • Il faut exécuter deux fois "fastboot oem unlock", la première fois ça plante, il n'arrive pas à détruire toutes nos chères données personnelles. La seconde fois ça fonctionne, allez comprendre, mais je ne suis pas le seul à avoir remarqué ça, d'aucuns prétendent qu'il faut rebooter le téléphone, mais je suis flemmard, j'ai retenté directement, le reboot c'est pour les amateurs de Windows de toute façon.

    Une fois délocké, aucun soucis pour installer TWRP, puis Lineage OS (14.1 pour le moment), le module pour rooter le téléphone, et c'est parti !

    • Problème, car il en faut, le gyroscope ne fonctionne pas, et donc la rotation automatique de l'écran ne fonctionne pas. Apparemment le lecteur d'empreinte non plus, mais je m'en moque. Rien d'indiqué sur la doc, mais en cherchant sur le grand Nain Ternète, on se rend compte qu'il faut installer un firmware spécial. Un petit saut dans le vide en téléchargeant un fichier qui n'a pas l'air diablement officiel de quoi que ce soit : mm-firmware.zip ou ham-mm-firmware.zip, on en trouve plusieurs sur le site androidfilehost.com, aucune idée des différences, les fichiers sont juste là, mais le site n'est pas un site de téléchargement à la con, j'y vais. Flasher le truc via recovery TWRP, ça fonctionne.

    Bref, pas quelque chose de trivial, mais rien d'extrêmement complexe non plus, sauf pour le firmware, problème pour lequel on trouve des solutions extraordinairement complexes à base de multiples réinstallations d'OS divers pour arriver à un Lineage OS qui marche. Il convient de passer à côté sans s'en préoccuper :) (Ma solution simple et directe en une étape - étape 1 : on flashe - fonctionne).

    La sauvegarde

    Maintenant un point plus intéressant : on a tout vidé, tout perdu, sprotch.
    C'est gentil mais bon, c'est pas forcément ce qu'on veut non plus, on aimerait garder quelques données malgré tout quand même ? Certes, la configuration de K9-mail se refait en quelques minutes, mais bon ses sauvegardes de jeux d'Humble Android Bundle, on ne veut pas forcément les perdre, ni ses traces GPX de ForRunners.
    Et puis on va se passer complètement des Google Apps (grâce à fdroid surtout et yalp store pour le reste), et on a au fil des années acheté trois ou quatre jeux sur le store Google.

    Évidemment il faut travailler là-dessus avant de tout raser et d'installer LineageOS.
    La meilleure solution semble être une appli appelée Titanium backup.
    Mais la machine n'est pas rootée, et pour la rooter faut faire des trucs compliqués qui passent par... un oem unlock et une réinitialisation complète du téléphone, ou mieux, installer Lineage OS rooté (... ;) ...).
    Raté !

    Il reste adb.
    adb backup, adb restore, ça a l'air trop génial, selon la doc ça fait pile ce qu'on veut !
    Mwahaha, trop facile !
    Bon, ça plante quand on tente un backup direct de toutes les applis.
    Tant pis, on choppe la liste :
    adb shell 'pm list packages -f'
    Remise au propre on a le nom de toutes les applis, on fait le ménage des trucs dont on se moque, et hop, une super liste.
    Une petite boucle shell pour sauvegarder chaque appli dans son propre fichier :

    for apk in $(cat mes_apk); do
     adb backup -apk -obb -f $apk.ab $apk
    done
    

    Faut cliquer plein de fois sur le téléphone pour valider chaque appli, mais bon comme ça au moins on a sauvegardé un maximum d'applis, et celles qui ne veulent pas sont identifiées et en nombre restreint. C'est chiant mais c'est pour la bonne cause : la notre.

    Une petite vérification malgré tout ?
    Allez, c'est quoi donc un fichier .ab, backup android ?
    C'est un tar.gz dont on a remplacé quelques octets des entêtes, et sucré le checksum final.
    On décompresse comme ça :
    ( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 fichier.ab) | tar xfz -
    On a un message d'erreur de fin prématurée du fichier (il manque les checksums finaux), mais ça fonctionne.
    Au passage, si le fichier est tronqué en plein milieu plutôt que juste du checksum final, je ne sais pas bien comment le repérer.
    Il y a d'autres solutions, plus propres, car en fait il s'agit d'un backup java, donc un programme java qui décompresse va le faire sans erreur et tout. Mais bon, entre ma ligne de shell et un obscur programme java pompée je ne sais pas où, j'ai opté pour la simplicité.

    Et puis ça marche !
    On a l'apk dedans (dans apps//a/base.apk)
    Et d'autres données.
    En particulier sauvegarder OSMAnd~ sauvegarde aussi toutes les cartes téléchargées, ça peut faire une archive assez grosse !

    adb backup -shared -f shared.ab permet de sauvegarder tous les fichiers dans /sdcard/ du téléphone, donc tous les trucs persos, y compris les photos, téléchargements etc.
    Ça fonctionne, on décompresse et on accède à tout, nickel, c'est la fête !

    • Certaines applications sortent une archive vide, de 41 octets. Ah oui, il y a une autorisation pour les applis permettant de refuser le backup. Aucun message d'erreur de la part d'adb, ni du téléphone, simplement une archive vide. Rien à faire sans être root dans ce cas-là, mais comme ces applis sont en nombre limité, il est plus facile d'enregistrer ses données par ailleurs, et de se préparer à faire une réinstallation à partir de zéro. C'est par exemple le cas de K9-Mail, ou de Firefox et Fennec. Ça se comprend dans le sens qu'il y a des identifiants assez sensibles dedans, et qu'adb est un trou de sécurité assez important si on a accès physiquement 5 minutes au téléphone d'autrui. Il serait trivial d'écrire un script qui liste les applis installées, repère les applis de mail, et les backup chacune dans une archive. En moins de 5 minutes on aurait tout sauvegardé et paf accès aux mails de la personne. Ben ça marche pas, parce que K9-Mail par exemple refuse le backup.

    La restauration

    Bon, alors on est content ?
    ouais, ouais, pas vraiment, parce qu'une fois le téléphone remis à zéro et Lineage OS installé, on réalise que adb restore fichier.ab, bien qu'apparaissant fonctionner sans la moindre erreur, ne fonctionne pas. Aucune appli d'installée, quedalle...
    Stress, tension, agacement, Qwant, DuckDuckGo, Tonton Roger et même Google sont mis à contribution pour trouver une solution.

    En fait, là encore ce n'est pas tout à fait, en regardant sur le système on voit que les fichiers contenus dans l'archive sont bien dans le téléphone ! Y compris le base.apk au bon endroit. Mais l'appli elle-même n'est pas installée.
    La solution est assez simple : extraire le base.apk de l'archive, faire un adb install base.apk puis faire le adb restore.
    On installe l'application, puis on restaure les données.

    Et ça marche !
    Ouf...

    Pour info, voici un script shell permettant d'automatiser la restauration d'une application sauvegardée.
    On considère que Orgzly (par exemple), de son petit nom com.orgzly, est sauvegardée dans le fichier com.orgzly.ab
    Il suffit ensuite de faire adbrestore /path/to/com.orgzly.ab ou même adbrestore com.orgzly dans le bon répertoire.
    Le code :

    #!/bin/sh
    DIR=$(dirname 1ドル)
    cd $DIR
    APP=$(basename 1ドル .ab)
    AB=${APP}.ab
    [ ! -f "$AB" ] && echo "$DIR/$AB does not exist." && exit
    (mkdir /tmp/$APP
     cd /tmp/$APP
     ( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 $DIR/$AB) | tar xfz - 2> /dev/null
    )
    APK=/tmp/$APP/apps/$APP/a/base.apk
    [ ! -f "$APK" ] && echo "$APK not found !" && exit
    adb install $APK
    adb restore $AB
    rm -r /tmp/$APP
    

    Voilà, c'est amusant tout ça non ?
    On se marre avec Android, surtout le côté user-friendly de la remise à zéro complète pour installer un nouvel OS ^

    Cela dit, et plus sérieusement, Lineage OS fonctionne très bien, j'ai un peu l'impression d'avoir acheté un nouveau téléphone tout neuf sans dépenser un centime !
    Et j'aurai des mises à jour en plus :)
    Et maintenant que je suis rooté, hop, j'installe un Linux dessus, et je fais le con en ssh.

    Note sur les Google Apps

    La méthode de sauvegarde/restauration des applications fonctionne aussi avec les applications achetées, et elles fonctionnent sans problème après restauration, malgré l'absence des Google Apps, et donc a priori de tout moyen de vérifier qu'elles ont été achetées.
    Je peux donc rejouer à Majesty sur mon écran microbien.

    Par ailleurs, je n'ai encore croisé aucune application se plaignant réellement de l'absence des Google Apps.
    Certes, je n'ai jamais utilisé énormément d'applis proprio de la mort, banque, assurance, Trello pour le boulot, WhatsApp pour la famille, SNCF pour les trains.
    Trello par exemple crie qu'il ne va pas fonctionner parce que notre téléphone n'est pas compatible avec les Google Apps, que c'est trop affreux, c'est la fin des haricots, mais une fois qu'on a cliqué sur "Ouais, OK, tais-toi", ça a l'air de fonctionner parfaitement normalement. Pas impossible qu'il manque genre les notifications en temps réel, un truc du genre, à voir à l'usage, mais l'accès aux tableaux fonctionne normalement. Même mieux que sous l'ancien Cyanogen OS où l'appli buggait un peu.

    Le Yalp Store fonctionne au poil, permet les mises à jour en tâche de fond si on veut avec l'accès root, ou à la mode fdroid, il liste les mises à jour et on les fait à la main.
    On pourrait même l'utiliser avec ses propres identifiants Google pour installer les applications achetées, donc même de ce côté là, rien de perdu, et même rien d'inaccessible par rapport à un téléphone bloaté et google-apps-ifié !

    Voilà, voilà, pour ceux qui hésitent et se posent des questions, j'espère que vous trouverez des réponses là-dedans.
    N'hésitez pas à poser d'autres questions !

    Yth.