您如何从通过“ adb备份”进行的完整备份中提取应用程序的数据?


Answers:


113

仅供参考,以下是.ab文件格式的一些背景知识。

Android备份(* .ab)文件是压缩的TAR文件。使用DEFLATE算法对其进行压缩。最重要的是,可以使用AES加密。这是在创建备份时确定的,如果输入密码,则备份将被加密,否则;没有加密,只有压缩。

文件的HEADER与普通的DEFLATE存档略有不同。它包含有关备份的信息,如下所示:

ANDROID BACKUP
1
1
none

第一行是“魔术”行。下一行是Android备份文件格式的版本。下一行是布尔值(true或false,1或0),指示文件是否已压缩。最后一行是加密类型。本示例未使用任何加密。如果有密码,该行将显示为“ AES-256”。之后是加密密码。如果没有密码,则开始DEFLATE“归档”。

它使用Java Deflater压缩。从开发人员的角度来看,如果您想使用Java以外的任何方式来提取它,则会导致问题。即使我发现的所有内容(例如C#)都应该遵循“ SPEC”,也无法使用相同的算法找到任何可以缩小它的内容。

话虽如此,有一个由Apache Nikolay Elenkov编写的Apache 2.0许可下的开源项目,它允许您将.ab提取到tar文件中。

用法:

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

如果您不确定如何真正使用它(超出了此答案的范围),则下一版Droid Explorer v0.8.8.7(在此处可用)将使您可以直接从Explorer执行此操作,以及执行更多操作。您可以在我的博客上阅读有关功能的更多信息(是的,我知道,无耻的插件。我会在适合问题时这样做)

打开包装


1
如果我有声誉,我会投票给你,我的上帝,谢谢!

别客气。我只知道所有这些信息,因为这是我最近添加到Droid Explorer代码库中的一项功能,因此我必须对此进行一些研究。
瑞安·康拉德

嗨,瑞安(Ryan),尝试使用Droid Explorer,但即使安装了Android SDK,并且我提供的路径正确,它也开始抱怨Android SDK的位置。
Umar Farooq Khawaja 2014年

@UmarFarooqKhawaja看看droid资源管理器的常见问题解答。最后一个问题解答解决了您的问题。
莱恩·康拉德

好的,已经从tar中提取了相关的'com.app.name'文件夹,但是如何使用该文件夹还原应用程序数据?只是将文件夹复制到sdcard / Android / data /似乎不起作用...
pelms

90

或单线:

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

2
真好!您是否也具有“ pack”的等同功能(以获取未压缩的目录树并创建一个.db文件)?
2015年

4
您能在答案中添加解释吗?
2015年

2
这是最好的答案:D可以很好地工作!立即提取。
xdevs23 '16

16
说明:作者.tar.gz使用printf命令(0x1F 0x8B是签名,0x08压缩方法,0x00标志和4x 0x00是时间戳)为命令创建文件的标准Zlib文件头,然后将backup.ab文件内容附加到此头,从偏移25d开始。这样的流是有效.tar.gz文件,并且tar xfvz命令可以将其识别为有效文件,因此它可以成功解压缩该流。
antonone

3
我使用adb 1.0.36(修订版1.7.0.0 + r33-2)进行了备份,该方法从zgip中产生了错误:invalid compressed data--format violated
Rache

31

还有一个选择是使用bashcatgunzipgzip)。

整个过程可能是这样的(使用未加密的备份):

  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文件

    $ tar xf decompressed-data.tar
    

4
是否可以预期“文件意外结束”?
hft 2016年

2中的提取出人意料地对加密文件起作用。这怎么可能?然后解压缩失败,并显示gzip: stdin: invalid compressed data--format violated。我认为提取成功,如dd报告所示22763821+0 records in 22763821+0 records out
汤姆·罗素

4

另一个选择是使用此XDA线程中的Perl AdbBackupRoutines 。但是,它们有一些要求:Perl加上libterm-readkey-perllibcrypt-cbc-perllibcrypt-pbkdf2-perl(如果您的备份未加密,则可以通过简单地注释掉backupdecrypt.pl其中包含的行103来跳过最后一个依赖项-对我来说很好用)。

用法很简单:

./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 可能恢复到任何其他设备/ ROM都不会遇到麻烦,因为adb restore必须弄清楚实际路径本身。


还有另一个工具(维护得更好一点)可以做到这一点:github.com/nelenkov/android-backup-extractor
lid

谢谢,@ lid!我的工具Adebar(Android DEvice备份和报告)中还包含了一个小的shell脚本(几乎只有一个脚本),该脚本将ADB备份(.ab)转换为.tar.gzArchives :)
Izzy

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.bat内容为:java -cp "%~dp0." unab %*的目录为PATH


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.