第14章5節《MonkeyRunner源代碼剖析》 HierarchyViewer實現原理-裝備ViewServer-查詢ViewServer執行狀態
阿新 • • 發佈:2017-07-30
com bridge turn ngs nor arch prot 我們 microsoft
代碼14-5-1 DeviceBridge - isViewServerRunning 代碼14-5-2 DeviceBridge - buildIsServerRunningShellCommand 代碼14-5-3 DeviceBridge - 全局變量演示樣例
上一小節我們描寫敘述了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 }
關鍵代碼是上面的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 }
而全局變量 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;
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執行狀態