"adb 백업"을 통해 만들어진 전체 백업에서 앱 데이터를 어떻게 추출합니까?


117

adb backup모든 파일을 암호화 된 백업으로 백업하기 위해 Nexus 7을 백업했습니다. 를 사용하여 백업에서 복원 할 수 adb restore있지만 기기의 기존 데이터가 모두 지워지는 것을 확인했습니다.

이 암호화 된 백업 파일에서 하나의 앱 데이터를 정확히 어떻게 추출합니까?


답변:


113

다른 사람들을 참조하기 위해 .ab 파일 형식에 대한 배경 지식이 있습니다.

Android 백업 (* .ab) 파일은 압축 된 TAR 파일입니다. DEFLATE 알고리즘을 사용하여 압축됩니다 . 그 외에도 AES 암호화가 사용될 수 있습니다 . 이것은 백업을 만들 때 결정되며 암호를 입력하면 백업이 암호화됩니다. 암호화가 없으며 압축 만됩니다.

파일의 HEADER는 일반 DEFLATE 아카이브와 약간 다릅니다. 백업에 대한 정보가 포함되어 있으며 다음과 같습니다.

ANDROID BACKUP
1
1
none

첫 번째 줄은 "Magic"줄 입니다. 다음 줄은 Android Backup 파일 형식의 버전입니다. 다음 줄은 파일이 압축되었는지 여부를 나타내는 부울 (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 ( 여기에서 사용 가능 )을 사용하면 탐색기에서 바로이 작업을 수행 할 수 있습니다. 내 블로그 의 기능에 대해 자세히 읽을 수 있습니다 (예, 뻔뻔한 플러그입니다. 질문에 맞을 때 그렇게합니다)

짐 등에서 꺼내다


1
내가 평판이 있다면 나는 당신에게 투표하고 싶습니다.

천만에요. 최근에 Droid Explorer 코드베이스에 추가 한 기능이기 때문에 모든 정보 만 알고 있으므로 이에 대한 조사가 필요했습니다.
Ryan Conrad

안녕하세요 Ryan, Droid Explorer를 사용하려고했지만 Android SDK 위치가 설치되어 있고 올바른 경로를 제공하고 있는데도 Android SDK 위치에 대한 불평을 시작하지 못했습니다.
Umar Farooq Khawaja

@UmarFarooqKhawaja 드로이드 탐색기 에 대한 FAQ 를 살펴보십시오 . 마지막 Q / A가 문제를 해결합니다.
Ryan Conrad

좋아, tar에서 관련 'com.app.name'폴더를 추출했지만 앱 데이터를 복원하는 데 어떻게 사용합니까? sdcard / Android / data /에 폴더를 복사하는 것만으로는 작동하지 않는 것 같습니다.
pelms

91

또는 하나의 라이너로 :

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

2
좋은! 압축되지 않은 디렉토리 트리를 가져 와서 .db 파일을 작성하기 위해 "pack"과 동등한 기능이 있습니까?
dailyglen

4
답변에 설명을 추가해 주시겠습니까?
Lucky

2
이것이 가장 좋은 답변입니다 : D는 완벽하게 작동합니다! 지금 추출 중입니다.
xdevs23

16
설명 : author .tar.gzprintf명령 을 사용하여 파일에 대한 표준 Zlib 파일 헤더를 작성합니다 ( 0x1F 0x8B서명, 0x08압축 방법, 0x00플래그 및 4 x 시간 0x00소인).이 헤더에 backup.ab오프셋 25d부터 파일 의 내용을 추가합니다 . 이러한 스트림은 유효한 .tar.gz파일이며 tar xfvz명령은 해당 파일을 인식하므로 스트림을 압축 해제 할 수 있습니다.
antonone

3
adb 1.0.36 (Revision 1.7.0.0 + r33-2)으로 백업했으며이 방법으로 zgip에서 오류가 발생했습니다.invalid compressed data--format violated
Rache

31

또 다른 옵션은 bash, catgunzip( gzip) 을 사용하는 것 입니다.

전체 프로세스는 다음과 같습니다 ( 암호화되지 않은 백업 사용 ).

  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 violated. dd보고서 로 추출이 성공 했다고 가정 합니다 22763821+0 records in 22763821+0 records out.
Tom Russell

4

또 다른 옵션은 이 XDA 스레드 에서 Perl AdbBackupRoutines를 사용하는 것 입니다. 분명히 펄 플러스 : 그들은하지만, 몇 가지 요구 사항이 libterm-readkey-perl, libcrypt-cbc-perl그리고 libcrypt-pbkdf2-perl(백업이 암호화되지 않은 경우, 당신은 단순히 라인 (103) 주석에 의해 마지막 의존성을 건너 뛸 수 있습니다 backupdecrypt.pl- 나를 위해 잘 작동이 포함 어디를).

사용법은 매우 쉽습니다.

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

결과 .tar파일은 다른 tarball과 같이 조사 될 수 있습니다. 그것의 구조는 적어도 하나의 측면에서 매우 흥미 롭습니다 : 그것은 파일을 가져온 실제 경로를 반영하지 않습니다 (예 : 아닌 /data/data/com.app.name/databases/whatever.db, 대신 apps/com.app.name/db/whatever.db)-이것은 하나의 장치 / ROM에 백업 된 앱 이 다음 으로 복원 수 있음을 나타냅니다 adb restore실제 경로 자체를 파악해야하므로 문제없이 다른 장치 / ROM .


:이 수행 (유지 조금 더 나은) 다른 도구있다 github.com/nelenkov/android-backup-extractor
뚜껑

감사합니다, @lid! 나는 또한 내 도구를 사용하여 작은 쉘 스크립트 (거의 한 줄 만) 포함 시켰습니다 Adebar (ADB 백업을 변환 (안드로이드 장치 백업 및 보고서) .ab에) .tar.gz: 아카이브
이지

4

다른 사람들의 정보를 바탕으로 이제 백업 파일이 접두사 Deflated (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.batcontents : 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.