【发布时间】:2014-12-29 21:07:29
【问题描述】:
我正在编写一个执行一些 adb shell 命令的小型 Ruby 脚本。当我尝试在 android 设备上运行屏幕记录然后发送一些滑动和触摸事件时,就会出现问题。
如果我运行 adb shell screenrecord 而没有 "&" 最后触摸和滑动,事件仅在 screenrecord 超时时发生:
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4
如果我在最后使用"&" 运行它,尽管将高--time-limit 选项传递给screenrecord,但在执行触摸或滑动事件时screenrecord 会立即切断。
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4&
有没有一种方法可以创建一个子进程,让它运行screenrecord,然后在screenrecord 完成并并行执行触摸和滑动时死掉?
我尝试使用fork,但父母最终死了,如果我重新执行程序,就会执行触摸和滑动。
这是我之前 fork 的代码:
def adb(arg)
fork do
exec("adb -s #{ARGV[0]} #{arg}")
exit
end
end
我尝试将 spawn 作为替代方案,但它不起作用:
if line.include? "<record>"
puts "comes here"
duration=line.scan(/\d+/).first.to_i
adb_sep("shell screenrecord --time-limit #{duration} /sdcard/demo.mp4")
它基本上解析带有标签的 XML 文件以触发记录过程。我确信 exec 没有失败,因为我尝试模拟 IRB 中的步骤。
跑步
irb>>exec(<adb screenrecord command>)
在按预期完成后杀死 Ruby shell。
irb>>system(<adb screenrecord command>&)
irb>>system(<adb tap or swipe command>)
像梦一样工作!它完全符合我的要求。从设备中提取录制的视频正是我想要的。
我想我已经弄清楚发生了什么。使用& 运行 adb 会将 adb 进程发送到后台并停止录制。运行 adb tap 将其带回前台。因此,我的视频被截断了。
我想我必须在它自己的 shell 中触发 adb screenrecord。
与人类的 bash 类比是打开一个终端,开始录制屏幕。打开另一个终端,开始发送点击和滑动。
【问题讨论】:
-
你用来分叉的代码是什么?您在等待子 pid 完成吗?
-
我已经添加了我以前 fork 的代码。我特别不想听孩子出口,也不想等待/等待他们。
-
对于 fork,您实际上没有太多选择,您需要等待所有子 pid,否则父进程将关闭并可能离开僵尸进程。就像在代码末尾添加
Process.wait一样简单 -
程序的结构使得父母总是最后完成。 :(
-
很难从一个小代码sn-p 看出发生了什么。你确定 exec 没有失败吗?