◆版權聲明:本文出自胖喵~的博客,轉載必須注明出處。
轉載請注明出處:http://www.cnblogs.com/by-dream/p/5195121.html
起因
昨天群里看到有人問如何實現一個長按電源鍵的操作,這個問題經常遇到,而且對於新手來說也比較棘手,於是在嘗試成功后,決定說說這個事情。
一般這樣的需求都出現在自動化操作的過程中。但是一般的ui自動化貌似對長按操作都支持的不是特別好,即使有也是針對手機屏幕中的區域來進行長按,我們都知道電源鍵是一個實體鍵,無法通過點擊ui來實現。說道這里估計很多人都想到了KEYCODE(“KEYCODE” 在【Android測試】【第十二節】Uiautomator——API詳解 中的Uidevice的API列舉中有介紹),沒錯很多的自動化工具提供了通過KEYCODE來進行點擊,但是基本上沒有長按這一個操作,於是我們就需要借助Android本身的sendevent來進行輸入事件的模擬。
事件注入
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還是有差別,使用下面的啟動方法即可:
運行完成之后,觀察手機,出現了長按電源鍵后的效果: