「adbバックアップ」によって作成されたフルバックアップからアプリのデータをどのように抽出しますか?


117

Nexus 7をadb backupバックアップして、すべてのファイルを暗号化されたバックアップにバックアップしています。を使用してバックアップから復元できることがわかりますがadb restore、デバイス上の既存のデータはすべて消去されます。

この暗号化されたバックアップファイルから1つのアプリのデータをどのくらい正確に抽出しますか?


回答:


113

他の人の参考のために、ここに.abファイル形式の背景を示します。

Androidバックアップ(* .ab)ファイルは、圧縮されたTARファイルです。DEFLATEアルゴリズムを使用して圧縮されます。さらに、AES暗号化を使用できます。これは、バックアップを作成するときに決定されます。パスワードを入力すると、バックアップは暗号化されます。暗号化はなく、圧縮されているだけです。

ファイルのHEADERは、通常のDEFLATEアーカイブとは少し異なります。バックアップに関する情報が含まれており、次のようになります。

ANDROID BACKUP
1
1
none

最初の行は「マジック」行です。次の行は、Androidバックアップファイル形式のバージョンです。次の行は、ファイルが圧縮されているかどうかを示すブール値(trueまたはfalse、1または0)です。最後の行は暗号化のタイプです。この例では暗号化を使用していません。パスワードがあった場合、行には「AES-256」と表示されます。その後は暗号化暗号です。パスワードがない場合、DEFLATE「アーカイブ」が開始されます。

Java Deflaterを使用して圧縮されます。開発者の観点から、Java以外を使用して抽出したい場合に問題が発生します。私が見つけたものはすべて(C#のように)「SPEC」に従うことになっているにもかかわらず、同じアルゴリズムを使用してそれを収縮できるものを見つけることができませんでした。

そうは言っても、Nikolay Elenkovによって書かれたApache 2.0ライセンスの下に、.abをtarファイルに抽出できるオープンソースプロジェクトがあります。

使用法:

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

本当にそれを使用する方法がわからない場合(この答えの範囲を超えています)、Droid Explorer v0.8.8.7の次のバージョン(こちらから入手可能)を使用すると、Explorerからこれを正確に行うことができます。私のブログで機能の詳細を読むことができます(はい、私は知っています、恥知らずのプラグイン。質問に合ったときにそれを行います)

開梱する


1
私の評判がよければ、投票するよ。

どういたしまして。これは最近Droid Explorerのコードベースに追加した機能であるため、すべての情報しか知りません。そのため、いくつかの調査を行う必要がありました。
ライアンコンラッド

こんにちはRyan、Droid Explorerを使用しようとしましたが、Android SDKの場所がインストールされており、正しいパスを提供しているにもかかわらず、Android SDKの場所について不平を言うことはありません。
ウマルファルークカワジャ14年

@UmarFarooqKhawaja droid explorer のFAQをご覧ください。最後のQ / Aは問題に対処します。
ライアンコンラッド14年

OK、関連する 'com.app.name'フォルダーをtarから抽出しましたが、それを使用してアプリデータを復元するにはどうすればよいですか?単に/アンドロイド/データをSDカードには、フォルダをコピー/ ...動作するようには思えない
pelms

91

またはワンライナーで:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -

2
いいね!「pack」に相当するものもありますか(非圧縮ディレクトリツリーを取得して.dbファイルを作成します)?
-dailyglen

4
答えに説明を加えてください。
ラッキー

2
これが最良の答えです。Dは完全に機能します。今抽出しています。
xdevs23

16
説明:作成者は、コマンド(署名、圧縮方法、フラグ、4 x はタイムスタンプ)を使用して.tar.gzファイルの標準Zlibファイルヘッダーを作成し、このヘッダーにオフセット25dから始まるファイルの内容を追加します。そのようなストリームは有効なファイルであり、コマンドはそれをそのように認識するため、ストリームを正常に圧縮解除できます。printf0x1F 0x8B0x080x000x00backup.ab.tar.gztar xfvz
アントノン

3
私はadb 1.0.36(Revision 1.7.0.0 + r33-2)でバックアップを作成しましたが、この方法ではzgipからエラーが発生しました:invalid compressed data--format violated
Rache

31

もう1つのオプションはbashcatおよびgunzipgzip)を使用することです。

完全なプロセスは次のようになります(暗号化されていないバックアップを使用):

  1. 1つのアプリのデータをバックアップします(たとえば、「KitKatのDNSをオーバーライドする」):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. 圧縮データを抽出する

    $ 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. 圧縮されたデータを解凍する

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. tarファイルを「untar」する

    $ tar xf decompressed-data.tar
    

4
「予期しないファイルの終わり」が予想されますか?
hft

2での抽出は、驚くべきことに暗号化されたファイルで機能しました。これはどのように可能ですか?減圧はそれから失敗しましたgzip: stdin: invalid compressed data--format violatedddレポートとして、抽出が成功したと思います22763821+0 records in 22763821+0 records out
トムラッセル

4

別のオプションは、このXDAスレッドからPerl AdbBackupRoutinesを使用することです。明らかにPerlを、プラス:彼らは、しかし、いくつかの要件を持っているlibterm-readkey-perllibcrypt-cbc-perllibcrypt-pbkdf2-perl(バックアップが暗号化されていない場合、あなたは、単にのライン103コメントアウトすることで、最後の依存関係をスキップすることができますbackupdecrypt.pl-私のためにうまく働いたことが含まれていますどこに)。

使い方はとても簡単です:

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

結果の.tarファイルは、他のtarballと同様に調査できます。その構造は、少なくとも1つの側面で非常に興味深いものです:ファイルが取得された実際のパスを反映していません(例:ではなく/data/data/com.app.name/databases/whatever.db、代わりにapps/com.app.name/db/whatever.db)-これは、1つのデバイス/ ROMにバックアップされたアプリが復元される可能性があることを示しますadb restore実際のパス自体を把握する必要があるため、問題なく他のデバイス/ ROM 。


これを行う別のツール(もう少し良く保守されています)があります:github.com/nelenkov/android-backup-extractor
lid

ありがとう、@ lid!私も自分のツールを使って小さなシェル・スクリプト(ほとんどワンライナーのみ)含めましたAdebar(ADBバックアップを変換する(Androidデバイスのバックアップおよびレポート)、.abに).tar.gz:)アーカイブ
イジー

4

他の人の情報に基づいて、バックアップファイルはプレフィックス付きのデフレート(GZip)ストリームであることがわかりました。この情報に基づいて、この単純なプログラムはあなたのために解凍できます:

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();
        }
    }
}

上記のUnixツールがなく、Cygwinや他のツールをインストールするよりも簡単だったため、これを書きました。

利点

  • クロスプラットフォーム
  • シンプル(難解なパラメーターなし)
  • 配管ツールは不要

欠点

  • JDKが必要です(Android SDKをいじっているので、おそらく既に持っています)
  • 暗号化されたバックアップのサポートなし
  • 結果のtarファイルを抽出するために何かが必要です(Total Commanderを使用しています)

これをコマンドラインツールにするにはunab.bat、contents:java -cp "%~dp0." unab %*とディレクトリを作成しPATHます。


4

暗黙の質問もあるので、単一のアプリデータを復元する方法は、指定されたfull-backup.abをsingle-app.abファイルに分割するこの気の利いたスクリプトに言及したいと思います。

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

jarファイルが必要です:abe.jarおよびtar-bin-split.jarは、次の場所にあります。

少なくとも私のテストケースではうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.