Lorsqu’un appareil Android est rooté, il n’est pas rare que certains fichiers système aient été modifiés, empêchant alors l’utilisation des mises à jour OTA, qui vérifient les signatures de certains fichiers avant de les patcher… C’est ce qui m’est arrivé tout à l’heure en voulant mettre à jour mon Nexus 5 vers Android 5.0 Lollipop.
En poussant l’update vers le téléphone via la fonction ADB Sideload Update de Nexus Root Toolkit, j’obtenais ce message et la mise à jour échouait :
/system/bin/debuggerd has unexpected contents
J’avais déjà eu des problèmes de ce type lors de mises à jour précédentes, et la désinstallation de Xposed avait à l’époque résolu le problème, mais là, rien n’y faisait. J’étais presque résolu à passer par l’image de restauration complète (donc avec effacement de tout le contenu du téléphone 🙁 ) quand je suis tombé sur un article de blog expliquant comment restaurer un fichier système modifié avec un shell ADB.
Mais pour pouvoir le restaurer, encore faut-il avoir le fichier original… En cherchant un peu dans les forums d’XDA, j’ai trouvé différentes versions du fichier /system/bin/debuggerd, y compris sous forme de zip auto-installable (donc sans avoir à taper des commandes dans un shell adb), mais bien sûr, pas la bonne…
Il est heureusement très simple d’extraire soi même le bon fichier à partir d’une image de restauration du téléphone :
- Téléchargez l’image de restauration correspondant à votre ROM actuelle (pour les Nexus, ça se passe par ici),
- Extrayez de l’archive le fichier .img dans lequel se trouve le fichier à récupérer (par exemple, system.img pour les fichiers situés sous /system),
- Ouvrez le fichier .img, par exemple avec EXT4 Unpacker sous Windows et extrayez le fichier que vous désirez.
Déposez ensuite le fichier sur votre appareil, par exemple à la racine de /sdcard et connectez votre appareil en mode debug. Si nécessaire, installez les drivers de debug, par exemple avec la fonction Full Driver Installation Guide de Nexus Root Toolkit et installez Busybox sur votre appareil Android.
Il ne reste plus qu’à utiliser le shell ADB pour recopier le fichier au bon endroit. Ouvrez un terminal, placez vous dans le répertoire où est installé ADB et tapez la commande :
1 |
adb shell |
Si tout s’est bien passé (et notamment si tous les drivers sont installés correctement), vous obtenez alors une invite de commande à distance sur l’appareil Android. Il ne reste plus qu’à envoyer quelques commandes pour recopier le fichier au bon endroit. Par exemple, pour /system/bin/debuggerd :
1 2 3 4 5 6 7 |
su busybox mount -o remount,rw -t auto /system stop debuggerd mv /system/bin/debuggerd /system/bin/debuggerd.old cp /sdcard/debuggerd /system/bin/debuggerd chown root:shell /system/bin/debuggerd chmod 766 /system/bin/debuggerd |
Histoire de comprendre un peu ce que vous faites, voici ce que font ces commandes :
- passage en root avec su
- désactivation du mode lecture seule de la partition /system avec mount
- arrêt du service debuggerd
- sauvegarde du fichier existant avec mv
- copie du nouveau fichier à la bonne place avec cp
- changement du propriétaire et du groupe du fichier avec chown
- changement des droits d’accès du fichier avec chmod
Notez que si vous disposez d’une application de ligne de commande sur votre appareil, comme Terminal Emulator, vous pouvez également l’utiliser pour taper directement ces commandes sur l’appareil, sans passer par le shell ADB.
Vous n’avez maintenant plus qu’à réessayer la mise à jour OTA. Si elle plante à nouveau à cause d’un fichier modifié, répétez l’opération pour ce nouveau fichier, jusqu’à ce que la mise à jour finisse par passer.
Merci beaucoup, excellent tuto ! C’est justement ce que je cherchais. Quelle méthode as tu utilisé ensuite pour rooter de nouveau lollipop ?
J’ai utilisé la procédure automatisée de Nexus Root Toolkit.
Juste une remarque j’ai utilisé la commande mount classique à la place de busybox. busybox ne trouvant pas le fichier /etc/fstab