답변:
다른 사람들을 참조하기 위해 .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 -
.tar.gz
는 printf
명령 을 사용하여 파일에 대한 표준 Zlib 파일 헤더를 작성합니다 ( 0x1F 0x8B
서명, 0x08
압축 방법, 0x00
플래그 및 4 x 시간 0x00
소인).이 헤더에 backup.ab
오프셋 25d부터 파일 의 내용을 추가합니다 . 이러한 스트림은 유효한 .tar.gz
파일이며 tar xfvz
명령은 해당 파일을 인식하므로 스트림을 압축 해제 할 수 있습니다.
invalid compressed data--format violated
또 다른 옵션은 bash
, cat
및 gunzip
( gzip
) 을 사용하는 것 입니다.
전체 프로세스는 다음과 같습니다 ( 암호화되지 않은 백업 사용 ).
하나의 앱 데이터 백업 (예 : " 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를 사용하는 것 입니다. 분명히 펄 플러스 : 그들은하지만, 몇 가지 요구 사항이 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 또는 다른 도구를 설치하는 것보다 쉽습니다.
장점 :
단점 :
명령 행 도구로 만들려면 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이 필요합니다.
적어도 내 테스트 케이스에서 작동했습니다.