Relay是Google开源的一个Android硬件自动化测试框架,它的核心思路是用软件控制继电器板上的物理开关,模拟人对设备的真实操作。为什么要这样做?因为像拔插USB线、插拔SIM卡、长按电源键强制重启这类动作,纯软件指令往往无法替代,必须依赖真实的物理通断。Relay框架用Python编写,配合USB继电器板(比如Numato Labs的型号),可以让这些原本只能人工完成的操作变成可重复、可编排的自动化用例。

Relay框架的工作原理与硬件准备
Relay的整体架构分为三层:最上层是Python测试脚本,负责编排测试逻辑;中间层是Relay提供的设备抽象类,例如android_relay_device.AndroidRelayDevice,它把继电器和被测设备组合成一个逻辑整体;最底层是继电器板驱动,通过串口协议控制具体的继电器通道。
硬件方面,你需要一块支持USB串口控制的继电器板。Google在官方示例中推荐的是Numato Labs的8通道USB继电器模块,接线时需要将继电器的公共端和常开/常闭端串接到目标电路中。举个例子,如果想模拟充电线的插拔,就把继电器的触点串在充电器的VBUS线上,脚本控制继电器吸合等同于插上充电器,断开则等同于拔掉充电器。
除了继电器板,被测设备通常还需要通过USB连接到测试主机,以便使用adb命令查询状态。整套环境建议运行在Ubuntu系统上,因为Relay依赖的pyserial和adb工具链在Linux下表现最稳定。
环境搭建与核心API使用
环境搭建的第一步是安装Relay源码,它托管在GitHub的android项目仓库中。拿到源码后,需要安装Python依赖,主要是pyserial。接着要为继电器板配置串口权限,Ubuntu下可以把当前用户加入dialout组,否则运行脚本时会报Permission denied错误。典型的配置步骤如下:
# 克隆Relay源码 git clone https://github.com/google/android-relays cd android-relays # 安装Python依赖 sudo apt install python3-pip pip3 install pyserial # 将当前用户加入dialout组以获取串口权限 sudo usermod -aG dialout $USER
配置完成后,就可以编写测试脚本了。Relay通过一个JSON配置文件描述继电器板和设备的对应关系,脚本中用AndroidRelayDeviceRc类加载配置,然后调用setup_relay初始化每个通道。下面是一个模拟充电插拔的示例:
from mobly import base_test
from mobly import test_runner
from relay import android_relay_device
from relay import android_relay_device_rc
class ChargeTest(base_test.BaseTestClass):
def setup_class(self):
# 加载继电器配置,relays_config描述了串口和通道映射
self.dut = android_relay_device_rc.AndroidRelayDeviceRc(
config=self.user_params['AndroidDevice'][0],
relays_config=self.user_params['relays_config'][0])
self.dut.setup_relay('Charger')
def test_charge_cycle(self):
# 吸合继电器,等效于插入充电器
self.dut.relay('Charger').set_nc(True)
self.dut.adb.shell('dumpsys battery')
# 断开继电器,等效于拔出充电器
self.dut.relay('Charger').set_nc(False)
if __name__ == '__main__':
test_runner.main()这个脚本基于Mobly测试框架运行,Mobly也是Google开源的测试基础设施。Relay的设备类在初始化时会自动执行adb连接检查,如果设备没有授权,脚本会在setup阶段直接失败并给出提示。注意set_nc(True)表示常闭触点导通,具体用哪个方法取决于你的接线方式是常开还是常闭。
常见问题排查与测试实践建议
串口识别是新手最容易踩的坑。插上继电器板后,先用dmesg | grep tty确认系统是否识别出了ttyUSB设备。如果没有任何输出,可能是缺少驱动或者USB线只支持充电不支持数据传输,换一根质量好的数据线往往能解决。如果识别出了设备但脚本报串口占用,检查是否有brltty服务占用了USB串口,执行sudo apt remove brltty后重新插拔即可。
另一个常见问题是继电器动作了但设备没有反应。这种情况多半出在接线上:继电器触点的负载能力要大于被控电路的电流,模拟USB插拔时尤其要注意,部分继电器板的触点电阻偏高,可能导致VBUS压降过大,设备识别不到充电事件。建议先用万用表确认吸合后触点两端的压降。
在编写长期运行的稳定性测试时,还有几点实践经验值得参考。第一,每次继电器动作之间加入合理的延时,物理触点需要消抖时间,频繁通断容易损坏触点;第二,把adb状态查询封装成带重试的辅助函数,避免设备偶尔的adb断连导致整个用例误判失败;第三,测试日志中记录每次继电器动作的时间戳,配合设备的dumpsys日志做交叉分析,定位问题时效率会高很多。对于需要循环上百次的插拔测试,建议同时监控设备温度,长时间快速充放电循环可能触发设备的温控保护,这属于被测设备的正常行为,不要误判为测试失败。
总的来说,Relay框架虽然小众,但它是Android硬件在环测试中非常实用的工具,搭配Mobly可以构建出覆盖充电、SIM卡、按键等物理场景的完整自动化用例,适合工厂产线测试和实验室长稳测试两类场景。
Android Relays继电器测试自动化测试修改时间:2026-09-04 12:58:35