从以上代码中我们可以看到该方法去装备ViewServer主要做的事情有如下几点:

  • 40行:设置本地端口到目标机器端ViewServer监听端口的端口转发

  • 41-54行:确定ViewServer线程是否已经启动,没有的话就启动它。

  • 55行:获取ViewServer的版本以及其支持的协议版本

本小节我们先描述第一点,看HierarchyViewer是如何设置本地端口到目标机器端ViewServer监听端口的端口转发的。在第13章第2小节我们也手动做过这个事情,当时发送的命令是:

adb forward tcp:4939 tcp:4939

那么HierarchyViewer是不是也是通过代码做相同的事情呢?那么我们带着这个疑问来进入深入的代码分析。我们进入setupDeviceForward这个方法:

110     /** 

111      * Sets up a just-connected device to work with the view server. 

112      * <p/> 

113      * This starts a port forwarding between a local port and a port on the 

114      * device. 

115      * 

116      * @param device 

117      */  

118     public static void setupDeviceForward(IDevice device) {  

119         synchronized (sDevicePortMap) {  

120             if (device.getState() == IDevice.DeviceState.ONLINE) {  

121                 int localPort = sNextLocalPort++;  

122                 try {  

123                     device.createForward(localPort, DEFAULT_SERVER_PORT);  

124                     sDevicePortMap.put(device, localPort);  

125                 } catch (TimeoutException e) {  

126                     Log.e(TAG, "Timeout setting up port forwarding for " + device);  

127                 } catch (AdbCommandRejectedException e) {  

128                     Log.e(TAG, String.format("Adb rejected forward command for device %1$s: %2$s",  

129                             device, e.getMessage()));  

130                 } catch (IOException e) {  

131                     Log.e(TAG, String.format("Failed to create forward for device %1$s: %2$s",  

132                             device, e.getMessage()));  

133                 }  

134             }  

135         }  

136     }  

代码14-4-2 DeviceBridge - setupDeviceForward