我正在写一个小的Ruby脚本来执行一些adb shell命令当我试图在android设备上运行屏幕记录,然后发送一些刷卡和触摸事件时,就会出现问题。
如果我运行adb shellscreenrecord
时,在触摸和滑动结束时没有"&"
,则仅当screenrecord
超时时才会发生事件:
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4
如果我在最后用
"&"
运行它,screenrecord
会在执行触摸或刷卡事件时立即剪切,尽管会将高--time-limit
选项传递给screenrecord
。adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4&
有没有一种方法可以创建一个子进程,让它运行
screenrecord
并在screenrecord
完成并并行执行触摸和刷卡时死亡?我试过使用
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文件来触发一个记录进程。我相信执行官不会失败,因为我试着模拟IRB中的步骤。
跑步
irb>>exec(<adb screenrecord command>)
不过,在按预期完成后杀死Ruby外壳。
irb>>system(<adb screenrecord command>&)
irb>>system(<adb tap or swipe command>)
像做梦一样工作!它做的正是我想要它做的。从设备中提取录制的视频正好显示了我想要的内容。
我想我已经搞清楚了使用
&
运行adb将adb进程发送到后台并停止记录运行adb tap使它回到前台结果我被剪辑成视频。我想我必须在它自己的外壳中触发adb的屏幕记录。
一个与人类的bash类比是打开一个终端,开始记录尖叫声。打开另一个终端,开始发送点击和刷卡。
最佳答案
事实证明,这是一个Android shell屏幕记录问题,而不是Ruby问题。
android正在对录制的视频长度进行优化,这会扭曲我的输出视频。它只记录从第一次ui更改到最后一次ui更改的视频。