如何在自己的shell中从Ruby执行shell命令?

时间:2014-11-03 08:26:59

标签: android ruby shell adb

我正在编写一个执行一些adb shell命令的小型Ruby脚本。当我尝试在Android设备上运行屏幕记录然后发送一些滑动和触摸事件时,会出现问题。

如果我在触摸和滑动的最后没有screenrecord的情况下运行adb shell "&",事件只会在screenrecord超时时发生:

adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4

如果我最后使用"&"运行它,screenrecord会在执行触摸或滑动事件时立即切断,尽管将--time-limit高选项传递给{{1} }。

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

它基本上用标签解析XML文件以触发记录过程。我确信exec没有失败,因为我尝试模拟IRB中的步骤。

正在运行

  if line.include? "<record>"
  puts "comes here"
  duration=line.scan(/\d+/).first.to_i
  adb_sep("shell screenrecord --time-limit #{duration} /sdcard/demo.mp4")

在按预期完成后杀死Ruby shell。

irb>>exec(<adb screenrecord command>)

就像一场梦!它完全符合我的要求。从设备中提取录制的视频可以准确显示我想要的内容。


我想我已经弄清楚发生了什么。使用irb>>system(<adb screenrecord command>&) irb>>system(<adb tap or swipe command>) 运行adb会将adb进程发送到后台并停止录制。运行adb tap将其恢复到前台。因此,我正在拍摄视频。

我想我必须在自己的shell中触发adb screenrecord。

与人类的bash类比将是打开一个终端,开始记录屏幕。打开另一个终端,开始发送水龙头和滑动。

1 个答案:

答案 0 :(得分:0)

事实证明这是一个Android shell屏幕记录问题,而不是Ruby问题。

Android正在对录制的视频长度进行优化,以扭曲我的输出视频。它仅记录从第一次UI更改到最后一次UI更改的视频。