1. 程式人生 > >第14章5節《MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-查詢ViewServer執行狀態

第14章5節《MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-查詢ViewServer執行狀態

com bridge turn ngs nor arch prot 我們 microsoft

上一小節我們描寫敘述了HierarchyViewer是怎樣組建ADB協議命令來實現ViewServer的port轉發的。在port轉發設置好後,下一個要做的事情就是去檢測目標設備端ViewServer線程是否已經啟動起來了。我們進入setupViewServer調用的DeviceBridge的isViewServerRunning方法:

165     public static boolean isViewServerRunning(IDevice device) {
166         final boolean[] result = new boolean[1];
167         try {
168             if (device.isOnline()) {
169                 device.executeShellCommand(buildIsServerRunningShellCommand(),
170                         new BooleanResultReader(result));
171                 if (!result[0]) {
172                     ViewServerInfo serverInfo = loadViewServerInfo(device);
173                     if (serverInfo != null && serverInfo.protocolVersion > 2) {
174                         result[0] = true;
175                     }
176                 }
177             }
178         } catch (TimeoutException e) {
               ...
187         }
188         return result[0];
189     }
代碼14-5-1 DeviceBridge - isViewServerRunning

關鍵代碼是上面的169行,通過Device類的實例來往ADB服務器發送對應的命令來檢測ViewServer是否已經在執行。

device.executeShellCommand在前面章節已經分析過了,就是用來發送”adb shell”命令的。

我們看下buildIsServerRunningShellCommand方法。看這個命令是怎樣組織起來的:

235     private static String buildIsServerRunningShellCommand() {
236         return String.format("service call window %d", SERVICE_CODE_IS_SERVER_RUNNING); 
237     }
代碼14-5-2 DeviceBridge - buildIsServerRunningShellCommand

而全局變量 SERVICE_CODE_IS_SERVER_RUNNING 的定義是:

 48     private static final int DEFAULT_SERVER_PORT = 4939;
 49     // These codes must match the auto-generated codes in IWindowManager.java
 50     // See IWindowManager.aidl as well
 51     private static final int SERVICE_CODE_START_SERVER = 1;
 52     private static final int SERVICE_CODE_STOP_SERVER = 2;
 53     private static final int SERVICE_CODE_IS_SERVER_RUNNING = 3;
代碼14-5-3 DeviceBridge - 全局變量演示樣例

236行整出來的這一串不就是”service call window 3”嘛。

所以結合device.sendShellCommand,其實就是往設備發送了命令”adb shell service call window 3”,上一章我們才用它來查詢ViewServer的執行狀態了!

註:很多其它文章請關註公眾號:techgogogo或個人博客http://techgogogo.com。當然,也很歡迎您直接微信(zhubaitian1)勾搭。本文由天地會珠海分舵原創。轉載請自覺,是否投訴維權看心情。


第14章5節《MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-查詢ViewServer執行狀態