“adb 백업”을 통해 만들어진 전체 백업에서 앱 데이터를 어떻게 추출합니까? 7을 백업했습니다.

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

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



답변

다른 사람들을 참조하기 위해 .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 ( 여기에서 사용 가능 )을 사용하면 탐색기에서 바로이 작업을 수행 할 수 있습니다. 내 블로그 의 기능에 대해 자세히 읽을 수 있습니다 (예, 뻔뻔한 플러그입니다. 질문에 맞을 때 그렇게합니다)


답변

또는 하나의 라이너로 :

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

답변

또 다른 옵션은 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
    

답변

또 다른 옵션은 이 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 .


답변

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


답변

암시 적 질문은 단일 앱 데이터를 복원하는 방법이므로 주어진 full-backup.ab를 single-app.ab 파일로 분할하는이 멋진 스크립트를 언급하고 싶습니다.

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

여기에있는 jar 파일 : abe.jar 및 tar-bin-split.jar이 필요합니다.

적어도 내 테스트 케이스에서 작동했습니다.