1. 程式人生 > >獲取手機操作事件getevent,安卓模擬長按電源鍵

獲取手機操作事件getevent,安卓模擬長按電源鍵

adb root

adb shell getevent

錘子系列手機

左側鍵:

/dev/input/event2: 0001 02fe 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 02fe 00000000
/dev/input/event2: 0000 0000 00000000

按下
adb shell sendevent /dev/input/event2 0001 0766 00000001
adb shell sendevent /dev/input/event2 0000 0000 00000000

擡起
adb shell sendevent /dev/input/event2 0001 0766 00000001
adb shell sendevent /dev/input/event2 0000 0000 00000000

電源鍵:


/dev/input/event0: 0001 0074 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0074 00000000
/dev/input/event0: 0000 0000 00000000

按下
adb shell sendevent /dev/input/event0 0001 0116 00000001
adb shell sendevent /dev/input/event0 0000 0000 00000000

擡起
adb shell sendevent /dev/input/event0 0001 0116 00000000
adb shell sendevent /dev/input/event0 0000 0000 00000000

事件注入

  Android中的事件注入方式一共有三種:在Monkey原始碼淺談的文章中,我們已經介紹過一種事件注入的方法,不過那種方法谷歌的限制比較嚴格,基本對我們做自動化沒什麼幫助;第二種是通過內部API的方式,由字面意思可知,只有Android應用程式才可以做到,並且這種方法只在本應用中生效,因此對我們來說也不是特別的理想;還有一種方法就是注入事件到裝置/dev/input/eventX,本次我們介紹的sendevent方法,其實就是通過/dev/input/eventX來實現事件模擬的,學會了這個之後就可以做到舉一反三,之後所有的點觸操作的模擬都可以以此類推。

獲得事件

  我來說說我是怎麼做的。

  首先我在手機的shell下輸入了getevent命令,這樣就可以接收到手機上操作的所有event事件。

  

  這個時候我們按下我們手機電源鍵,來看看可以接收到哪些事件資訊,按下電源鍵後:

  

  我們得到了以上四條資訊。

  我們來以第一條為例分析一下獲得是什麼? 

  /dev/input/event0:  代表 device

  0001                         代表一個type

  0074                         代表power鍵的code(為16進位制)

  00000001                 代表value 一般 1代表按下,0代表放開。

  根據查閱sendevent 需要的引數為就是device、type、code、value。

  於是我們就可以通過下面四條命令即可完成按power鍵的操作,中間sleep的時間長度大於2秒,系統就認為是長按:

sendevent /dev/input/event0 1 116 1(0074轉化為十進位制後為116)
sendevent /dev/input/event0 0 0 0
sleep 3
sendevent /dev/input/event0 1 116 0
sendevent /dev/input/event0 0 0 0

sh指令碼

  當知道了如何模擬長按電源鍵之後,那麼我們如何用在自動化中呢?這裡我打算介紹一下shell指令碼

  眾所周知Android是基於linux核心的,而shell指令碼可以執行在linux中,所以我們試試用sh指令碼是否可以在Android中執行。

  1、完成指令碼

    因為Android本身內部沒有vi,因此我打算在Windows上寫好指令碼然後匯入進去,指令碼內容為:

複製程式碼

#!/bin/sh

sendevent /dev/input/event0 1 116 1
sendevent /dev/input/event0 0 0 0
echo "down"
sleep 3
sendevent /dev/input/event0 1 116 0
sendevent /dev/input/event0 0 0 0
echo "up"

複製程式碼

  2、匯入手機

    這一步不用多說,將指令碼名稱儲存為 "boy.sh",然後使用adb匯入手機sd卡。

     

  3、加許可權

    一般linux系統中,匯入的檔案可能沒有許可權,因此我們需要加許可權後再執行,於是我做了下面的操作:

    

    執行後提示我沒有許可權,明明剛才加了許可權的,我們來檢視一下檔案:

    

    仔細一看果然沒有加許可權成功,懷疑自己剛才是不是打錯了,於是又試了一次,還是不行。  

    最終經過不斷的嘗試,發現原來是sd卡是無法加許可權的,必須要把檔案放到 /data/data/的目錄下才可以:

    

    終於許可權加成功了。

  4、執行

    許可權加成功後,迫不及待的去執行:

    

    還是提示有問題,後來也是不斷嘗試才知道,原因是手機的啟動命令和linux還是有差別,使用下面的啟動方法即可:

    

    執行完成之後,觀察手機,出現了長按電源鍵後的效果: