测试成长记录:python调adb无法获取设备信息bug记录

背景介绍:

一直在负责公司Android自动化的编写工作,采用的是uiautomator2,需要获取设备id来连接设备,就是 adb devices

问题描述:

之前一直用 subprocess.check_output(['adb','devices']) 来获取返回值,再用正则匹配id出来,但突然有一天  ubprocess.check_output(['adb','devices']) 的返回值变成了空。

而在cmd运行 adb devices 却是正常的,而且  subprocess.check_output(['adb','help'])等命令执行又是正常的,只有执行获取设备信息方面的命令拿不到返回值

测试成长记录:python调adb无法获取设备信息bug记录

测试成长记录:python调adb无法获取设备信息bug记录

问题分析:

这让我很是头大,第一次遇到这个问题,我先后尝试过重装python、adb、AndroidSDK,但都没有用,请教过很多人也都说没遇到过,后来又去testhom 和  Stack Overflow去发帖求助,也没找到答案

我试着去查看python 的subprocess.py 的源码,大概情况是这样子:

subprocess.check_output() 里面调用的是 一个run() 方法

def check_output(*popenargs, timeout=None, **kwargs):
#省略~~~~~~
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
**kwargs).stdout

而run()方法最终调用的是 Popen()

def run(*popenargs,
input=None, capture_output=False, timeout=None,
check=False, **kwargs):
.......
........
with Popen(*popenargs, **kwargs) as process:
try:
stdout, stderr = process.communicate(input, timeout=timeout)
except TimeoutExpired as exc:
process.kill()

在debug过程中发现在 popen这一步就已经失败了,随后又进入Popen()查看,发现最终是 死在了 Start the process  这里(subprocess 模块,1200行那块)

测试成长记录:python调adb无法获取设备信息bug记录

  看情况是创建process时失败了,随后猜想可能是被系统拦截了,或者没有权限~~

最终结果:

我找到adb.exeg 给它加上了所有的权限,运行仍就失败~不起作用

  后来看到里面有个兼容性的选项,我试着打了√再去运行,~~神奇的事情发生了,竟然就可以了emmmmm

总结:

  至今出现这个问题的原因仍就没搞明白,不知道为什么会出现这个问题,由于能力有限,再往深也查不下去了;但这里肯定是有问题的,因为最初搭建环境的时候adb并没有勾选

兼容模式,执行subprocess.check_output()是可以获取到结果的,但后面突然就拿不到了~~如果有大神知道原因的话可以一起交流一下,我也很想弄明白这到底是什么问题

上一篇:QoS令牌桶工作原理


下一篇:python+adb实现自动化获取手机信息