ADB备份会创建0字节的文件;即使我从未设置过密码,也会提示输入当前的备份密码;桌面备份密码“设置密码失败”


49

问题:

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

过程:

  1. 我使用adb devices命令确认设备已被ADB识别,并收到以下输出:

    List of devices attached
    8e1f368a        device
    
  2. 我发出ADB备份命令(详细说明)。

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

    Now unlock your device and confirm the backup operation.
    

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

    在此处输入图片说明

    我在这里所做的操作没有任何区别(详细信息如下)。

  4. 我点击Back up my data按钮(右下角)。

  5. 手机返回主屏幕并显示Backup starting...消息,然后Backup finished几秒钟后显示消息。将创建一个0字节的文件,命名为默认backup.ab或使用-f开关指定的名称。

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

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

adb backup -all

对于像

adb backup -all -apk -s 8e1f368a -f 'C:\Data Files\PDA\Backups\ADB\GalaxyS4_20140919.ab'

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

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

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

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

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

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

在此处输入图片说明

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

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

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

不管ADB是在寻找“台式机备份密码”还是ADB加密密码都是分开的,这让我感到困惑,为什么ADB要求您输入以前的密码才能启动新的备份。我并不想挽回,改写,或以任何方式访问以前加密的数据,所以即使备份加密密码已经预先设置,我无法想象为什么有人会认为这是阻止你是个好主意如果您忘记了过去用来加密备份的密码,请备份您的设备。

附加信息:

型号: Samsung Galaxy S4 SCH-I545
内核版本: 3.4.0
操作系统版本: 4.4.2
Android SDK工具版本: 1.16
启用USB调试。

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

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


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


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

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

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

@AdiInbar您是否解决了这个问题?
codecowboy15年

实际上,我花了一段时间才找到了这个。我不知道我是否没有使用正确的关键字,但这正是我所需要的!
托马斯

Answers:


31

简短答案

尝试使用较早版本的adb。1.0.32不适用于我,但1.0.31可以。

长答案

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

通过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 backup”中遇到了对Use escape_arg的更改,该更改现在使调用时所有参数都用单引号引起来/system/bin/bu backup。这说明了日志消息中的行为和单引号参数。但是,它似乎与遇到错误的时间不匹配。这也表明这个问题比看起来的要广泛得多。因此,我不愿意将其称为原因,但这可能是进行进一步调查的良好起点。


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

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

4
我在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年

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

5
谢谢!顺便说一句,您可以在此处为所有平台下载adb​​ 1.0.31:ftp.mozilla.org/pub/labs/r2d2b2g
eWolf 2016年

16

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

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

首先找出您的桌面上正在运行的版本

adb version

然后打开手机外壳

adb shell

打开外壳后即可运行

adb version

然后通过运行退出外壳

exit

我发现我的手机运行的是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

其他平台:


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

10

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

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


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

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

1
此解决方案对我
有用

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

7

这里没有任何变通办法对我有用,并且我不想降级我的SDK工具。这是我想到的:adb backup在计算机上跳过并直接通过转到设备adb shell

$adb version
Android Debug Bridge version 1.0.35
Revision fc2a139a55f5-android

$ adb shell
shell@jflte:/ $ bu 1 backup -apk app.package.name > /sdcard/backup.ab
shell@jflte:/ $ exit

$adb pull /sdcard/backup.ab
[100%] /sdcard/backup.ab

这会调用/system/bin/bu备份文件并将其转储到STDOUT(文件描述符#1)上。参数相同adb backup <params>-> bu 1 backup <params>。输出将重定向到设备上的文件,然后可以像任何文件一样将其拉出。

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


4

我真的很抱歉,如果是这样的话,你好像在你的截图和命令行谨慎判断,但是我发现我的懊恼相同的症状,以为我会发布,以防万一将来发现者使它在这里。事实证明,adb 对选项中的单破折号和双破折号非常挑剔。对我来说,双破折号完全重现了这种情况:电话上的提示相同,相同的0字节文件。即使有很长的参数名称,单破折号一样起作用。

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


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

这解决了我的问题。
约翰·弗里曼

请发布您的实际命令行。
RoboJ1M

2

您需要在adb版本1.0.31上执行adb backup命令。

对于Windows我做了:

日志:

$ adb备份-apk -obb-共享-all -system -f bckp.ab

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

  • 守护程序成功启动*

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

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


1

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

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

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

但是它只是立即返回,没有错误,电话上没有备份屏幕。

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

adb backup -all\


1

我遇到了相反的问题:较新的手机(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

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.