J'ai créé une sauvegarde de mon Galaxy Nexus avec adb backup
. Le fichier résultant s'appelle backup.db et est en quelque sorte crypté.
Je voulais restaurer la sauvegarde, mais elle s’arrête quand il s’agit de restaurer com.android.providers.contacts
. J'avais l'habitude adb logcat
de savoir ce qui se passait et de constater que se com.android.acore
bloquait lors du processus de restauration.
J'aimerais accéder aux données de la sauvegarde et supprimer la base de données de contacts pour tout restaurer sur mon téléphone. Existe-t-il d'autres moyens de restaurer les données à partir de la sauvegarde?
BackupManagerService
pour lire le contenu du fichier de sauvegarde. C'est une bonne quantité de travail, mais j'ai besoin de récupérer mes données ...J'ai commencé à travailler sur ça. Je publie mes résultats jusqu'ici comme réponse de "wiki de communauté" pour deux raisons: premièrement, si quelqu'un d'autre souhaite y participer, il existe un lieu de discussion; Deuxièmement, si je suis éloigné de ce projet, il y aura des indices pour que quelqu'un d'autre commence à travailler.
La logique de sauvegarde sur l'hôte est entièrement contenue dans https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , dans la fonction nommée
backup
. La fonction est très simple: elle valide les options de ligne de commande, envoie la commande essentiellement telle quelle au démon adb du téléphone et écrit la sortie du téléphone dans le fichier. Il n'y a même pas de vérification d'erreur: si, par exemple, vous refusez la sauvegarde sur le téléphone, écrivezadb
simplement un fichier vide.Sur le téléphone, la logique de sauvegarde commence
service_to_fd()
dans https://github.com/android/platform_system_core/blob/master/adb/services.cpp . La fonction identifie la commande de l'hôte"backup"
et transmet la commande non analysée à/system/bin/bu
, ce qui est un script shell trivial à lancer encom.android.commands.bu.Backup
tant que classe principale d'un nouveau processus d'application Android. Cela appelleServiceManager.getService("backup")
pour obtenir le service de sauvegarde en tant queIBackupManager
, et appelleIBackupManager.fullBackup()
, en lui transmettant le descripteur de fichier encore inutilisé (très indirectement) connecté aubackup.ab
fichier sur l'hôte.Le contrôle passe
fullBackup()
dans com.android.server.backup.BackupManagerService , qui affiche l'interface graphique demandant à l'utilisateur de confirmer / refuser la sauvegarde. Lorsque l'utilisateur le fait,acknowledgeFullBackupOrRestore()
(même fichier) est appelé. Si l'utilisateur a approuvé la demande,acknowledgeFullBackupOrRestore()
détermine si la sauvegarde est cryptée et passe un message àBackupHandler
(même fichier.)BackupHandler
Puis instancie et lance unPerformAdbBackupTask
( même fichier, ligne 4004 à la date de rédaction).Nous commençons enfin à générer une sortie
PerformAdbBackupTask.run()
entre les lignes 4151 et 4330 .Commencez par
run()
écrire un en-tête composé de 4 ou 9 lignes ASCII:"ANDROID BACKUP"
"4"
"0"
si la sauvegarde est décompressée ou"1"
si elle est"none"
ou"AES-256"
"10000"
Les données de sauvegarde réelle suit, soit ( en fonction de la compression et le cryptage)
tar
,deflate(tar)
,encrypt(tar)
ouencrypt(deflate(tar))
.TODO : écrivez le chemin du code qui génère la sortie de tar - vous pouvez simplement utiliser tar tant que les entrées sont dans le bon ordre (voir ci-dessous).
Format d'archive Tar
Les données d'application sont stockées dans le répertoire app /, en commençant par un fichier _manifest, l'APK (si demandé) dans un /, les fichiers d'application en f /, les bases de données en db / et les préférences partagées en sp /. Si vous avez demandé une sauvegarde de stockage externe (à l'aide de l'option -shared), il y aura également un répertoire partagé / dans l'archive contenant les fichiers de stockage externes.
Détails du chiffrement
Exemple d'implémentation / décompression du code (produit / utilise) les archives tar: https://github.com/nelenkov/android-backup-extractor
Quelques détails supplémentaires ici: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Scripts Perl pour emballer / décompresser et réparer les archives endommagées:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
la source
Réponse géniale et détaillée de Nikolay Elenkov . Cependant, je devrais ajouter que quelqu'un a déjà développé un logiciel qui ne fait que cela et le conditionne ici: http://sourceforge.net/projects/adbextractor/
Le paquet contient les outils Java et Perl. Moi-même, je préfère chaque jour Perl à Java, donc j’ai extrait les codes Perl, je me suis assuré qu’ils sont exécutables, j’ai installé la bibliothèque Perl requise et
backupdecrypt.pl
j’ai exécuté le fichier de sauvegarde adb. problème.J'ai même créé une couche dans Bash 3 qui me permet de faire une sauvegarde adb directement dans un fichier tar compressé:
J'espère que ça aide.
la source
Pour explorer le fichier de sauvegarde existant, essayez la page http://www.adb-backup.com , elle est simple, sans "dd", "tar", ...
Les données ne sont pas stockées sur ce serveur. J'ai développé ce service en ligne pour faciliter la visualisation des sauvegardes sans manipulation avec dd / tar ni installation de logiciel supplémentaire. Je suis l'auteur www.adb-backup.com
la source