Android 通过ADB外壳传输二进制数据(即使用tar进行快速文件传输)

Android 通过ADB外壳传输二进制数据(即使用tar进行快速文件传输),android,adb,Android,Adb,我一直在尝试使用类似的方法将文件从我的android设备移动到我的osx机器上:adb shell tar-c directory\u to|copy\tar-x。远程tar似乎正在工作,但文件可能会在某个地方损坏。 玩了一番之后,我发现: adb shell命令似乎将LF转换为CRLF: % adb shell 'cd /mnt/sdcard;echo hi>a.bin' % adb shell 'cd /mnt/sdcard;cat a.bin' | hexdump -C 00000

我一直在尝试使用类似的方法将文件从我的android设备移动到我的osx机器上:
adb shell tar-c directory\u to|copy\tar-x
。远程tar似乎正在工作,但文件可能会在某个地方损坏。 玩了一番之后,我发现:

  • adb shell命令似乎将LF转换为CRLF:

    % adb shell 'cd /mnt/sdcard;echo hi>a.bin'
    % adb shell 'cd /mnt/sdcard;cat a.bin' | hexdump -C
    00000000  68 69 0d 0a                                       |hi..|
    00000004
    % adb pull /mnt/sdcard/a.bin
    0 KB/s (3 bytes in 0.457s)
    % hexdump -C a.bin
    00000000  68 69 0a                                          |hi.|
    00000003
    
  • 看起来是服务器或守护进程导致了这种情况,而不是客户端(请参阅len=4):

我猜守护进程正在为windows用户在shell命令中进行这种转换

我的问题是:

  • wtf?(这意味着什么,目的是什么?)
  • 有没有办法告诉它(adbd?)不要这样做
  • 有人能想出任何创造性的方法来避免这种情况吗(我考虑过对数据进行base64编码,但我更愿意避免这种开销。另外,创建本地文件不是一种选择,因为我的文件系统已经满了)

  • 谢谢

    Adb并不是故意这样做的,但当您给终端一个运行命令时,它还不够聪明,不能避免分配终端;安卓端的终端是用来制作字节的。而不是

    adb shell 'cd /mnt/sdcard;cat a.bin' | hexdump -C
    
    试着做

    adb shell 'stty raw; cd /mnt/sdcard;cat a.bin' | hexdump -C
    
    这指示终端设备根本不要损坏字节,而是将它们传递出去。

    使用
    adb exec out
    而不是
    adb shell

    示例
    adb exec out cat/data/myfile.txt>localfile.txt

    第一个答案中提到的“stty”技巧通常不起作用

    对于将输出管道化到主机端的hextump命令,这可能是正常的。但是,对于tar(正如在原始问题的主题中提到的)和许多其他可以接受二进制流输入的命令,这是不起作用的。正如Fabian Zeindl正确指出的,使用“adb exec out…”是正确的方法

    通过ADB传输tar输出的一些示例:

  • 这里假设tar可执行文件位于Android上的路径中:

    • adb exec out'cd/SD卡;tar-cf-DCIM/'>DCIM.tar
    • adb exec out'cd/SD卡;tar-cf-DCIM/'| tar-tvf-
  • 一些涉及压缩和busybox使用的更复杂示例:

    • adb exec out'cd/SD卡/system/xbin/extras/busybox tar-czf-DCIM/'>DCIM.tgz
    • adb exec out'cd/SD卡;GZIP=“-9”/system/xbin/extras/busybox tar-czf-DCIM/”| tar-tvzf-
    • adb exec out'cd/SD卡;BGZIP2=“-9”/system/xbin/extras/busybox tar-cjf-DCIM/”>DCIM.tar.bz2

  • 这是我第一次看到合理的“wtf?”问题,关于SO:-)“/system/bin/sh:stty:notfound”这是有史以来最好的答案,从没想过这是可能的!未来读者:一定要看看下面后面的答案。我认为它们比我的更正确,尽管我不确定2012年写这篇文章时是否存在exec out。我认为这是最好的答案,因为如果数据很大,exec out非常慢。我需要安装一些东西还是需要一些特定的ADB版本来运行这个“exec out”?当我尝试运行“adb exec out…”时,它会列出所有adb命令选项,当我使用一些随机命令(如“adb foobar…”)时也是如此,这意味着它不存在。我的版本是Android Debug Bridge版本1.0.36有关
    adb exec out
    命令的更多信息:我怀疑exec out需要手机上的adb足够新,可以支持它,而我的恢复ROM不是。但是
    adb exec out
    似乎不支持stdin…:(在中有
    adb exec,但您无法进行双向通信,这是例如
    rsync
    如何获取tar可执行文件所必需的?7Zip无法在windows上以这种方式打开DCIM tar文件。可能安卓tar软件以某种方式被破坏,或者exec out修改了中的二进制内容windows@beppe9000也许你这里使用Powershell,它故意在UTF-16中转换重定向的输出(请参阅)。如果您使用新的Powershell内核或经典的“cmd”,它可以工作。谢谢提醒!@sigi_tm
    adb shell 'stty raw; cd /mnt/sdcard;cat a.bin' | hexdump -C