這個工具的主要目的就是記錄屏幕上的各種操作,然后屢次回放,用于穩定性測試和1些需要屢次重復才能復現的bug的重現。
代碼在以下位置:
http://download.csdn.net/detail/dfysy/8479123
之前,他人轉發我1個記錄/回放 event的程序,在KK之前都是可以用的,但是由于Android L enable了PIE(positionindependent execution), 在L上沒法用了。又沒有源碼,只能自己再寫1個。
程序的原理:
就是讀取/dev/input下面的所有event輸入,把他們都記錄下來,然后在回放的時候在1個1個的寫回去。記錄的信息除input_event的內容外,還需要記錄該event是從哪個input節點讀入的,由于回放的時候需要知道這個event應當寫入哪個節點。
由于input_event里面記錄的event產生時間和實際讀取的時間會有差異,會致使回放的時候計算兩個event之間的時間差出現毛?。ㄘ?#20540;)。最好的設計應當是對所有讀出的event再根據產生時間進行排序。但是為了簡化設計,此處直接記錄讀取event的墻鐘時間,這樣雖然不同input節點間的時間關系可能有偏差。但是同1個input節點直接的順序還是正確的。
程序的主要風格是C和C++的混合體,之所以使用C++,主要是由于使用了template處理map和vector,這樣就不用使用C語言費力巴哈的去實現相干的插入查找的算法,目的是快速,不是較勁。
主要的數據結構和功能:
map<string,int> fileName2fd; /*input filenameàinput fd*/
map<string,int> fileName2fdr; /*記錄文件中的filenameà記錄文件中的fd*/
map<int,string> fd2fileName;/*input fdàinputfilename*/
map<int,string> fdr2fileName;/*記錄文件中的fdà記錄文件中的filename*/
map<int,int> fdr2fd;/*記錄文件中的fdàinputfd*/
vector<event_info>eventListFile;/*記錄文件中的所有list,這樣就不用每次都讀文件了*/
vector<event_info>eventListScan; /*記錄所有從input 文件節點讀取到的event*/
程序主要分為以下幾個部份
1) 遍歷dev/input目錄,打開所有節點,(此部份使用了android的getevent部份代碼)。建立fd和文件名之間的相互map
scanAndOpenInputs(INPUT_DIR);
2) 分析命令輸入,如果是recording的話,進入receiveEvents(),讀取input文件節點的event,并進行保存。此處使用了select來監控各個input。
ret= select(max_fd, &fds, NULL, NULL, &timeout);
3) 分析命令輸入,如果是playback的話,則從文件中讀出各個event,并計算各個event之間的時間差,然后根據fd和filename對應將其寫入對應的文件節點。
Android.mk 里面需要加以下的選項,以即可以使用stl的庫,這里采取的靜態編譯,以避免下載到某些裝備找不到庫
LOCAL_C_INCLUDES += bionic bionic/libstdc++/include external/stlport/stlport
LOCAL_STATIC_LIBRARIES := libc libstlport_static
LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)
TODO:1)增加輸出到指定文件的功能,這樣就能夠為不同的測試內容記錄不同的文件
2)增加playback指定文件的功能,這樣就能夠用shell來組織各個功能的測試了。
上一篇 解決MySQL server has gone away問題的兩種有效辦法
下一篇 HTTP Status 500 - javax.servlet.ServletException: java.lang.OutOfMemoryError: Pe