我正在编写一个执行一些 adb shell 命令的小 Ruby 脚本。当我尝试在 Android 设备上运行屏幕记录然后发送一些滑动和触摸事件时,就会出现问题。
如果我运行 adb shell screenrecord
而没有 "&"
在触摸和滑动结束时,事件只会在 screenrecord
时间发生出:
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4
如果我在末尾使用 "&"
运行它,尽管通过了高 ,但在执行触摸或滑动事件时
选项。 screenrecord
会立即剪切screenrecord
的 --time-limit
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 与人类的类比是打开一个终端,开始录制屏幕。打开另一个终端,开始发送点击和滑动。
最佳答案
事实证明,这是一个 Android shell 屏幕记录问题,而不是 Ruby 问题。
Android 正在对录制的视频长度进行优化,这会扭曲我的输出视频。它只记录从第一次 UI 更改到最后一次 UI 更改的视频。
关于android - 如何在自己的 shell 中从 Ruby 执行 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710361/