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 com.android.acore
falla 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?
El archivo no está encriptado, a menos que lo especifique al crear la copia de seguridad. Sin embargo, está comprimido (usando deflate). Puede averiguar el formato exacto consultando el código fuente de Android (com/android/server/BackupManagerService.java) y, técnicamente, debería poder extraer datos específicos de él. Sin embargo, IIRC, existen algunas verificaciones de integridad de archivos, por lo que lo más probable es que no funcione si solo elimina un montón de datos. Desafortunadamente, el restore
comando no parece tener una opción para restaurar solo una aplicación/paquete en particular o excluir un paquete.
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 apartan de este proyecto, habrá pistas para que alguien más empiece a trabajar.
La lógica de copia de seguridad en el host está completamente contenida en https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , en la función denominada backup
. La función es muy simple: valida las opciones de la línea de comandos, envía el comando casi como está al demonio adb 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 sin analizar a /system/bin/bu
, que es un script de shell trivial para iniciar com.android.commands.bu.Backup
como la clase principal de un nuevo proceso de aplicación de Android. Eso llama ServiceManager.getService("backup")
para obtener el servicio de respaldo como un IBackupManager
, y llama IBackupManager.fullBackup()
, pasándole el descriptor de archivo aún sin usar (muy indirectamente) conectado al backup.ab
archivo en el host.
El control pasa a fullBackup()
com.android.server.backup.BackupManagerService , que abre la GUI y le pide al usuario que confirme o rechace la copia de seguridad. Cuando el usuario lo hace, acknowledgeFullBackupOrRestore()
se llama (mismo archivo). Si el usuario aprobó la solicitud, acknowledgeFullBackupOrRestore()
averigua si la copia de seguridad está encriptada y pasa un mensaje a BackupHandler
(mismo archivo) BackupHandler
, luego crea una instancia y lanza un PerformAdbBackupTask
( mismo archivo, línea 4004 en el momento de escribir este artículo)
Finalmente comenzamos a generar resultados allí, enPerformAdbBackupTask.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 bien"AES-256"
"10000"
Los datos reales de la copia de seguridad siguen, ya sea como (dependiendo de la compresión y el cifrado) tar
, deflate(tar)
, encrypt(tar)
o encrypt(deflate(tar))
.
TODO : escriba la ruta del código que genera la salida tar; simplemente puede usar tar siempre que las entradas estén en el orden correcto (ver más abajo).
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/, los archivos de la aplicación en f/, las bases de datos en db/ y las preferencias compartidas en sp/. Si solicitó una copia de seguridad de almacenamiento externo (usando la opción -shared), también habrá un directorio shared/ en el archivo que contiene archivos de almacenamiento externo.
$ tar tvf mybackup.tar
-rw------- 1000/1000 1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000 1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091 231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091 0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091 5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091 1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml
Detalles de cifrado
Implementación de código de empaquetado/desempaquetado de muestra (produce/usa) archivos tar: https://github.com/nelenkov/android-backup-extractor
Más detalles aquí: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Scripts de Perl para empaquetar/desempaquetar y reparar archivos rotos:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
Gran y detallada respuesta de Nikolay Elenkov . Sin embargo, debo agregar que alguien ya desarrolló un software que hace exactamente eso y lo empaqueta aquí: http://sourceforge.net/projects/adbextractor/
El paquete contiene la herramienta Java y Perl. Yo mismo prefiero Perl a Java cualquier día, así que extraje los códigos Perl, me aseguré de que sean ejecutables, instalé la biblioteca Perl requerida y backupdecrypt.pl
ejecuté contra un archivo de copia de seguridad adb, y lo convertí en un archivo tar o tar comprimido con gzip sin ningún tipo de asunto.
Incluso formé una sola línea en Bash 3 que me permite hacer una copia de seguridad adb directamente en un archivo tar comprimido con gzip:
adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all
Espero eso ayude.
Para explorar el archivo de respaldo 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 el autor www.adb-backup.com
alquimia