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
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.
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.