J'ai eu ce problème en essayant de repousser une sauvegarde de mon Samsung Galaxy S2, en utilisant ADB avec l'outil de récupération CWM (clockworkmod). Lors du repoussage vers un fichier de périphérique, ADB supprime simplement le fichier de périphérique de bloc et crée un fichier normal à sa place, et donc aucune donnée ne se retrouve réellement sur le périphérique mmcblk0.
Malheureusement, l'envoi de la sortie d'une commande dans "adb shell" n'est pas non plus implémenté, et la fonctionnalité de sockets unix "adb forward" ne semble pas fonctionner non plus, il est donc difficile de récupérer la sauvegarde dans le périphérique.
La solution est d'envoyer le fichier image vers netcat, et d'utiliser le transfert de port TCP d'ADB pour diriger le flux vers votre appareil. Cependant, si votre CWM/busybox n'a pas d'outils réseau, vous devrez également télécharger la version binaire statique arm-v7 de busybox avec toutes les applets à partir de http://www.busybox.net/downloads/binaries/latest/ pour pouvoir exécuter netcat sur votre appareil.
# wget "http://www.busybox.net/downloads/binaries/latest/busybox-armv7l"
# adb push busybox-armv7l /tmp/busybox
# adb forward tcp:6789 tcp:9876
# adb shell
~ # chmod +x /tmp/busybox
~ # /tmp/busybox nc -l -p 9876 > /dev/block/mmcblk0
Puis, dans une nouvelle coquille :
# dd if=your-image-file.img | nc localhost 6789 &
"dd" est meilleur que "cat" car vous pouvez vérifier la progression de la copie à intervalles (remplacez 5647 par le PID de la commande DD) :
# kill -USR1 5647
48+0 records in
47+0 records out
49283072 bytes (49 MB) copied, 17.6145 s, 2.8 MB/s
Attention, écrire sur mmcblk0 (ou l'équivalent sur votre appareil Android) effacera même les partitions de démarrage et de récupération, ce qui est un excellent moyen de détruire votre appareil. Pour mémoire, ma restauration a bien fonctionné ;-)