第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动 7

514行首先给ADB服务器发送监听请求获得所有可调试的应用进程PID列表:

674     private boolean sendDeviceMonitoringRequest(SocketChannel socket, Device device)

675             throws TimeoutException, AdbCommandRejectedException, IOException {

676

677         try {

678             AdbHelper.setDevice(socket, device);

679

680             byte[] request = AdbHelper.formAdbRequest("track-jdwp"); //$NON-NLS-1$

681

682             AdbHelper.write(socket, request);

683

684             AdbResponse resp = AdbHelper.readAdbResponse(socket, false /* readDiagString */);

685

686             if (!resp.okay) {

687                 // request was refused by adb!

688                 Log.e("DeviceMonitor", "adb refused request: " + resp.message);

689             }

690

691             return resp.okay;

692         }

...//省略错误处理代码

}

代码8-4-8 DeviceMonitor - sendDeviceMonitoringRequest

 

其实这段代码和上面的“代码8-4-5 DeviceMonitor - sendDeviceListMonitoringRequest”是类似的,只是发送是要在678行先把连接切换到目标监控设备(AdbHelper.setDevice方法将在下一章进行想尽描述)以及最后发送的命令变成是”track-jdwp”命令而已。最终这个命令其实等同于你在命令调用ADB命令行客户端发送命令”adb jdwp”,返回来的就是所有可调式应用进程的PID,请看以下输出结果示例,其与上图8-4-1中DDMS的Devices模块打印的进程PID是一致的:

 

图 8-4-2 adb jdwp 命令输出

获取到设备里面运行的可调试进程PID列表后,大家应该也可以想到下一步动作就是为每一个PID,也就是为每一个进程的vm虚拟机创建一个客户端线程来通过JDWP协议监控调试了,这也就是为什么DDMS能够动态获得每个进程的动态信息的原因了。

进程VM虚拟机监控代码分析到这里在本书中应该就算差不多了,如果再往下分析的话就需要去分析DDMS更多的知识以及JDWP协议相关的东西了,毕竟这不是我们这本书的重点,所以分析到这里让大家对DDMS工作原理有个基本认知就好了,再往下分析一大堆不相关代码就有走题和凑字数的嫌疑了。

这里我们根据上面承诺的,还是要看看“代码8-4-6 DeviceMonitor - updateDevices处理新增加设备”中481行对新增加的设备是如何通过调用“queryNewDeviceForInfo”这个方法来获取基本信息的,获取的又是什么信息:

442     private void queryNewDeviceForInfo(Device device) {

443         // TODO: do this in a separate thread.

444         try {

445             // first get the list of properties.

446             device.executeShellCommand(

“getprop”,

447                     new GetPropReceiver(device));

448

449             queryNewDeviceForMountingPoint(device,

“EXTERNAL_STORAGE”);

450             queryNewDeviceForMountingPoint(device,

“ANDROID_DATA”);

451             queryNewDeviceForMountingPoint(device,

“ANDROID_ROOT”);

452

453             // now get the emulator Virtual Device name (if applicable).

454             if (device.isEmulator()) {

455                 EmulatorConsole console = EmulatorConsole.getConsole(device);

456                 if (console != null) {

457                     device.setAvdName(console.getAvdName());

458                     console.close();

459                 }

460             }

461         }

...//省略错误处理部分代码

}

代码8-4-9 DeviceMonitor - queryNewDeviceForInfo


你可能感兴趣的:(软件测试开发)