问题:

每次我运行ADB备份时,都会在主屏幕底部附近显示一条消息Backup starting...,几秒钟后出现一条消息Backup finished,尽管事实上我正在使用17 GB的设备内存,并且创建的备份文件的大小为0字节。我没有收到任何错误消息,也没有任何反馈,表明什么地方有问题,更不用说什么地方有问题了。它似乎可以正常运行,但是速度太快,并且备份文件为空。

过程:



我确认该设备是由ADB使用adb devices命令识别,并收到以下输出:

我在命令提示符处收到以下消息:

List of devices attached
8e1f368a        device


...以及电话上的以下提示符:



我在这里所做的操作没有任何区别(详细说明)。

我点击“备份数据”按钮(右下角)。 br />电话返回主屏幕并显示Backup starting...消息,然后几秒钟后显示Backup finished消息。将创建一个0字节的文件,命名为默认backup.ab或使用-f开关指定的名称。

ADB备份命令(在步骤2中使用):

我尝试了多种选项组合,从简单到

Now unlock your device and confirm the backup operation.


到类似

adb backup -all


我在阅读完本节后也尝试添加-nosystem开关,这表明试图在无根设备上包括系统备份可能会导致文件大小为0字节,因此必须使用此开关。没关系,该过程仍在几秒钟内完成,我仍然得到一个0字节的文件。

“完全备份”密码提示(步骤3):

我很确定我之前从未设置过备用密码。我以前从来没有机会以任何方式设置此密码或访问此设置。但是,我尝试了以下所有操作:


将两个密码都保留为空白
将“当前备份密码”保留为空白并在第二个框中输入新密码
输入当前的屏幕锁定PIN码以及我过去曾经用作“当前备份密码”的所有PIN码。
输入我能想到的所有密码,我都会在此设备上使用过任何密码

在所有情况下,其行为均与步骤5中所述完全相同。我没有收到任何错误或任何迹象表明任何错误或密码无效,也没有暗示它是否真正在意当前密码或该字段是否保留为空白。 (此答案以及我浏览过的其他几个支持论坛中的屏幕截图似乎暗示着,如果没有当前密码,则不会显示“当前备份密码”框,但这只是一个推论;没有明确说明是否

我怀疑它提示的密码可能是在开发人员选项中设置的“台式机备份密码”:



我以前从未设置过该密码。如果我尝试设置一个,则会收到一条消息,提示:Failed to set backup password.

在搜索有关此错误的信息时,我至少遇到了另一种情况,即遇到此问题的人表示这正在阻止他没有使用ADB备份,但是他并没有具体说明当他尝试使用ADB备份时会发生什么。

收到此消息的大多数人从未设置过密码,他们说解决方案是将当前密码保留为空白,但是我首先尝试了此操作,但此方法无效。我发现另一个遇到此问题的人提出了一个问题,并确定他之前没有设置密码。不幸的是,看起来他从来没有得到解决方案甚至是解释。

不管ADB是在寻找“台式机备份密码”还是ADB加密密码都是单独的东西,这让我很困惑,为什么ADB要求您输入以前的密码才能启动新密码。备份。我并不是要还原,覆盖或以任何方式访问以前加密的数据,因此,即使先前已设置了备份的加密密码,我也无法想象为什么有人会认为阻止您进行加密是个好主意如果您忘记了过去用来加密备份的密码,请备份您的设备。

其他信息:

型号:Samsung Galaxy S4 SCH-I545内核版本:3.4.0 OS版本:4.4.2Android SDK Tools版本:1.16
USB调试是

请注意,我使用ADB备份的原因是在植根手机之前对手机进行完整备份以确保安全*,因此我可以使用nandroid备份工具,例如Titanium备份。因此,任何涉及扎根手机的建议都将是Catch-22,而不是解决方案。不用说,恢复出厂设置也不是解决方案,因为它会破坏执行备份的全部目的。

手机已设置为与我公司的Exchange服务器同步,并且服务器强制执行一些策略。我曾以为该设备在我第一次与公司帐户建立同步时已被加密,但显然目前未加密。实际上,这就是使这一系列事件起作用的原因:我收到一条消息,告诉我需要加密设备才能继续连接到公司服务器。我想在加密之前进行nandroid备份,这需要生根,并且我想在生根之前使用ADB备份。


*是的,我知道Towelroot被认为是安全的,但是我宁愿不要冒险,我想解决或至少了解此问题。与案例相关的问题将来会出现。

评论

我在一个平板电脑上遇到过ADB的几个问题(在两种情况下都已获得根源或不获得根源),它们都是相似的(反之亦然:虽然adb备份工作正常,但adb还原总是失败)。原来这是一个权限问题(制造商将ROM弄乱了),因此adb restore在将备份文件传输到设备后无法读取该文件。查找起来有些棘手,而且我不确定这里是否确实存在类似情况。但可能值得检查。

对于那些最终会遇到同样的0bytes问题的人:我遇到了这个问题,因为我曾经在“设置”下设置了桌面密码,然后忘记了。因为设备已扎根,所以我遵循了这个答案(我的),一切顺利。

您可能还会查看:code.google.com/p/android/issues/detail?id=47009-如果您已经对手机进行了加密,则可能需要在所有提示中使用加密密码作为“当前密码”:在“完全备份”屏幕中,或在“桌面备份密码”中。

#1 楼

简短答案

尝试使用早期版本的adb。 1.0.32不适用于我,但1.0.31有用。

长答案

我刚在运行CyanogenMod 11(基于Android 4.4的Nexus 5)上遇到此问题)使用当前版本的平台工具和ADB(Android调试桥版本1.0.32修订版eac51f2bb6a8-android)。

使用adb logcat查看设备日志,我注意到在调用adb backup -apk -obb -shared -all -nosystem后,可疑日志条目:

V/BackupManagerService(  811): Requesting full backup: apks=false obb=false shared=false all=false pkgs=[Ljava.lang.String;@4181ffc8
W/BackupManagerService(  811): Unknown package  '-apk' '-obb' '-shared' '-all' '-nosystem', skipping


设备似乎将命令行选项解释为非选项参数,并且由于未安装软件包而产生错误名称。这让我怀疑设备上相对于主机的adb协议或命令/服务调用选项是否已更改,因此我尝试了较旧版本的adb和voilà,它可以正常工作。

我做了一些的挖掘过程,并在“ adb备份”中遇到了对Use escape_arg的更改,该更改现在导致在调用/system/bin/bu backup时将所有参数都用单引号引起来。这说明了日志消息中的行为和单引号参数。但是,它似乎与遇到错误的时间不匹配。这也表明这个问题比看起来的要广泛得多。因此,我不愿意将其称为原因,但这可能是进一步调查的良好起点。

评论


使用早期版本(1.0.31)解决了我的问题。这个问题stackoverflow.com/q/9555337/1741542尤其是这个答案stackoverflow.com/a/23022718/1741542帮助我找到了一个较早的版本,例如platform-tools_r20-linux.zip。

–Olaf Dietsche
2015年11月10日在20:33

似乎它不适用于所有型号。虽然我对Samsung S3 mini(Android 4.2)进行了完整备份,但没有任何问题,但我无法使用Android 4.0上的平板电脑进行备份。我尝试了从adb-r10到adb-r23(不包括adb-r15)的所有操作,但均未成功。

–Olaf Dietsche
2015年11月12日13:59

我在adb 1.0.32和Nexus 5(Android 6)上也遇到了类似的问题。我通过显式引用备份参数来解决此问题,即执行adb backup'-noapk -noshared -all -nosystem'而不是adb backup -noapk -noshared -all -nosystem(在bash shell内)。如果没有引号,我将收到类似以下内容的logcat消息:“未知的备份标志-all:-nosystem:-noapk”,“未提供备份包,既未共享也未共享”以及最终“完成”。

–maxschlepzig
2015年11月23日15:22

我终于也有了Android 4.0的完整备份。愚蠢的我,那只是平板电脑的重启,这让我动起来了。

–Olaf Dietsche
15年11月23日在22:15

谢谢!顺便说一句,您可以在这里为所有平台下载adb​​ 1.0.31:ftp.mozilla.org/pub/labs/r2d2b2g

– eWolf
16年1月8日,在1:27

#2 楼

基于kevenoid的答案,这可能取决于手机上正在运行的是哪个版本的adb。

您可以通过执行以下操作来找出手机本机运行的版本:

首先找出您的台式机正在运行的版本

adb version


然后在手机上打开外壳

adb shell


一旦外壳打开,便可以运行

adb version


然后通过运行

退出外壳。我发现我的手机运行的是1.0.31版本,而不是1.0.32(这是一个三星笔记2)

我尝试使用引号或转义字符(如Hunter所示),但这些字符都无法在Windows命令行中使用。但是,降级确实解决了两个版本之间的不兼容性问题。

我可以按照此处的说明找到较旧的版本:https://stackoverflow.com/a/23022718/1741542

我使用的下载链接为:http ://dl-ssl.google.com/android/repository/platform-tools_r20-windows.zip

其他平台:



http ://dl-ssl.google.com/android/repository/platform-tools_r20-macosx.zip

http://dl-ssl.google.com/android/repository/platform-tools_r20- linux.zip



评论


有什么办法可以升级手机上的adb版本?

–王斌
16年8月18日在23:30

#3 楼

关于引用的命令参数的其他答案是准确的。我发现,如果您转义参数之间的空格,则可以使用。

像这样:adb backup -apk\ -shared\ -all\ -system

评论


这可能不是解决OP问题的方法,但比起使用对我不起作用的旧版ADB,它是解决@Kevinoid问题的更好方法。

–亨特·佩林(Hunter Perrin)
2015年12月1日于20:41

这是凯文奥德(Kevinoid)的回答的重复,没有根据。但是,它对我来说效果很好,我更喜欢使用\代替'

–尼尔·梅休(Neil Mayhew)
2015年12月7日在22:59

此解决方案对我有用,无需降级adb

–freethinker
2015年12月18日下午4:10

我可以确认@HunterPerrin的怀疑,这是一个不同的问题,因为我首先尝试了此方法,但并没有解决我的问题,但是第二次我转到1.0.31 adb,它开始正确复制

–警笛声
16年11月11日在21:19

#4 楼

这里没有任何变通办法对我有用,并且我不想降级我的SDK工具。这就是我的想法:跳过计算机上的adb backup并通过adb shell直接转到设备。 #1)。参数相同/system/bin/bu-> adb backup <params>。输出将重定向到设备上的文件,然后可以像任何文件一样将其拉出。

唯一的缺点是,如果设备的容量超过一半,则无法进行完全备份。如果您有外部SdCard插槽,则可以解决此问题。 bu 1 backup <params>甚至可以在Android 4.4.2上编写,因为它是系统应用程序。 bu对我来说和/mnt/extSdCard/backup.ab一样。

#5 楼

遗憾的是,如果真的是这样,我真的很抱歉,您似乎可以根据自己的屏幕截图和命令行来进行仔细判断,但是我发怒地发现了同样的症状,并以为我可以发贴,以防万一将来的发现者在这里出现。事实证明,adb对选项中的单破折号和双破折号非常挑剔。对我来说,双破折号完全重现了这种情况:电话上的提示相同,相同的0字节文件。即使有很长的参数名称也可以使用单破折号。

如果需要,我的手机是运行Android 5.1 / Cyanogenmod 12.1的Samsung Galazy Note 2 AT&T SGH-i317。

评论


我对此是否应该作为答案还是发表评论感到困惑。 OP显示他使用的是单破折号,而不是双破折号,因此您的答案可能未达到要求。我承认这个答案是有益的(附加值),但似乎并不能回答OP的问题。

–安德鲁·T。♦
2015年5月11日,2:59

这解决了我的问题。

–约翰·弗里曼(John Freeman)
2015年9月11日下午0:38

请发布您的实际命令行。

–RoboJ1M
16年2月2日,16:03

#6 楼

您需要在adb版本1.0.31上执行adb备份命令。对于Windows,我这样做了:


找到您的SDK文件夹(c:/ users / ... / AppData / Local / Android / sdk)
将工具和平台工具重命名为tools.bak和platform-tools.bak
下载http://dl-ssl.google.com/android /repository/tools_r22.3-windows.zip

下载http://dl-ssl.google.com/android/repository/platform-tools_r19.0.1-windows.zip

将两个zip都解压缩到sdk文件夹中
按常规运行adb backup命令

日志:

$ adb backup -apk -obb -shared -all -system- f bckp.ab

adb服务器已过期。杀死...


守护进程已成功启动*

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

...然后将一切恢复正常。

#7 楼

好,这就是我的固定方法。

我尝试了Hunter Perrin的解决方案:

adb backup -apk\ -shared\ -all\ -system


但它立即返回,没有错误,没有电话上的备用屏幕。

通过反复试验,这对我有用:

adb backup -all\


#8 楼

我认为我对使用1.0.32的用户有解决方案:

当在Android屏幕上出现提示时输入密码

尽管事实表明它将使用默认密码如果您不输入任何密码,我相信不会,并且adb 1.0.32可能不允许创建未加密的备份。

输入密码对我有用,然后我最终使用了
“ Android备份提取器”(Warning Sourceforge)和“ Java密码术扩展(JCE)无限强度管辖策略”将其提取到tar文件中。

#9 楼

我遇到了一个相反的问题:更新的手机(Android 7)的1.0.31也会失败。
1.0.31在将参数传递给手机时将:用作分隔符。
adb logcat -s BackupManagerService所示,较新的adb在电话上也无法处理旧样式:
02-19 01:59:44.330 1100 9830 W BackupManagerService: Unknown package com.gameloft.android.ANMP.GloftPOHM:-apk, skipping
幸运的是,较新的adb也接受空格作为分隔符,因此将参数括在双引号中是有效的,例如:
adb.exe backup "com.gameloft.android.ANMP.GloftPOHM -apk" -f game-backup.ab

#10 楼

对我来说,软件包名称已更改,因此adb backup找不到它,并且正在创建一个空的备份文件,而没有报告任何错误。 adb logcat显示错误。更新软件包名称后,adb backup成功。
此版本使用的是ADB版本1.0.41,并启用了桌面备份密码。