Criei um backup do meu Galaxy Nexus com adb backup
. O arquivo resultante é chamado backup.db e, de alguma forma, é criptografado.
Eu queria restaurar o backup, mas ele para quando se trata de restauração com.android.providers.contacts
. Eu costumava adb logcat
descobrir o que estava acontecendo e descobri que com.android.acore
falhas durante o processo de restauração.
Gostaria de obter acesso aos dados no backup e remover o banco de dados de contatos para restaurar tudo de volta ao meu telefone. Existem outras maneiras de restaurar os dados do backup?
BackupManagerService
para ler o conteúdo do arquivo de backup. É uma boa quantidade de trabalho, mas eu preciso do meu dados de volta ...Comecei a trabalhar nisso. Estou postando meus resultados até agora aqui como uma resposta "wiki da comunidade" por dois motivos: primeiro, se alguém quiser participar, há um lugar para conversar; segundo, se eu me afastar desse projeto, haverá dicas para alguém começar a trabalhar.
A lógica de backup no host está totalmente contida em https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , na função nomeada
backup
. A função é muito simples: valida as opções da linha de comando, envia o comando principalmente como está para o daemon adb no telefone e grava a saída do telefone no arquivo. Não há nem verificação de erros: se, por exemplo, você recusar o backup no telefone,adb
basta gravar um arquivo vazio.No telefone, a lógica de backup inicia
service_to_fd()
em https://github.com/android/platform_system_core/blob/master/adb/services.cpp . A função identifica que o comando do host é"backup"
e transmite o comando não analisado para/system/bin/bu
, que é um script de shell trivial para iniciarcom.android.commands.bu.Backup
como a classe principal de um novo processo de aplicativo Android. Isso chamaServiceManager.getService("backup")
para obter o serviço de backup comoIBackupManager
e chamaIBackupManager.fullBackup()
, passando a ele o descritor de arquivo ainda não utilizado (muito indiretamente) conectado aobackup.ab
arquivo no host.O controle passa para
fullBackup()
em com.android.server.backup.BackupManagerService , que exibe a GUI solicitando ao usuário que confirme / rejeite o backup. Quando o usuário faz isso,acknowledgeFullBackupOrRestore()
(mesmo arquivo) é chamado. Se o usuário aprovou a solicitação,acknowledgeFullBackupOrRestore()
descobre se o backup está criptografado e passa uma mensagem paraBackupHandler
(mesmo arquivo.), EmBackupHandler
seguida, instancia e inicia umPerformAdbBackupTask
( mesmo arquivo, linha 4004 no momento da gravação).Finalmente começamos a gerar saída lá
PerformAdbBackupTask.run()
, entre as linhas 4151 e 4330 .Primeiro,
run()
escreve um cabeçalho, que consiste em 4 ou 9 linhas ASCII:"ANDROID BACKUP"
"4"
"0"
se o backup é descompactado ou"1"
se é"none"
ou"AES-256"
"10000"
Os dados de backup real segue, quer como (dependendo de compressão e de criptografia)
tar
,deflate(tar)
,encrypt(tar)
, ouencrypt(deflate(tar))
.TODO : escreva o caminho do código que gera a saída do tar - você pode simplesmente usar o tar desde que as entradas estejam na ordem correta (veja abaixo).
Formato de arquivo Tar
Os dados do aplicativo são armazenados no diretório app /, começando com um arquivo _manifest, o APK (se solicitado) em /, arquivos de aplicativo em f /, bancos de dados em db / e preferências compartilhadas em sp /. Se você solicitou um backup de armazenamento externo (usando a opção -shared), também haverá um diretório / compartilhado no arquivo que contém arquivos de armazenamento externo.
Detalhes de criptografia
Exemplo de implementação de código de pacote / descompactação (produz / usa) arquivos tar: https://github.com/nelenkov/android-backup-extractor
Mais alguns detalhes aqui: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Scripts Perl para empacotar / descompactar e corrigir arquivos quebrados:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
fonte
Resposta ótima e detalhada de Nikolay Elenkov . No entanto, devo acrescentar que alguém já desenvolve um software que faz exatamente isso e o empacota aqui: http://sourceforge.net/projects/adbextractor/
O pacote contém as ferramentas Java e Perl. Eu mesmo prefiro o Perl do que Java a qualquer dia, então extraí os códigos do Perl, verifique se eles são executáveis, instalei a biblioteca Perl necessária e
backupdecrypt.pl
executei um arquivo de backup adb e o converti em um arquivo tar ou gzip tar sem nenhum questão.Até formei um liner no Bash 3 que me permite fazer backup adb diretamente no arquivo tar compactado com gzip:
Espero que ajude.
fonte
Para explorar o arquivo de backup existente, tente a página http://www.adb-backup.com , é simples sem "dd", "tar", ...
Os dados não são armazenados neste servidor. Desenvolvi esse serviço online para facilitar a exibição de backups sem manipular o dd / tar ou instalar software adicional. Sou autor www.adb-backup.com
fonte