天地會珠海分舵注:本來這1系列是準備出1本書的,詳情請見早前博文“尋求合作火伴編寫《深入理解 MonkeyRunner》書籍“。但由于諸多緣由,沒有如愿。所以這里把草稿分享出來,所以毛病在所難免。有需要的就參考下吧,轉發的話還請保存每篇文章結尾的出處等信息。
MonkeyRunner使用起來非常的簡單,只需要導入以下幾個類基本上就可以滿足測試腳本編寫的需求,比如:
如果你想使用MonkeyRunner的控件相干的功能來讓自己的代碼可擴大性和可移植性更好,那末你也只需額外用上下面幾個類就基本上能滿足你的要求了:
如果你還想更簡單的使用控件相干的功能,MonkeyRunner一樣也能夠滿足你,只要你導入以下的類就能夠使用EasyMonkeyDevice來調用其封裝好的易用的API:
所以從腳本的角度來看,使用MonkeyRunner可以簡單的理解成把需要的類給整合起來,然后通過代碼把相應的業務邏輯通過各個類提供的方法給實現出來。?
但從MonkeyRunner實現的角度來看,事實并沒有這么簡單,為了滿足MonkeyRunner腳本需要的功能,全部框架里面會使用到不同的庫和不同的模塊,乃至會驅動Android機器真個不同模塊與服務來做事情。我們先看下MonkeyRunner的全部架構圖:
MonkeyRunner是1個CS(客戶端-服務器)架構的框架,主要的代碼控制邏輯是在PC端作為客戶端來運行的;但客戶端需要驅動運行在目標Android系統的服務器端來做事情,比如驅動Monkey服務去調用對應的Android服務去注入事件以實現點擊等操作功能。服務器端和客戶真個通訊是通過Socket來實現的,而Socket又分為基于USB通訊協議和TCP通訊協議的,也就是說用戶既可以通過 USB線直接連接主機和Android目標機器;也能夠通過網絡使用TCP協議來連接主機和 Android目標機器(使用命令:adb connect IP)。但注意客戶端其實不會直接連接Android目標裝備端中各個服務正在監聽的端口,而是連接主機端和該端口對應的轉發端口,只要連接上轉發端口,所有發向該端口的數據都會直接轉發給Android目標機器端對應的服務監聽的端口。
從上圖可以看到,MonkeyRunner腳本的實現需要多個庫的支持,經常使用的有以下這幾個:
往下1層我們可以看到,MonkeyRunner跟Android目標機器進行通訊根據需要做的事情不同而會驅動3種不同的服務去處理要求:
這里要注意的是MonkeyRunner框架其實不會直接連接adbd這個Android目標機器的守護進程來驅動其做事情,而是先和ADB服務器這個PC真個守護進程進行通訊,然后再由ADB服務器來驅動adbd來完成要求的。至于ADB服務器,ADB守護進程,ADB協議和ADB命令行客戶端等概念,第4章”ADB協議及服務“會詳述。
最下面1層就是Android系統的核心服務了。MonkeyRunner的很多要求都是需要調用到Android的系統服務來完成的。比如點擊1個控件就需要通過monkey服務來調用Android系統的InputManagerService來注入按鍵事件來實現點擊要求。
作者:天地會珠海分舵
微信公眾號:TechGoGoGo
微博:http://weibo.com/techgogogo
CSDN:http://blog.csdn.net/zhubaitian