Creé una copia de seguridad de mi Galaxy Nexus con adb backup
. El archivo resultante se llama backup.db y de alguna manera está encriptado.
Quería restaurar la copia de seguridad, pero se detiene cuando se trata de restaurar com.android.providers.contacts
. Solía adb logcat
averiguar qué estaba pasando y descubrí que se com.android.acore
bloquea durante el proceso de restauración.
Me gustaría obtener acceso a los datos en la copia de seguridad y eliminar la base de datos de contactos para restaurar todo a mi teléfono. ¿Hay alguna otra forma de restaurar los datos de la copia de seguridad?
BackupManagerService
para leer el contenido del archivo de copia de seguridad. Es una buena cantidad de trabajo, pero necesito recuperar mis datos ...Empecé a trabajar en esto. Estoy publicando mis resultados hasta ahora aquí como una respuesta de "wiki de la comunidad" por dos razones: primero, si alguien más quiere unirse, hay un lugar para hablar; segundo, si me alejan de este proyecto, habrá sugerencias para que alguien más comience a trabajar.
La lógica de respaldo en el host está completamente contenida en https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , en la función nombrada
backup
. La función es muy simple: valida las opciones de la línea de comandos, envía el comando en su mayoría tal cual al adb daemon en el teléfono y escribe la salida del teléfono en el archivo. Ni siquiera hay verificación de errores: si, por ejemplo, rechaza la copia de seguridad en el teléfono,adb
simplemente escribe un archivo vacío.En el teléfono, la lógica de respaldo comienza
service_to_fd()
en https://github.com/android/platform_system_core/blob/master/adb/services.cpp . La función identifica que el comando del host es"backup"
, y pasa el comando no analizado a/system/bin/bu
, que es un script de shell trivial para iniciarcom.android.commands.bu.Backup
como la clase principal de un nuevo proceso de aplicación de Android. Eso llamaServiceManager.getService("backup")
para obtener el servicio de respaldo como unIBackupManager
, y llamaIBackupManager.fullBackup()
, pasándole el descriptor de archivo aún no utilizado (muy indirectamente) conectado albackup.ab
archivo en el host.El control pasa al
fullBackup()
de com.android.server.backup.BackupManagerService , la cual aparece la interfaz gráfica de usuario que pide al usuario que confirme / rechazar la copia de seguridad. Cuando el usuario lo hace,acknowledgeFullBackupOrRestore()
se llama (mismo archivo). Si el usuario aprobó la solicitud,acknowledgeFullBackupOrRestore()
descubre si la copia de seguridad está encriptada y pasa un mensaje aBackupHandler
(mismo archivo),BackupHandler
luego crea una instancia y lanza unPerformAdbBackupTask
( mismo archivo, línea 4004 al momento de la escritura)Finalmente comenzamos a generar resultados allí, en
PerformAdbBackupTask.run()
, entre la línea 4151 y la línea 4330 .Primero,
run()
escribe un encabezado, que consta de 4 o 9 líneas ASCII:"ANDROID BACKUP"
"4"
"0"
si la copia de seguridad no está comprimida o"1"
si está"none"
o"AES-256"
"10000"
Los datos de copia de seguridad real sigue, ya sea como (dependiendo de la compresión y cifrado)
tar
,deflate(tar)
,encrypt(tar)
, oencrypt(deflate(tar))
.TODO : escriba la ruta del código que genera la salida de tar; simplemente puede usar tar siempre que las entradas estén en el orden correcto (consulte a continuación).
Formato de archivo tar
Los datos de la aplicación se almacenan en el directorio app /, comenzando con un archivo _manifest, el APK (si se solicita) en a /, archivos de aplicación en f /, bases de datos en db / y preferencias compartidas en sp /. Si solicitó una copia de seguridad de almacenamiento externo (utilizando la opción compartida), también habrá un directorio compartido en el archivo que contiene archivos de almacenamiento externo.
Detalles de cifrado
Ejemplo de implementación de código de paquete / desempaquetado (produce / usa) archivos tar: https://github.com/nelenkov/android-backup-extractor
Algunos detalles más aquí: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Scripts de Perl para empacar / desempacar y arreglar archivos rotos:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
fuente
Gran y detallada respuesta de Nikolay Elenkov . Sin embargo, debería agregar que alguien ya desarrolla un software que hace exactamente eso y lo empaqueta aquí: http://sourceforge.net/projects/adbextractor/
El paquete contiene herramientas Java y Perl. Yo prefiero Perl sobre Java cualquier día, así que extraje los códigos de Perl, me aseguré de que sean ejecutables, instalé la biblioteca Perl requerida,
backupdecrypt.pl
ejecuté el archivo de copia de seguridad de adb y lo convirtió en un archivo tar o gzipped tar sin ningún tipo de problema.Incluso formé un forro en Bash 3 que me permite hacer una copia de seguridad de adb directamente al archivo tar comprimido:
Espero eso ayude.
fuente
Para explorar el archivo de copia de seguridad existente, pruebe la página http://www.adb-backup.com , es simple sin "dd", "tar", ...
Los datos no se almacenan en este servidor. Desarrollé este servicio en línea para que sea más fácil ver las copias de seguridad sin manipularlas con dd / tar o instalar software adicional. Soy autor www.adb-backup.com
fuente