一、發送事件是什麼
sendevent 是一個命令行工具,用於向輸入子系統發送事件,通常被用於模擬硬件操作(如按鍵,觸摸等)或測試應用程序的交互性。在安卓平台中,sendevent 發送事件是通過 /dev/input/eventX 的文件接口完成的。
sendevent 的語法如下:
sendevent <事件輸入&gs; {type} <類型&gs; {code} <代碼&gs; {value} <數值&gs;
其中 「事件輸入」 指定發送事件的設備路徑,通常是「/dev/input/eventX」,其中 X 是設備編號。type 代表事件的類型,例如 EV_KEY、EV_ABS 等。code 表示事件的代碼,例如鍵值、絕對坐標軸值等。value 表示事件值,例如 0/1 表示按下或鬆開的鍵或觸摸事件。
以下代碼示例演示了如何使用 sendevent 發送一個模擬的鍵盤事件:
# 設置該事件發送到 /dev/input/event0 設備上 echo -n "sendevent /dev/input/event0" > /dev/tty # 模擬按下 "a" 鍵 echo -n "0001 0039 00000001" > /dev/tty # 模擬鬆開 "a" 鍵 echo -n "0001 0039 00000000" > /dev/tty
二、典型的sendevent使用場景
sendevent 是一個非常靈活的工具,可以發送各種各樣的事件,被廣泛地用於 Android 系統內部的自動化測試、事件注入等方面。以下是 sendevent 常見的使用場景:
1. 模擬按鍵事件
在 Android 系統中,按鍵事件是通過 /dev/input/eventX 設備發送的,通過 sendevent 可以模擬對硬件按鍵的操作。例如,以下代碼演示了如何模擬按下 HOME 鍵的操作:
# 設置該事件發送到 /dev/input/event1 設備上 echo -n "sendevent /dev/input/event1" > /dev/tty # 按下home鍵 echo -n "0001 102 00000001" > /dev/tty # 鬆開home鍵 echo -n "0001 102 00000000" > /dev/tty
2.模擬觸摸事件
在 Android 平台中,通過模擬輸入的方式可以實現對觸摸屏幕的模擬,同時還可以模擬屏幕多點觸摸操作。envenatest 是一個工具,可以幫助我們測試觸摸屏幕的性能和響應速度。
以下是一個模擬多點觸摸的實現代碼示例:
# 設置該事件發送到 /dev/input/event0 設備上 echo -n "sendevent /dev/input/event0" > /dev/tty # 發送觸摸屏幕按下事件 echo -n "0003 0039 00000029" > /dev/tty echo -n "0003 0035 0000057f" > /dev/tty echo -n "0003 0036 000007c5" > /dev/tty echo -n "0003 0030 00000008" > /dev/tty echo -n "0003 003a 0000014c" > /dev/tty echo -n "0000 0000 00000000" > /dev/tty # 發送觸摸屏幕鬆開事件 echo -n "0003 0039 00000029" > /dev/tty echo -n "0003 0035 0000057f" > /dev/tty echo -n "0003 0036 000007c5" > /dev/tty echo -n "0003 0030 00000008" > /dev/tty echo -n "0003 003a 0000014c" > /dev/tty echo -n "0000 0000 00000000" > /dev/tty
3.自動化測試
自動化測試是將測試過程自動化的一種方法,它能夠更快更準確地執行測試,並在重複測試時避免疏漏。在 Android 平台的自動化測試中,sendevent 可以被用來模擬各種硬件事件,從而測試應用程序的交互性。
下面的代碼演示了如何使用 sendevent 進行自動化測試,模擬向下滑動一個列表:
# 設置該事件發送到 /dev/input/event0 設備上 echo -n "sendevent /dev/input/event0" > /dev/tty # 發送觸摸屏幕按下事件 echo -n "0003 0039 00000029" > /dev/tty echo -n "0003 0035 0000057f" > /dev/tty echo -n "0003 0036 000007c5" > /dev/tty echo -n "0003 0030 00000008" > /dev/tty echo -n "0003 003a 0000014c" > /dev/tty echo -n "0000 0000 00000000" > /dev/tty # 發送觸摸屏幕移動事件 echo -n "0003 0039 00000029" > /dev/tty echo -n "0003 0035 0000057f" > /dev/tty echo -n "0003 0036 000007c5" > /dev/tty echo -n "0003 0030 00000008" > /dev/tty echo -n "0003 003a 000000ac" > /dev/tty echo -n "0000 0000 00000000" > /dev/tty # 發送觸摸屏幕鬆開事件 echo -n "0003 0039 00000029" > /dev/tty echo -n "0003 0035 0000057f" > /dev/tty echo -n "0003 0036 000007c5" > /dev/tty echo -n "0003 0030 00000000" > /dev/tty echo -n "0003 003a 00000000" > /dev/tty echo -n "0000 0000 00000000" > /dev/tty
三、 sendevent使用技巧
1. 使用腳本簡化操作
我們可以通過編寫腳本,將 sendevent 的執行過程自動化,讓操作更簡單方便。以下腳本演示了如何通過按鍵操作關閉 Android 設備:
#!/system/bin/sh # 設置該事件發送到 /dev/input/event2 設備上 dev=/dev/input/event2 # POWER echo -ne "\x01\x74\x01\x00000001" > $dev echo -ne "\x01\x74\x00\x00000000" > $dev sleep 2 # VOLUME_DOWN echo -ne "\x01\x73\x01\x00000001" > $dev echo -ne "\x01\x73\x00\x00000000" > $dev sleep 1 echo -ne "\x01\x73\x01\x00000001" > $dev echo -ne "\x01\x73\x00\x00000000" > $dev sleep 2 # 等待設備關閉完成 while true do dumpsys power | grep mScreenOn=false if [ $? -eq 0 ] then echo "Device is shutdown." exit 0 fi sleep 1 done
上述腳本通過發送按鍵事件完成了「長按 POWER 鍵 -> 按下音量減鍵 -> 鬆開音量減鍵 -> 再按下音量減鍵 -> 鬆開音量減鍵」的組合操作,最終完成了安全關閉 Android 設備的功能。
2. 調試觸摸屏幕問題
當我們在使用觸摸屏幕設備時,發現屏幕沒有響應或者出現了其他異常問題時,可以通過 sendevent 發送觸摸屏幕事件來確定是否是硬件問題。以下是一個演示代碼示例:
#!/system/bin/sh # 設置該事件發送到 /dev/input/event2 設備上 dev=/dev/input/event2 # 發送觸摸屏幕按下事件 echo -ne "\x03\x39\x29\x03\x35\x7f\x03\x36\xc5\x03\x0b\x01\x00\x00\x03\x30\x08\x03\x3a\x4c\x00\x00\x00\x00\x00\x00" > $dev # 發送觸摸屏幕移動事件 echo -ne "\x03\x39\x29\x03\x35\x7f\x03\x36\xc5\x03\x0b\x00\x00\x11\xfe\x03\x30\x08\x03\x3a\x4c\x00\x00\x00\x00\x00\x00" > $dev # 發送觸摸屏幕鬆開事件 echo -ne "\x03\x39\x29\x03\x35\x7f\x03\x36\xc5\x03\x0b\x00\x00\x00\x00\x03\x30\x00\x03\x3a\x00\x00\x00\x00\x00\x00" > $dev
以上腳本模擬了一個從左上角開始觸摸、移動到屏幕中間並且鬆開的過程,通過手指改變鬆開的位置獲取更多信息。
3. 利用sendevent注入事件
sendevent 的最常見用途是注入事件,例如,將遊戲手柄配置為鍵盤映射設備。通過將手柄的操作映射到按鍵事件上,使得手柄可以在不依賴遊戲控制器的情況下完成遊戲操作。
以下是示例代碼演示了如何將二代Nintendo Switch(手持設備)的joycons映射為ASCII碼值:
#!/system/bin/sh # 切換到目錄/data/local/tmp cd /data/local/tmp # 安裝進程並獲取root shell權限 /system/bin/busybox cp /data/app/com.termux-*/com.termux* /data/local/tmp/ /system/bin/chmod +x com.termux* ./com.termux* # 創建設備節點/dev/uinput echo "Creating /dev/uinput device ..." mknod /dev/uinput c 10 223 chmod 666 /dev/uinput # 注入事件 echo "Injecting events ..." echo "Press Ctrl + c to exit ..." cat /dev/input/event3 | su -c "sendevent /dev/input/event5" & cat /dev/input/event4 | su -c "sendevent /dev/input/event5" & cat /dev/input/event6 | su -c "sendevent /dev/input/event5" & exit 0
四、結論
sendevent 是一個非常靈活的工具,可以模擬各類事件,並被廣泛地用於 Android 系統內部的自動化測試、事件注入等方面。通過使用腳本庫、調試工具以及事件注入特性,可以更高效方便地使用它。
原創文章,作者:IQLN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/138507.html