2.方法原理
Python实现ADB访问功能有两种方式,一种是直接使用第三方库如“pure-python-adb”等,另外一种是通过进程调用的方法来实现adb的访问,如“Subprocess模块”。第三方模块原理上也是基于进程调用的方法来实现,只不过实现的方法都以模块的方式进行封装,用户无感。
本项目重点介绍在Python中,如何通过Subprocess模块实现ADB调试的功能。
3.知识补充3.1.何为ADB?

ADB (Android Debug Bridge) 是 Android 软件开发工具包(SDK)中的一个工具,用于与连接到计算机的 Android 设备进行通信和操作。它提供了一种方式来在开发过程中管理设备或模拟器,包括安装和调试应用程序、访问设备文件系统、执行 shell 命令等操作。ADB 是开发 Android 应用程序和调试设备的重要工具,也被广泛用于测试和分析 Android 设备和应用程序的性能。
3.2.何为Subprocess?

subprocess 模块是Python标准库中的一个模块,用于在Python程序中创建和管理新的进程,以便与操作系统进行交互。它提供了一个简单而强大的接口,可以执行系统命令、启动新的进程、连接到进程的输入/输出流,并获取进程的返回值。
主要功能包括:
<a>.运行外部命令:可以使用 subprocess.run() 函数来运行系统命令或可执行文件。该函数接受一个命令列表作为参数,可以指定命令的参数、输入、输出等选项。
<b>.连接到进程的输入/输出流:可以使用 subprocess.Popen() 函数启动新的进程,并获取其标准输入、标准输出和标准错误流,从而与进程进行交互。
<c>.等待进程完成:可以等待子进程完成并获取其返回码,以便根据进程的执行结果采取后续操作。
<d>.处理输入和输出:支持从进程读取输出或向进程发送输入数据,可以通过管道或文件描述符进行交换。
<e>.控制进程的环境变量:可以设置和修改进程执行时的环境变量,以影响进程的行为。
4.设计实现subprocess常用的subprocess.run()和subprocess.Popen()。
4.1.subprocess.run方法
subprocess.run是 Python 标准库中用于运行子进程的函数之一,是 subprocess 模块中的一个高级函数,用于替代较低级别的函数如 subprocess.call()。它的作用是启动一个新的进程,执行指定的命令,等待命令执行完成,并返回一个 CompletedProcess 对象,该对象包含有关进程执行的信息。
该方法接口定义如下:
subprocess.run(args, , stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, text=None, encoding=None, errors=None, env=None, universal_newlines=None)
args:必需,要执行的命令及其参数。可以是字符串(例如 "ls -l")或列表形式(例如 ["ls", "-l"])。stdin, stdout, stderr:这些参数控制子进程的标准输入、标准输出和标准错误流。可以是 subprocess.PIPE(创建管道)、subprocess.DEVNULL(丢弃输出)、文件描述符或文件对象。input:作为标准输入传递给子进程的数据。如果指定了 input 参数,它会覆盖 stdin 参数。capture_output:如果设置为 True,则捕获子进程的标准输出和标准错误,并作为结果返回。默认为 False。shell:如果设置为 ,则通过 shell 执行命令。默认为 。在使用时应当谨慎,以避免潜在的安全风险。cwd:指定子进程的工作目录。timeout:设置子进程的超时时间,超过该时间将会抛出 TimeoutExpired 异常。check:如果设置为 ,并且进程返回非零退出码,则会抛出 CalledProcessError 异常。text, encoding, errors:这些参数用于控制输入和输出的文本处理。text=True 表示使用文本模式(默认),encoding 指定编码,errors 指定解码时的错误处理策略。env:指定子进程的环境变量。默认为当前进程的环境变量。universal_newlines:如果设置为 ,则行尾换行符会被转换为 \n。
4.2.subprocess.Popen方法
subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), encoding=None, errors=None, text=None, umask=None, timeout=None, check=False)
参数说明:args:(字符串或者序列),要执行的命令及其参数,可以是字符串(会被解析为命令和参数的序列)或者序列(命令及其参数的列表或元组)。bufsize:(整数)默认值为-1,用于指定缓冲策略,0 表示不缓冲,1 表示行缓冲,大于 1 表示缓冲区大小。如果设置为 -1,则使用系统默认的缓冲大小。executable:(字符串),默认值为None,可选的可执行程序路径,用于指定要执行的解释器。stdin, stdout, stderr:(文件对象、文件描述符或者 subprocess.PIPE),默认值为None,用于指定子进程的标准输入、输出和错误输出的文件描述符。可以为 subprocess.PIPE 创建管道以进行通信,或者为 None 表示继承父进程的相应流。preexec_fn:(可调用对象),默认值为None,可选的可调用对象,在子进程开始执行前调用,例如用于设置进程组、改变进程优先级等。close_fds:(布尔值)默认值为True,用于指定在启动子进程时是否关闭所有文件描述符,如果设置为 False,则会继承父进程的文件描述符。shell:(布尔值),默认值为False,如果为 True,则通过 shell 来执行命令。在使用时需要注意安全性,可能会引入安全风险。cwd:(字符串),默认值为None,用于指定子进程的工作目录。env:(字典),默认值为None,用于指定子进程的环境变量。universal_newlines:(布尔值),默认值为False,如果为 True,则输出以文本模式而非字节模式进行处理。startupinfo, creationflags:(平台相关的对象或者整数),默认值为None,用于设置子进程的一些启动信息,例如在 Windows 系统下可以设置窗口属性等。restore_signals:(布尔值)默认值为True,用于指定在子进程结束时是否恢复父进程的信号处理设置。start_new_session:(布尔值)默认值为False,如果为 True,则将子进程放入一个新的会话中,通常与 preexec_fn 结合使用。pass_fds:(元组)默认值为空元组 (),用于传递给子进程的文件描述符。encoding, errors:(字符串)默认值为None,用于指定文本模式的编码和错误处理方式。text:(布尔值)默认值为None,替代参数 universal_newlines,用于指定是否以文本模式处理输入输出。umask:(整数)默认为None,用于指定子进程的文件创建权限掩码。timeout:(浮点数或者整数)默认值为None,用于设置超时时间,如果子进程在指定时间内没有结束,则会抛出超时异常。check:(布尔值)默认值为False,如果为 True,则会在子进程返回非零状态码时抛出异常 subprocess.CalledProcessError。
下一篇文章实例讲解pyadb封装的方法和实现方式。
============================
关注作者:艾柯
一名5年的嵌入式架构师、系统分析师
爱好写作,只分享有用的干货
我的故事不是你的未来,但一定对你有所启示
举报/反馈