老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 3...

本文详细解析了ADB后台如何通过设备序列号找到指定设备。首先介绍了findAttachedDevice方法内部实现,通过序列号正则表达式筛选出目标设备。接着深入分析了AndroidDebugBridge对象如何获取最新连接的设备列表,并探讨了DeviceMonitor线程监控设备变动的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往下我们先重点分析119行findAttachedDevice是如何根据设备序列号找到目标Device对象的,然后再去分析AdbChimpDevice是如何构造起来的。我们先进入到findAttachedDevice方法中:

 

99   private IDevice findAttachedDevice(String deviceIdRegex)  

100   {  

101     Pattern pattern = Pattern.compile(deviceIdRegex);  

102     for (IDevice device : this.bridge.getDevices()) {  

103       String serialNumber = device.getSerialNumber();  

104       if (pattern.matcher(serialNumber).matches()) {  

105         return device;  

106       }  

107     }  

108     return null;  

109   }  

代码8-6-4 AdbBackend - findAttachedDevice

 

在第3节分析“启动AndroidDebugBridge”的过程中我们已经学习了AdbBackend在初始化AndroidDebugBridge对象后会将该实例保存到自身的bridge成员对象里面,所以这个方法做的事情就是通过这个AndroidDebugBridge实例去获得所有最新的Device设备列表(102行),然后比对每个Device设备的序列号和参数提供的时候吻合,如果是的话就返回(103-105行)。

我们先看下是怎么获得设备列表的:

482   public IDevice[] getDevices()  

483   {  

484     synchronized (sLock) {  

485       if (this.mDeviceMonitor != null) {  

486         return this.mDeviceMonitor.getDevices();  

487       }  

488     }  

489   

490     return new IDevice[0];  

491   }  

代码8-6-5 AdbBackend - getDevices

 

AndroidDebugBridge对象起启动DeviceMonitor设备监控线程对象后会将该对象保存起来到mDeviceMonitor成员变量里面,这些我们在前面都学习过了。这里AndroidDebugBridge的getDevices方法就是去DeviceMonitor对象中调用其getDevices方法来获取最新的设备列表的:

 

129   Device[] getDevices()  

130   {  

131     synchronized (this.mDevices) {  

132       return (Device[])this.mDevices.toArray(new   

Device[this.mDevices.size()]);  

133     }  

134   }  

代码8-6-6 DeviceMonitor - getDevices

 

在第4节“启动设备监控线程DeviceMonitor”中我们已经学习了当DeviceMonitor在往ADB服务器发送监控命令“host:track-devices”后,一旦监控到有设备新增加或者移除或者状态变化等,就会将设备的改动更新保存到mDevices这个Device列表里面。以上方法返回的就是这一整个列表。

代码8-6-4 AdbBackend - findAttachedDevice中,findAttachedDevice在获得这个设备列表后,会取出每个设备的序列号来和目标设备序列号进行对比查找直接找到吻合的设备才返回,那么我们看下其对应的获取序列号的方法device.getSerialNumber():

 

244   public String getSerialNumber()  

245   {  

246     return this.mSerialNumber;  

247   }  

代码8-6-7 Device - getSerialNumber

 

直接返回的就是Device设备保存的mSerialNumber变量,这个变量就是代表了对应设备的序列号。大家应该还记得第4节”启动设备监控线程DeviceMonitor”中分析到“processIncomingDeviceData”方法时,一旦ADB服务器将最新的设备列表发送过来的时候就会取出每个设备的序列号和设备状态来初始化Device设备来把该设备的序列号,设备状态保存到该Device设备对应的mSerialNumber和mStat成员变量中。

转载于:https://www.cnblogs.com/poptest/p/5092325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值