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

标签 android ruby shell adb

我正在编写一个执行一些 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/

相关文章:

ubuntu - 使用单个脚本文件启动两个 mochiweb 服务器

linux - Shell 脚本 - help-me 列出文件和子目录

android - 如何检测 Android Go?

android - 重新启动加载程序调用时出错

ruby - 为什么 Ruby 人说他们不需要接口(interface)?

Ruby 的线程速度

ruby - gem 推送结果为 "package metadata is missing"

mysql -\!某些命令在远程 mysql 连接中无法正常工作

android - 在进程之间发送大量数据的最佳方法是什么?

android - Ant 成功构建测试项目,但 eclipse 抛出错误