Como você extrai os dados de um aplicativo de um backup completo feito por meio de "backup adb"?

117

Fiz o backup do meu Nexus 7 adb backuppara fazer o backup de todos os arquivos em um backup criptografado. Vejo que você pode restaurar a partir de um backup com adb restore, mas isso limparia todos os meus dados existentes no dispositivo.

Como exatamente eu extrairia os dados de um aplicativo desse arquivo de backup criptografado?

Ryan Conrad
fonte

Respostas:

113

Apenas para referência de outras pessoas, aqui estão algumas informações sobre o formato de arquivo .ab.

O arquivo de backup do Android (* .ab) é um arquivo TAR compactado . É compactado usando o algoritmo DEFLATE . Além disso, pode haver criptografia AES usada. Isso é determinado quando você cria o backup; se você digitar uma senha, o backup será criptografado; caso contrário; não há criptografia, é apenas compactada.

O HEADER do arquivo é um pouco diferente de um arquivo DEFLATE normal. Ele contém informações sobre o backup e é semelhante ao seguinte:

ANDROID BACKUP
1
1
none

A primeira linha é a linha "Magic" . A próxima linha é a versão do formato de arquivo de backup do Android. A próxima linha é um booleano (verdadeiro ou falso, 1 ou 0) indicando se o arquivo está compactado. A última linha é o tipo de criptografia. Este exemplo não está usando nenhuma criptografia. Se houvesse uma senha, a linha seria "AES-256". Depois disso é a cifra de criptografia. Se não houver senha, o DEFLATE "archive" será iniciado.

É compactado usando o Java Deflater . O que, da perspectiva dos desenvolvedores, causa problemas se você quiser usar qualquer coisa além do Java para extraí-lo. Não consegui encontrar nada que possa esvaziá-lo usando o mesmo algoritmo, mesmo que tudo o que encontrei (por exemplo, C #) deva seguir o "SPEC".

Com isso dito, há um projeto de código aberto sob a licença Apache 2.0, escrito por Nikolay Elenkov, que permitirá extrair o .ab em um arquivo tar.

Uso:

java -jar abe.jar unpack <backup.ab> <backup.tar> <password>

Se você não tiver certeza de como realmente usar isso (que está além do escopo desta resposta), a próxima versão do Droid Explorer v0.8.8.7 ( disponível aqui ) permitirá que você faça exatamente isso e muito mais, diretamente do Explorer. Você pode ler mais sobre os recursos do meu blog (sim, eu sei, plug descarado. Faço isso quando ele se encaixa na pergunta)

desembalar

Ryan Conrad
fonte
1
Eu votaria em você se tivesse reputação, meu deus, obrigado!
não há de quê. Eu só conheço todas essas informações porque esse é um recurso que eu recentemente adicionei à base de código do Droid Explorer, então tive que fazer algumas pesquisas sobre ela.
Ryan Conrad
Olá Ryan, tentei usar o Droid Explorer, mas ele não começa a reclamar da localização do SDK do Android, mesmo que esteja instalado e eu estou fornecendo o caminho certo.
Umar Farooq Khawaja 01/01
@UmarFarooqKhawaja Dê uma olhada no FAQ do droid explorer. A última pergunta / resposta trata do seu problema.
Ryan Conrad
OK, extraiu a pasta 'com.app.name' relevante do alcatrão, mas como usá-lo para restaurar os dados do aplicativo? Basta copiar a pasta para sdcard / Android / data / não parecem funcionar ...
pelms
91

Ou com uma linha:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -
Kari
fonte
2
Agradável! Você também tem o equivalente a "pacote" (para pegar a árvore de diretórios descompactada e criar um arquivo .db)?
dailyglen
4
Você poderia adicionar uma explicação à resposta?
Lucky
2
Esta é a melhor resposta: D Funciona perfeitamente! Extraindo agora.
Xdevs23
16
Explicação: author cria um cabeçalho de arquivo Zlib padrão para um .tar.gzarquivo com printfcomando ( 0x1F 0x8Bé uma assinatura, 0x08é o método de compactação, 0x00são sinalizadores e 4 x 0x00é carimbo de data e hora) e, em seguida, anexa a esse cabeçalho o conteúdo do backup.abarquivo, iniciando no deslocamento 25d. Esse fluxo é um .tar.gzarquivo válido e o tar xfvzcomando o reconhece como tal, para que ele possa descompactar com êxito o fluxo.
antonone
3
Fiz um backup com o adb 1.0.36 (revisão 1.7.0.0 + r33-2) e esse método produziu um erro do zgip:invalid compressed data--format violated
Rache
31

Mais uma opção é usar bash, cate gunzip( gzip).

O processo completo pode ser este ( com um backup não criptografado ):

  1. faça backup dos dados de um aplicativo (por exemplo, " Substituir DNS para KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. extrair os dados compactados

    $ dd if=net.mx17.overridedns.ab bs=1 skip=24 > compressed-data
    1285+0 records in
    1285+0 records out
    1285 bytes (1,3 kB) copied, 0,00745877 s, 172 kB/s
    
  3. descomprimir os dados compactados

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. "descompactar" o arquivo tar

    $ tar xf decompressed-data.tar
    
MaxChinni
fonte
4
O "final inesperado do arquivo" é esperado?
hft 02/09
A extração em 2 surpreendentemente funcionou em um arquivo criptografado. Como isso é possível? A descompressão falhou com gzip: stdin: invalid compressed data--format violated. Presumo que a extração tenha sido bem-sucedida, como ddrelatórios 22763821+0 records in 22763821+0 records out.
Tom Russell
4

Outra opção é usar o Perl AdbBackupRoutines desse thread XDA . Porém, eles têm alguns requisitos: Perl obviamente, mais libterm-readkey-perl, libcrypt-cbc-perle libcrypt-pbkdf2-perl(se seus backups não estiverem criptografados, você pode pular a última dependência simplesmente comentando a linha 103 de backupdecrypt.plonde está incluída - funcionou bem para mim).

O uso é bastante fácil:

./backupdecrypt.pl [options] <backupfile.ab> <outfile.tar>

O .tararquivo resultante pode ser investigado como qualquer outro tarball. Sua estrutura é bastante interessante em pelo menos um aspecto: não reflete os caminhos reais de onde os arquivos foram extraídos (por exemplo /data/data/com.app.name/databases/whatever.db, não , mas em vez disso apps/com.app.name/db/whatever.db) - o que indica que um aplicativo com backup em um dispositivo / ROM pode ser restaurado para qualquer outro dispositivo / ROM sem problemas, como adb restoredeve descobrir os caminhos reais.

Izzy
fonte
Há uma outra ferramenta (um pouco melhor mantida) que faz isso: github.com/nelenkov/android-backup-extractor
tampa
Obrigado, @lid! Também incluí um pequeno script de shell (quase apenas uma linha) com minha ferramenta Adebar (Android DEvice Backup And Report), que converte backups do ADB ( .ab) em .tar.gzarquivos :)
Izzy
4

Com base nas informações de outras pessoas, agora sei que o arquivo de backup é apenas um fluxo deflacionado (GZip) prefixado. Com base nessas informações, este simples programa pode descompactá-lo para você:

import java.io.*;
import java.util.zip.*;

/** Run: javac unab.java && java unab backupfile.ab */
public class unab {
    private static final int BACKUP_HEADER_LENGTH = 24;
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
            OutputStream out = new FileOutputStream(args[0] + ".tar");
            try {
                if (in.skip(BACKUP_HEADER_LENGTH) != BACKUP_HEADER_LENGTH) {
                    throw new IOException("Unexpected end of file while skipping backup header.");
                }
                byte[] buffer = new byte[100 * 1024];
                int count;
                InputStream zip = new InflaterInputStream(in);
                while ((count = zip.read(buffer)) > 0) {
                    out.write(buffer, 0, count);
                }
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }
}

Escrevi isso porque não tenho nenhuma das ferramentas Unix mencionadas acima e era mais fácil do que instalar o Cygwin ou outras ferramentas.

Vantagens :

  • multiplataforma
  • simples (sem parâmetros esotéricos)
  • sem necessidade de ferramentas de tubulação

Desvantagens :

  • precisa de um JDK (que você provavelmente já possui porque está mexendo com o Android SDK)
  • sem suporte para backups criptografados
  • preciso de algo para extrair o arquivo tar resultante (eu uso o Total Commander)

Para torná-lo uma ferramenta de linha de comando, crie unab.batcom o conteúdo: java -cp "%~dp0." unab %*e o diretório para PATH.

TWiStErRob
fonte
4

Como a pergunta implícita também é: como restaurar dados de aplicativos únicos, gostaria de mencionar esse script bacana, que divide um determinado backup completo.ab em arquivos single-app.ab:

https://sourceforge.net/projects/adb-split/

Requer os arquivos jar: abe.jar e tar-bin-split.jar que podem ser encontrados aqui:

Funcionou pelo menos para o meu testcase.

joe_zeroh
fonte