2014-11-03 47 views
2

我正在寫一個執行adb shell命令的小Ruby腳本。當我嘗試在android設備上運行屏幕記錄,然後發送一些滑動和觸摸事件時,會發生問題。如何在他們自己的shell中執行Ruby的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& 

有沒有一種方法,我可以只創建一個子進程有它運行screenrecordscreenrecord結束剛剛去世,並行執行的觸摸和刷卡?

我試過使用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>) 

殺死紅寶石殼然而如預期完成之後。

irb>>system(<adb screenrecord command>&) 
irb>>system(<adb tap or swipe command>) 

像夢一樣工作!它正是我想要它做的。從設備拉出錄製的視頻顯示了我想要的。


我想我已經知道發生了什麼事情。用&運行adb將adb進程發送到後臺並停止錄製。運行adb tap將它帶回前臺。因此我正在拍攝視頻。我想我將不得不在自己的shell中觸發adb screenrecord。

與人類的bash比喻將打開一個終端,開始記錄screeen。打開另一個終端,開始發送點擊和輕掃。

+0

你用來分叉的代碼是什麼?你是否在等待孩子pid完成? – Benji 2014-11-03 09:31:17

+0

我已經添加了我用來分叉的代碼。我特別不想聽孩子出門,也不想等他們出來。 – 2014-11-03 09:36:14

+0

你沒有太多的選擇,你需要等待所有的孩子pids,否則父進程將關閉,並可能離開殭屍進程。 就像在代碼末尾添加Process.wait一樣簡單 – Benji 2014-11-03 09:43:01

回答

0

事實證明,這是一個Android shell屏幕記錄問題,而不是Ruby問題。

Android正在對錄製的視頻長度進行優化,以改變我的輸出視頻。它只記錄從第一次UI更改到最後一次UI更改的視頻。