【发布时间】:2012-11-14 17:32:09
【问题描述】:
是否可以从 adb shell 命令读取二进制标准输出?例如,如何使用屏幕截图的所有示例都包括两个步骤:
adb shell screencap -p /sdcard/foo.png
adb pull /sdcard/foo.png
但是,该服务支持写入标准输出。例如,您可以执行以下操作:
adb shell "screencap -p > /sdcard/foo2.png"
adb pull /sdcard/foo2.png
这同样适用。但是,如何跨 ADB 读取输出呢?我想做的是:
adb shell screencap -p > foo3.png
并避免中间写入 SD 卡。这会生成看起来类似于 PNG 文件的内容(运行 strings foo3.png 会生成具有 IHDR、IEND 等的内容)并且大小大致相同,但就图像阅读器而言,文件已损坏担心。
我也尝试在 java 中使用 ddmlib 来执行此操作,结果是相同的。我很乐意使用任何必要的库。我的目标是减少获得捕获的总时间。在我的设备上,使用双命令解决方案,获取图像大约需要 3 秒。使用 ddmlib 并捕获 stdout 耗时不到 900 毫秒,但它不起作用!
可以这样做吗?
编辑:这是两个文件的十六进制转储。第一个,screen.png 来自标准输出并且已损坏。第二个, xscreen 来自双命令解决方案并且有效。图像应该在视觉上相同。
$ hexdump -C screen.png | head
00000000 89 50 4e 47 0d 0d 0a 1a 0d 0a 00 00 00 0d 49 48 |.PNG..........IH|
00000010 44 52 00 00 02 d0 00 00 05 00 08 06 00 00 00 6e |DR.............n|
00000020 ce 65 3d 00 00 00 04 73 42 49 54 08 08 08 08 7c |.e=....sBIT....||
00000030 08 64 88 00 00 20 00 49 44 41 54 78 9c ec bd 79 |.d... .IDATx...y|
00000040 9c 1d 55 9d f7 ff 3e 55 75 f7 de b7 74 77 d2 d9 |..U...>Uu...tw..|
00000050 bb b3 27 10 48 42 16 c0 20 01 86 5d 14 04 11 dc |..'.HB.. ..]....|
00000060 78 44 9d c7 d1 d1 11 78 70 7e 23 33 8e 1b 38 33 |xD.....xp~#3..83|
00000070 ea 2c 8c 8e 0d 0a 08 a8 23 2a 0e 10 82 ac c1 40 |.,......#*.....@|
00000080 12 02 81 24 64 ef ec 5b ef fb 5d 6b 3b bf 3f ea |...$d..[..]k;.?.|
00000090 de db dd 49 27 e9 ee 74 77 3a e3 79 bf 5e 37 e7 |...I'..tw:.y.^7.|
$ hexdump -C xscreen.png | head
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 02 d0 00 00 05 00 08 06 00 00 00 6e ce 65 |.............n.e|
00000020 3d 00 00 00 04 73 42 49 54 08 08 08 08 7c 08 64 |=....sBIT....|.d|
00000030 88 00 00 20 00 49 44 41 54 78 9c ec 9d 77 98 1c |... .IDATx...w..|
00000040 c5 99 ff 3f d5 dd 93 37 27 69 57 5a e5 55 4e 08 |...?...7'iWZ.UN.|
00000050 24 a1 00 58 18 04 26 08 8c 01 83 31 38 c0 19 9f |$..X..&....18...|
00000060 ef 7c c6 3e 1f 70 f8 7e 67 ee 71 e2 b0 ef ce f6 |.|.>.p.~g.q.....|
00000070 f9 ec 73 04 1b 1c 31 60 23 84 30 22 88 a0 40 10 |..s...1`#.0"..@.|
00000080 08 65 69 95 d3 4a 9b c3 c4 4e f5 fb a3 67 66 77 |.ei..J...N...gfw|
00000090 a5 95 b4 bb da a4 73 7d 9e 67 55 f3 ed 50 5d dd |......s}.gU..P].|
乍一看,似乎添加了几个额外的 0x0d (13) 字节。回车??这有什么铃声吗?是否混入了一些空白行?
【问题讨论】:
-
我猜你正在将程序的标准输出与命令的标准输出结合起来。我没有准备好自己尝试这个,但你有没有详细看过它创建的文件?如果您在文本编辑器中打开它,您可能会看到一个可以删除的错误字符串。至少你可以将它与正确的版本进行比较,看看有什么区别。
-
更新了我的问题以添加两个文件的 hexdumps。我没有看到任何奇怪的字符串混入其中,但随机字节似乎确实如此。
-
如果你在那里得到了几个额外的cr,我一点也不感到惊讶。您可能只运行“adb shell screencap -p”并查看输出是什么。请记住,您不是将 screencap -p 的输出传递给 adb,而是传递 adb shell 的输出。
-
我用十六进制编辑器刮掉了两个明显的任性crs,并试图再次查看图像。这一次,它被预览识别为PNG(之前不是),但图像是空白的。 Imagemagick 仍然声称它已损坏,因此那里可能有更多垃圾。叹息。
-
像这样:adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png