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

m0s*_*she 13 android adb

我一直在尝试使用类似的东西将文件从我的Android设备移动到我的osx机器:adb shell tar -c directory_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
    
    Run Code Online (Sandbox Code Playgroud)
  • 它看起来是服务器或守护进程导致的而不是客户端(请参阅len = 4):

    % ADB_TRACE=1 adb shell 'cd /mnt/sdcard;cat a.bin'
    [... snip ...]
    system/core/adb/commandline.c::read_and_dump():read_and_dump(): post adb_read(fd=3): len=4
    [... snip ...]
    
    Run Code Online (Sandbox Code Playgroud)

我猜这个守护进程在windows用户的shell命令中进行了那种翻译.

我的问题是:

  1. 跆拳道?(那是什么以及为了什么目的?)
  2. 有没有办法告诉它(adbd?)不这样做?
  3. 任何人都可以想到任何创造性的方法来绕过它(我想到base64编码数据,但我宁愿避免这种开销.另外,创建本地文件不是一个选项,因为我的文件系统已经很满了)

谢谢!

Gle*_*len 17

Adb没有故意这样做,但是当你给它一个运行命令时,它不够聪明,不能分配一个终端; android端的终端是烹饪字节的东西.代替

adb shell 'cd /mnt/sdcard;cat a.bin' | hexdump -C
Run Code Online (Sandbox Code Playgroud)

试着做

adb shell 'stty raw; cd /mnt/sdcard;cat a.bin' | hexdump -C
Run Code Online (Sandbox Code Playgroud)

这指示终端设备根本不破坏字节,而是传递它们.

  • "/ system/bin/sh:stty:not found" (4认同)

Fab*_*ndl 12

adb exec-out <command>而不是adb shell.

adb exec-out cat /data/myfile.txt > localfile.txt


F.M*_*.M. 6

第一个答案中提到的"stty"技巧一般不起作用.

要将输出管道连接到主机端的hexdump命令,可能没问题.但是,对于tar(如原始问题的主题中所述)以及许多其他可以接受二进制流输入的命令,这不起作用.正如Fabian Zeindl正确指出的那样,使用'adb exec-out ......'是正确的方法.

在ADB上传输tar输出的一些示例:

  1. 这里假设在Android的路径中找到了tar可执行文件:

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

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

  • @beppe9000可能您使用的是Powershell,它故意将重定向输出转换为UTF-16(请参阅/sf/ask/2806914001/)。如果您使用新的 Powershell Core 或经典的“cmd”,它就可以工作。 (2认同)