Adb备份无法使用。

42

我需要你们的帮助,因为我不知道我在adb备份方面做错了什么。

我想要在未root的情况下备份我的三星Galaxy S3 LTE(GT-I9305)。我谷歌了一下,找到了用SDK Manager进行完整Android备份的方法。我安装了所有必要的组件,如Java开发工具包8版本66(JDK 8u66 x64)和包含SDK Manager的Android Studio。然后他们说我应该下载Google USB驱动程序。我已经下载了它,但没有反应。我以为现在应该可以工作了,然后我去了C:\ Users \ MYNAME \ AppData \ Local \ Android \ sdk \ platform-tools,并在按住Shift 的同时左键单击adb。然后我点击“此处打开命令窗口”。在此之后,我输入“adb devices”,它显示:

设备列表

3204cfaaf8611199 设备

然后我输入:

adb backup -apk -shared -all -f C:\Users\NAME\backup.ab

它说:

现在请解锁您的设备并确认备份操作。

我按照提示操作后,我的智能手机打开了“完整备份”页面,然后我设置了一个备份密码。但我并不需要密码,只是点击了“备份我的数据”按钮。接着,屏幕上弹出了一个“开始备份……”的提示信息,紧接着就显示“备份完成”,并创建了一个大小为40字节的备份文件。我现在不知道该怎么办。


1
在某些设备上,备份应用程序甚至无法启动 - adb命令只是完成而没有错误,并且屏幕上也没有消息。 请参见@NG的答案(使用引号)。 - trs
此命令立即退出,在我的7.1.1设备上留下一个空的备份。 - Tom Russell
2
提醒不熟悉的用户:一定要指定“-f”参数。否则,命令将“成功”生成一个0字节的文件输出,而不是正确命名为“backup.ab”。这似乎几乎是故意设计来挫败新用户的。也许Google更希望我们备份到它漂亮的云端,在那里可以对其进行分析? - Tom Russell
7个回答

55

与其试图找到旧版本的adb,不如将引号添加到adb backup的参数中更容易:

adb backup "-apk -shared -all -f C:\Users\NAME\backup.ab"

2
非常出色,正中要害!然而,我必须补充一点,与原帖的问题相反,我的智能手机从未显示过完整备份应用程序,但ADB始终给出相同的结果。 - Charles Roberto Canato
3
您需要使用双引号来执行以下命令:adb backup "-apk -shared -all -f C:\Users\NAME\backup.ab"。请注意,翻译时不得更改原始意思,但需要使语言更加通俗易懂。 - JMRouet
@JMRouet 谢谢 - 在 Mac 上单引号可以正常工作。听起来你需要在 Windows 上使用双引号。 - NG.
4
这个建议在2017年5月的ADB v 1.0.39版本中不起作用。 - Paul
2
这对我有效,但没有解释为什么...(这是一个错误吗?如果是,为什么这个解决方法有效?) - Gert van den Berg
显示剩余3条评论

18

正确调用adb的命令行应该是这样的:

adb backup "-apk -obb -shared -all -system" -f phone-20180522-120000.adb

这行代码适用于Linux,但对于Windows和OS-X也应该有效。对于Linux(可能也适用于OS-X),您可以使用以下脚本自动为文件分配时间戳:

adb backup "-apk -obb -shared -all -system" -f "${PHONE:-phone}-`date +%Y%m%d-%H%M%S`.adb`"

Important After doing a backup, verify your data! At my side, sometimes some corruption of the file shows up (and I doubt it is my computer, as I only observe such errors with adb).

Here is a check instruction I use:

set -o pipefail
for a in *.adb;
do
  echo "$a";
  dd if="$a" bs=24 skip=1 | zlib-flate -uncompress | tar tf - >/dev/null;
  echo "ret=$?";
done

It should show ret=0, but it doen't.

  • If you see inflate: data: invalid code lengths set your archive is corrupted and - very likely - unusable for restore!
  • If you see tar: Unexpected EOF in archive your backup probably is usable (all backups end this way, I do not know why).
  • Even if you see just ret=0 there might be undiscovered errors which still prevent a restore.
  • There is definitively missing an adb verify command, to verify correctness of a backup!

注意

我发布此更新,因为所有其他答案都很有帮助,但是没有详细到最后一个细节。(当与完整引用一起使用时,备份会被执行,但称为backup.ab)

这是我的环境:

  • 操作系统:Ubuntu 16.04
  • 手机:Android 7.0
  • ADB:1.0.32

完整的步骤是(以防有人不知道需要什么):

  • 第零步:安装adb(在Ubuntu上:sudo apt-get install android-tools-adb
  • 第一步:在手机上启用USB调试模式
  • 第二步:使用USB数据线将手机连接到计算机的USB端口(仅充电的数据线不足够)
  • 请注意,Ubuntu Phone Manager可能会出现并要求您输入手机的PIN码。如果发生这种情况,您不需要它,请关闭它。
  • 第三步:运行adb devices - 您应该看到类似XXXXXXXXXXXX未经授权的内容
  • 过一段时间后,您的手机会显示一个消息,询问是否允许USB调试权限
    • 只允许一次。出于安全考虑,您不应自动信任计算机,因为指纹可以很容易地被伪造。
    • 请注意,如果某个辅助功能按钮阻挡了此确认窗口的单个像素(例如),则无法点击OK。请先移动遮挡窗口。
  • 第四步:现在再次运行adb devices - 您应该看到类似XXXXXXXXXXXX设备的内容
    • 如果出现多行,则表示您将多个手机连接到计算机上。简单的方法是拔掉您不想备份的所有手机。(复杂的方法是设置环境变量ANDROID_SERIAL=XXXXXXXXXXXX

现在按照上面所示运行adb backup。将文件更改为您的需求。

  • 这将弹出一个窗口,询问备份权限。
  • 在备份进行时不要关闭备份窗口。当我试过这样做时,备份停止了,生成的存档文件也损坏了。
  • 你可以设置密码来加密备份。我没有任何关于密码安全性的信息。但很可能,如果你忘记了这个密码,你不能恢复备份。
  • 我不知道如何将这样的备份还原到其他手机上。我甚至从未尝试过还原,所以在这方面我无法提供帮助。

注:

  • adb help 显示所有可能的选项到 adb backup
  • 在备份之前关闭您手机上的所有应用程序。我不知道这是否需要,但它肯定不会有害。
  • 备份期间请勿操作手机。我不知道这是否需要,但它肯定不会有害。
  • 请不要心急。留给备份足够的时间。在我的设备上,我看到每分钟大约进度为100MB(YMMV)。因此,备份我手机的需要大约半个小时(2.5 GB)。

显然 adb backup 并不能完全备份所有内容!

我查看了备份文件 (cd X && dd if=../XXXX.adb bs=24 skip=1 | zlib-flate -uncompress | tar xf -),但未找到所有已安装的应用程序。

我能够找到的是(请注意,这个列表不完整):

  • 内部模拟SD卡:shared/0
  • 外部SD卡:shared/1
  • 应用程序:apps/ - 许多应用程序(如Google Authenticator)都不见了
  • 日历:apps/com.android.providers.calendar/db/calendar.db(可能)

我找不到的内容(请注意,此列表不完整):

  • 闹钟。(我可能无法检测到正确的应用程序)
  • 完整的外部SD卡(此卡上有比下面显示的share/1更多内容。例如已移至SD卡的应用程序。)

结论:

  • 有时adb备份可能会创建损坏的备份,这可能不会被注意到。因此,请检查您的备份或频繁备份,并假装足够幸运,以便并非所有备份都出现故障。
  • 使用adb备份可以备份大多数重要数据,如相机图像等。但是,解压缩可能有点困难。
  • adb备份不足以完全备份手机。
  • adb备份不足以备份您的SD卡,以便如果它损坏,您可以用新的SD卡替换它并恢复其内容。这非常令人难过!

附注:笔误“Forth”不是偶然的。

提醒:在Ubuntu 18.04中,可在qpdf软件包中找到zlib-flate


我刚刚输入了您的命令,在尝试其他方法数小时后,备份终于开始了! - Tom Russell
tar -xf <backup.tar> 报告“这似乎不是一个有效的归档文件”。现在,如何才能成功提取并产生无效的 tar 文件呢?这不奇怪吗? - Tom Russell
2
@TomRussell 请尝试使用以下命令:dd if=backup.tar bs=24 skip=1 | zlib-flate -uncompress | tar xf -。您可以在 qpdf 包(Ubuntu 18.04)中找到 zlib-flate 工具。我已相应地编辑了我的答案。 - Tino
谢谢。如果不知道安装qpdf,我就找不到在openSuse中的flate。当我运行您的命令时,会得到以下结果:“flate: inflate: data: incorrect header check. tar: This does not look like a tar archive. Exiting...” - Tom Russell
顺便说一下,我刚试用了adb-sync。我认为它以最美丽难懂的方式运行失败了! - Tom Russell

6

我刚刚在运行Android 6.0.1的Galaxy SM-G900V上使用Ubuntu 15.10 ("wily")成功备份了设备。安装命令如下:

sudo apt-get install android-tools-adb

然后,我从命令行中运行以下命令(没有使用'sudo'):

adb backup -apk -shared -all -f backup.adb

备份结果:

user@hostname:~/droid$ ls -lah
total 1.2GB
drwxrwxr-x  2 user user 4.0BK Mar  6 18:43 .
drwxr-xr-x 52 user user 4.0KB Mar  6 17:40 ..
-rw-r-----  1 user user 1.2GB Mar  6 18:29 backup.ab

感谢NG,我开始以为我的手机坏了。
忘记说了:运行adb版本:Android 调试桥版本1.0.31。

1
详细说明Linux答案。'sudo apt-get install adb'可行。上面的-f标志需要存在(-f <filename>.adb)。以及至少一个指定要备份的标志。如果没有,您将看到错误:分段错误。 - kaicarno
kaicarno:只缺少-f标志的备份“成功”,但结果是0字节。因此,本质上是静默失败,甚至生成一个名为“backup.ab”的输出文件,这有点令人困惑。 - Tom Russell

5

我正在使用__1.0.32__,但问题仍然存在。 - Anwar
3
让我更好地解释一下。如果你的设备的adb版本早于1.0.31,那么你必须在电脑上使用1.0.31版本的adb。而adb 1.0.32+ 的版本破坏了向后兼容性。 - Alan CN
更新到最新版本的adb对我来说起作用了。不需要引号。 - MagTun
我尝试备份几个应用程序,但遇到了同样的问题,在我的 Arch Linux 机器上只得到了 40 字节的文件。版本 1.0.31 对我有用,参见 https://docs.j7k6.org/android-adb-backup-41-bytes-549-bytes-bug-fix/。 - Jeinzi
我只需要这个答案,它告诉我为什么正常操作不起作用。谢谢。 - Ender

5

2

如果还有人遇到困难 - 在Windows中,我发现只在目录周围加上引号是有效的,例如"C:\Users\NAME\backup.ab"。


0
我找到了这个解决方案:
adb backup -apk -shared -all -f "<备份文件存储路径>.ab"

还原备份的命令如下:
adb restore "<备份文件路径>.ab"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接