這兩天在讀Android Monkey的原始碼.代碼不多,放出分享.
我現說一下,Monkey是幹什麼的:簡單的說就是,類比使用者的touch screen和keyboard的輸入.其實這個功能就已經很恐怖了. Google自己說的下面:
// Only bind this to local host. This means that you can only// talk to the monkey locally, or though adb port forwarding.
就是覬覦這個強大的力量.Monkey是用JAVA寫成的,但是我們確可以這樣運行:
$adb shell monkey ......
這是為什麼呢?是因為在/system/bin目錄下有一個monkey的shell指令碼.內容如下:
# Script to start "monkey" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/monkey.jarexec app_process $base/bin com.android.commands.monkey.Monkey $*
exec 會運行起/system/framework/monkey.jar這隻Java程式.後面我們還會用到這個指令碼.
先給出Monkey的架構圖:
又是我的手繪圖.哈哈.實際上,並不複雜.
Monkey.java 裡面有main()函數.而main()->Run().Run()裡面作了下面的操作:1.processOptions()初始化參數(通過傳入入參來初始化參數).還有一些的操作函數如:nextOption() nextOptionLong()。。2.做介面的檢查,也就是申請這些介面資源.3.關鍵的一步: if(mServerPort!=1) { try{ mEventSource = new MonkeySourceNetWork(mServerPort); ...省略 開始ServerSocket.監聽使用者輸入的command.4.mNetworkMonitor.Start();開始監控網路狀態5.關鍵的一步: runMonkeyCycles(),代碼如下: while() { MonkeyEvent ev = mEventSource.getNextEvent(); ev.inject(....); ...省略 開始Event loop,把每個CommandQueue中的訊息都執行.6.mNetworkMonitor.Stop()
這裡我們看到使用了SocketServer,所以理論上來說,可以在PC端發送command給device,但是必須透過USB的串連.這點我在上面已經說的很清楚了.(PC端,Android不可能幫你實現,我們只要在PC端使用Socket向device發送命令就可以了).
好了,我們接著往下分析:
MonkeyEvent的實現是典型的OO思想.MonkeyEvent.java僅僅是一個abstract class.最重要的方法都由子類去實現.(把Event放入當前的Activity去運行)public abstract int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose);monkey*Event.java都是MonkeyEvent.java的子類.
這次先寫這麼多了...
Update!