Nexus 7をadb backup
バックアップして、すべてのファイルを暗号化されたバックアップにバックアップしています。を使用してバックアップから復元できることがわかりますがadb restore
、デバイス上の既存のデータはすべて消去されます。
この暗号化されたバックアップファイルから1つのアプリのデータをどのくらい正確に抽出しますか?
Nexus 7をadb backup
バックアップして、すべてのファイルを暗号化されたバックアップにバックアップしています。を使用してバックアップから復元できることがわかりますがadb restore
、デバイス上の既存のデータはすべて消去されます。
この暗号化されたバックアップファイルから1つのアプリのデータをどのくらい正確に抽出しますか?
回答:
他の人の参考のために、ここに.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からこれを正確に行うことができます。私のブログで機能の詳細を読むことができます(はい、私は知っています、恥知らずのプラグイン。質問に合ったときにそれを行います)
またはワンライナーで:
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) | tar xfvz -
.tar.gz
ファイルの標準Zlibファイルヘッダーを作成し、このヘッダーにオフセット25dから始まるファイルの内容を追加します。そのようなストリームは有効なファイルであり、コマンドはそれをそのように認識するため、ストリームを正常に圧縮解除できます。printf
0x1F 0x8B
0x08
0x00
0x00
backup.ab
.tar.gz
tar xfvz
invalid compressed data--format violated
もう1つのオプションはbash
、cat
およびgunzip
(gzip
)を使用することです。
完全なプロセスは次のようになります(暗号化されていないバックアップを使用):
1つのアプリのデータをバックアップします(たとえば、「KitKatのDNSをオーバーライドする」):
$ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
Now unlock your device and confirm the backup operation.
圧縮データを抽出する
$ 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
圧縮されたデータを解凍する
$ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
| cat - compressed-data | gunzip -c > decompressed-data.tar
gzip: stdin: unexpected end of file
tarファイルを「untar」する
$ tar xf decompressed-data.tar
gzip: stdin: invalid compressed data--format violated
。dd
レポートとして、抽出が成功したと思います22763821+0 records in 22763821+0 records out
。
別のオプションは、このXDAスレッドからPerl AdbBackupRoutinesを使用することです。明らかにPerlを、プラス:彼らは、しかし、いくつかの要件を持っているlibterm-readkey-perl
、libcrypt-cbc-perl
とlibcrypt-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 。
他の人の情報に基づいて、バックアップファイルはプレフィックス付きのデフレート(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や他のツールをインストールするよりも簡単だったため、これを書きました。
利点:
欠点:
これをコマンドラインツールにするにはunab.bat
、contents:java -cp "%~dp0." unab %*
とディレクトリを作成しPATH
ます。
暗黙の質問もあるので、単一のアプリデータを復元する方法は、指定されたfull-backup.abをsingle-app.abファイルに分割するこの気の利いたスクリプトに言及したいと思います。
https://sourceforge.net/projects/adb-split/
jarファイルが必要です:abe.jarおよびtar-bin-split.jarは、次の場所にあります。
少なくとも私のテストケースではうまくいきました。