Làm thế nào để bạn trích xuất dữ liệu của một ứng dụng từ một bản sao lưu đầy đủ được thực hiện thông qua sao lưu Adb của Adb?


117

Tôi đã sao lưu Nexus 7 của mình adb backupđể sao lưu tất cả các tệp vào bản sao lưu được mã hóa. Tôi thấy rằng bạn có thể khôi phục từ bản sao lưu với adb restore, nhưng điều đó sẽ xóa sạch tất cả dữ liệu hiện có của tôi trên thiết bị.

Làm thế nào chính xác tôi sẽ trích xuất dữ liệu của một Ứng dụng từ tệp sao lưu được mã hóa này?


Câu trả lời:


113

Chỉ để tham khảo của người khác, đây là một số nền tảng về định dạng tệp .ab.

Tệp sao lưu Android (* .ab) là tệp TAR được nén . Nó được nén bằng thuật toán DEFLATE . Trên hết, có thể sử dụng mã hóa AES . Điều này được xác định khi bạn tạo bản sao lưu, nếu bạn nhập mật khẩu thì bản sao lưu được mã hóa, nếu không; không có mã hóa, nó chỉ được nén.

Đầu trang của tệp khác một chút so với tệp lưu trữ DEFLATE bình thường. Nó chứa thông tin về bản sao lưu và trông như sau:

ANDROID BACKUP
1
1
none

Dòng đầu tiên là dòng "Magic" . Dòng tiếp theo là phiên bản của định dạng tệp Sao lưu Android. Dòng tiếp theo là boolean (đúng hoặc sai, 1 hoặc 0) cho biết nếu tệp được nén. Dòng cuối cùng là loại mã hóa. Ví dụ này không sử dụng bất kỳ mã hóa nào. Nếu có mật khẩu, dòng sẽ đọc "AES-256". Sau đó là mật mã mã hóa. Nếu không có mật khẩu, thì "kho lưu trữ" DEFLATE bắt đầu.

Nó được nén bằng cách sử dụng Java Deflater . Điều này, từ góc độ nhà phát triển, gây ra vấn đề nếu bạn muốn sử dụng bất cứ thứ gì ngoài Java để giải nén nó. Tôi đã không thể tìm thấy bất cứ thứ gì có thể xua tan nó bằng cùng một thuật toán, mặc dù tất cả những gì tôi đã tìm thấy (ví dụ như C #) được cho là tuân theo "ĐẶC BIỆT".

Như đã nói, có một dự án nguồn mở theo giấy phép Apache 2.0, được viết bởi Nikolay Elenkov , cho phép bạn trích xuất .ab vào một tệp tar.

Sử dụng:

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

Nếu bạn không chắc chắn làm thế nào để thực sự sử dụng nó (nằm ngoài phạm vi của câu trả lời này), phiên bản tiếp theo của Droid Explorer v0.8.8.7 ( có sẵn ở đây ) sẽ cho phép bạn thực hiện chính xác điều này và hơn thế nữa, ngay từ Explorer. Bạn có thể đọc thêm về các tính năng trên blog của tôi (vâng, tôi biết, phích cắm không biết xấu hổ. Tôi làm điều đó khi nó phù hợp với câu hỏi)

giải nén


1
Tôi sẽ bỏ phiếu cho bạn nếu tôi có danh tiếng, người đàn ông của tôi cảm ơn!

chào mừng bạn Tôi chỉ biết tất cả thông tin đó vì đây là một tính năng mà tôi mới thêm vào cơ sở mã Droid Explorer, vì vậy tôi đã phải thực hiện một số nghiên cứu về nó.
Ryan Conrad

Xin chào Ryan, đã thử sử dụng Droid Explorer nhưng không thể bắt đầu phàn nàn về vị trí SDK Android, mặc dù nó đã được cài đặt và tôi đang cung cấp đúng đường dẫn.
Umar Farooq Khawaja

@UmarFarooqKhawaja Hãy xem FAQ cho droid explorer. Q / A cuối cùng giải quyết vấn đề của bạn.
Ryan Conrad

OK, đã trích xuất thư mục 'com.app.name' có liên quan từ tar nhưng làm cách nào để sử dụng nó để khôi phục dữ liệu ứng dụng? Chỉ cần sao chép thư mục vào sdcard / Android / data / dường như không hoạt động ...
pelms

91

Hoặc với một lớp lót:

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

2
Đẹp! Bạn cũng có tương đương với "pack" (để lấy cây thư mục không nén và tạo tệp .db)?
Dailyglen

4
Bạn có thể thêm một lời giải thích cho câu trả lời.?
May mắn

2
Đây là câu trả lời tốt nhất: D Hoạt động hoàn toàn tốt! Trích xuất ngay.
xdevs23

16
Giải thích: tác giả tạo một tiêu đề tệp Zlib tiêu chuẩn cho một .tar.gztệp có printflệnh ( 0x1F 0x8Blà chữ ký, 0x08là phương thức nén, 0x00là cờ và 4 x 0x00là dấu thời gian), sau đó thêm vào tiêu đề này nội dung của backup.abtệp, bắt đầu từ offset 25d. Luồng như vậy là một .tar.gztệp hợp lệ và tar xfvzlệnh nhận ra nó là như vậy, vì vậy nó có thể giải nén thành công luồng.
antonone

3
Tôi đã tạo bản sao lưu với adb 1.0.36 (Phiên bản 1.7.0.0 + r33-2) và phương pháp này tạo ra lỗi từ zgip:invalid compressed data--format violated
Rache

31

Một lựa chọn hơn là sử dụng bash, catgunzip( gzip).

Toàn bộ quá trình có thể là điều này ( với một bản sao lưu không được mã hóa ):

  1. sao lưu dữ liệu của một ứng dụng (ví dụ: " Ghi đè DNS cho KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. trích xuất dữ liệu nén

    $ 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. giải nén dữ liệu nén

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

    $ tar xf decompressed-data.tar
    

4
Là "kết thúc bất ngờ của tập tin" được mong đợi?
hft

Việc trích xuất trong 2 bất ngờ làm việc trên một tập tin được mã hóa. Sao có thể như thế được? Việc giải nén sau đó thất bại với gzip: stdin: invalid compressed data--format violated. Tôi giả sử việc trích xuất đã thành công, như ddcác báo cáo 22763821+0 records in 22763821+0 records out.
Tom Russell

4

Một tùy chọn khác là sử dụng Perl AdbBackupRoutines từ luồng XDA này . Mặc dù vậy, họ có một vài yêu cầu: Perl rõ ràng, cộng với libterm-readkey-perl, libcrypt-cbc-perllibcrypt-pbkdf2-perl(nếu các bản sao lưu của bạn không được mã hóa, bạn có thể bỏ qua sự phụ thuộc cuối cùng bằng cách bình luận ra dòng 103 trong backupdecrypt.plđó bao gồm - hoạt động tốt với tôi).

Cách sử dụng khá dễ dàng:

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

Các .tartập tin kết quả sau đó có thể được điều tra như bất kỳ tarball khác. Cấu trúc của nó khá thú vị ở ít nhất một khía cạnh: nó không phản ánh các đường dẫn thực sự nơi các tệp được lấy từ (ví dụ là không /data/data/com.app.name/databases/whatever.db, nhưng thay vào đó apps/com.app.name/db/whatever.db) - cho biết ứng dụng được sao lưu trên một thiết bị / ROM có thể được khôi phục bất kỳ thiết bị / ROM nào khác mà không gặp sự cố, như adb restorephải tự tìm ra đường dẫn thực.


Có một công cụ khác (được duy trì tốt hơn một chút) thực hiện điều này: github.com/nelenkov/android-backup-extractor
nắp

Cảm ơn, @lid! Tôi cũng bao gồm một ít vỏ kịch bản (gần như một lớp lót chỉ) với công cụ của tôi Adebar (thiết bị Android Sao lưu và báo cáo), chuyển đổi sao lưu ADB ( .ab) để .tar.gzArchives :)
Izzy

4

Dựa trên thông tin của những người khác, bây giờ tôi biết rằng tệp sao lưu chỉ là một luồng Deflated (GZip) có tiền tố, dựa trên thông tin này, chương trình đơn giản này có thể giải nén nó cho bạn:

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

Tôi đã viết điều này bởi vì tôi không có bất kỳ công cụ Unix nào được đề cập ở trên và nó dễ hơn cài đặt Cygwin hoặc các công cụ khác.

Ưu điểm :

  • đa nền tảng
  • đơn giản (không có tham số bí truyền)
  • không cần dụng cụ đường ống

Nhược điểm :

  • cần một JDK (mà bạn có thể đã có vì bạn đang làm phiền với SDK Android)
  • không hỗ trợ sao lưu mã hóa
  • cần một cái gì đó để giải nén tập tin tar kết quả (tôi sử dụng Total Commander)

Để làm cho nó một công cụ dòng lệnh tạo unab.batvới nội dung: java -cp "%~dp0." unab %*và thư mục đến PATH.


4

Vì câu hỏi ngầm cũng là, làm thế nào để khôi phục dữ liệu ứng dụng đơn lẻ, tôi muốn đề cập đến tập lệnh tiện lợi này, phân tách một tệp full-backup.ab đã cho trong các tệp đơn app.ab:

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

Nó yêu cầu các tệp jar: abe.jar và tar-bin-split.jar có thể tìm thấy ở đây:

Nó làm việc ít nhất cho testcase của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.