Bagaimana Anda mengekstrak data Aplikasi dari cadangan penuh yang dibuat melalui “adb backup”?

117

Saya telah mencadangkan Nexus 7 saya dengan adb backupmencadangkan semua file ke dalam cadangan terenkripsi. Saya melihat bahwa Anda dapat memulihkan dari cadangan dengan adb restore, tetapi itu akan menghapus semua data saya yang ada di perangkat.

Bagaimana tepatnya saya mengekstrak data satu aplikasi dari file cadangan terenkripsi ini?

Ryan Conrad
sumber

Jawaban:

113

Hanya untuk referensi orang lain, berikut adalah beberapa latar belakang pada format file .ab.

File Android Backup (* .ab) adalah file TAR terkompresi . Itu dikompresi menggunakan algoritma DEFLATE . Selain itu, ada enkripsi AES yang digunakan. Ini ditentukan saat Anda membuat cadangan, jika Anda memasukkan kata sandi maka cadangan dienkripsi, jika tidak; tidak ada enkripsi, hanya dikompresi.

HEADER file sedikit berbeda dari arsip DEFLATE normal. Ini berisi informasi tentang cadangan dan terlihat seperti berikut:

ANDROID BACKUP
1
1
none

Baris pertama adalah baris "Magic" . Baris berikutnya adalah versi format file Android Backup. Baris berikutnya adalah boolean (benar atau salah, 1 atau 0) yang menunjukkan apakah file dikompresi. Baris terakhir adalah jenis enkripsi. Contoh ini tidak menggunakan enkripsi apa pun. Jika ada kata sandi, baris itu akan bertuliskan "AES-256". Setelah itu adalah enkripsi cipher. Jika tidak ada kata sandi, maka DEFLATE "arsip" dimulai.

Itu dikompresi menggunakan Java Deflater . Yang, dari perspektif pengembang, menyebabkan masalah jika Anda ingin menggunakan apa pun selain Java untuk mengekstraknya. Saya belum dapat menemukan apa pun yang dapat mengempiskannya menggunakan algoritma yang sama, meskipun semua yang saya temukan (untuk seperti C #) seharusnya mengikuti "SPEC".

Dengan itu, ada proyek open source di bawah lisensi Apache 2.0, ditulis oleh Nikolay Elenkov yang akan memungkinkan Anda untuk mengekstrak .ab ke file tar.

Pemakaian:

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

Jika Anda tidak yakin bagaimana cara menggunakannya (yang berada di luar cakupan jawaban ini), versi Droid Explorer v0.8.8.7 berikutnya ( tersedia di sini ) akan memungkinkan Anda untuk melakukan hal ini, dan banyak lagi, langsung dari Explorer. Anda dapat membaca lebih lanjut tentang fitur di blog saya (ya, saya tahu, plug tak tahu malu. Saya melakukan itu ketika itu cocok dengan pertanyaan)

membongkar

Ryan Conrad
sumber
1
Saya akan memilih Anda jika saya memiliki reputasi, my god terima kasih!
sama-sama. Saya hanya tahu semua informasi itu karena ini adalah fitur yang baru-baru ini saya tambahkan ke basis kode Droid Explorer, jadi saya harus melakukan riset tentang hal itu.
Ryan Conrad
Hai Ryan, mencoba menggunakan Droid Explorer tetapi gagal untuk mulai mengeluh tentang lokasi Android SDK, meskipun sudah diinstal dan saya menyediakan jalur yang benar.
Umar Farooq Khawaja
@UmarFarooqKhawaja Lihatlah FAQ untuk penjelajah droid. Tanya Jawab terakhir membahas masalah Anda.
Ryan Conrad
OK, sudah mengekstrak folder 'com.app.name' yang relevan dari tar, tetapi bagaimana cara menggunakannya untuk mengembalikan data aplikasi? Cukup menyalin folder ke sdcard / Android / data / sepertinya tidak berfungsi ...
pelms
91

Atau dengan one-liner:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -
Kari
sumber
2
Bagus! Apakah Anda juga memiliki yang setara dengan "paket" (untuk mengambil pohon direktori terkompresi dan membuat file .db)?
dailyglen
4
Bisakah Anda menambahkan penjelasan pada jawabannya.?
Lucky
2
INI adalah jawaban terbaik: D Bekerja dengan sangat baik! Mengekstrak sekarang.
xdevs23
16
Penjelasan: penulis membuat header file Zlib standar untuk .tar.gzfile dengan printfperintah ( 0x1F 0x8Btanda tangan, 0x08adalah metode kompresi, 0x00adalah flag dan 4 x 0x00adalah timestamp), kemudian menambahkan header ini isi backup.abfile, mulai dari offset 25d. Aliran tersebut adalah .tar.gzfile yang valid , dan tar xfvzperintah mengenalinya, sehingga dapat berhasil mengompres aliran.
antonone
3
Saya membuat cadangan dengan adb 1.0.36 (Revisi 1.7.0.0 + r33-2) dan metode ini menghasilkan kesalahan dari zgip:invalid compressed data--format violated
Rache
31

Satu opsi lagi adalah menggunakan bash, catdan gunzip( gzip).

Proses lengkapnya bisa seperti ini ( dengan cadangan yang tidak terenkripsi ):

  1. buat cadangan data satu aplikasi (misalnya " Override DNS for KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. ekstrak data yang dikompresi

    $ 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. dekompresi data yang dikompresi

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

    $ tar xf decompressed-data.tar
    
MaxChinni
sumber
4
Apakah "akhir file yang tidak terduga" diharapkan?
hft
Ekstraksi di 2 secara mengejutkan bekerja pada file yang dienkripsi. Bagaimana ini mungkin? Dekompresi kemudian gagal dengan gzip: stdin: invalid compressed data--format violated. Saya menganggap ekstraksi berhasil, sebagai ddlaporan 22763821+0 records in 22763821+0 records out.
Tom Russell
4

Opsi lain adalah menggunakan Perl AdbBackupRoutines dari utas XDA ini . Mereka memiliki beberapa persyaratan, meskipun: Perl jelas, plus libterm-readkey-perl, libcrypt-cbc-perldan libcrypt-pbkdf2-perl(jika cadangan Anda tidak terenkripsi, Anda dapat melewati ketergantungan terakhir dengan hanya mengomentari baris 103 di backupdecrypt.plmana itu termasuk - bekerja dengan baik untuk saya).

Penggunaannya cukup mudah:

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

File yang dihasilkan .tarkemudian dapat diselidiki seperti tarball lainnya. Strukturnya cukup menarik dalam setidaknya satu aspek: tidak mencerminkan jalur sebenarnya tempat file diambil (misalnya tidak /data/data/com.app.name/databases/whatever.db, tetapi sebaliknya apps/com.app.name/db/whatever.db) - yang menunjukkan aplikasi yang dicadangkan pada satu perangkat / ROM mungkin dikembalikan ke perangkat / ROM lain apa pun tanpa masalah, karena adb restoreharus mengetahui jalur sebenarnya sendiri.

Izzy
sumber
Ada alat lain (sedikit lebih baik dirawat) yang melakukan ini: github.com/nelenkov/android-backup-extractor
tutup
Terima kasih, @ lid! Saya juga menyertakan sedikit shell-script (hampir satu-liner saja) dengan alat saya Adebar (Android DEvice Backup And Report), yang mengubah backup ADB ( .ab) ke .tar.gzArchives :)
Izzy
4

Berdasarkan informasi oleh orang lain, sekarang saya tahu bahwa file cadangan hanyalah aliran Deflated (GZip) yang diawali, berdasarkan informasi ini program sederhana ini dapat membongkar untuk Anda:

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

Saya menulis ini karena saya tidak memiliki alat Unix yang disebutkan di atas, dan itu lebih mudah daripada menginstal Cygwin atau alat lainnya.

Keuntungan :

  • lintas platform
  • sederhana (tidak ada parameter esoterik)
  • tidak perlu alat perpipaan

Kekurangan :

  • memerlukan JDK (yang kemungkinan besar sudah Anda miliki karena Anda mengacaukan Android SDK)
  • tidak ada dukungan untuk cadangan terenkripsi
  • butuh sesuatu untuk mengekstrak file tar yang dihasilkan (saya menggunakan Total Commander)

Untuk membuatnya menjadi alat baris perintah buat unab.batdengan konten: java -cp "%~dp0." unab %*dan direktori untuk PATH.

TWiStErRob
sumber
4

Seperti pertanyaan tersirat juga, bagaimana mengembalikan data aplikasi tunggal, saya ingin menyebutkan skrip bagus ini, yang membagi cadangan-penuh penuh.ab dalam file-file app.ab tunggal:

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

Ini membutuhkan file jar: abe.jar dan tar-bin-split.jar yang dapat ditemukan di sini:

Paling tidak itu berfungsi untuk testcase saya.

joe_zeroh
sumber