使用Python和ADB控制Android手机的完整指南
本文详细介绍如何利用Python结合ADB工具控制Android设备。内容涵盖ADB环境配置、pure-python-adb库安装、scrcpy辅助工具使用,以及通过shell命令实现屏幕触摸、相机自拍计时器和浏览器搜索截图等具体自动化脚本的编写与实战应用。
一、介绍
ADB(Android Debug Bridge,Android调试桥)是一款命令行工具,用于与Android设备建立连接并进行交互。借助ADB,用户可以执行安装应用、调试程序、探索隐藏功能以及直接通过Shell与设备交互等多种操作。要启用ADB功能,需先在设备上解锁开发者选项并开启USB调试。具体操作为:进入设备设置,滑至“关于手机”部分,找到当前软件版本号,连续点击该版本号7次以激活开发者选项。随后,在设置菜单中找到“开发者选项”面板,在其中开启“USB调试”开关。最后,使用USB数据线将设备连接至计算机即可完成基础连接准备。
本文的主要内容包括以下几个部分:
1. 安装前置要求
2. 环境配置与连接
3. 脚本编写基础
4. 实战案例:创建自拍计时器
5. 实战案例:创建定义搜索器
二、安装要求
首先需要在计算机上安装ADB工具。若已安装Android Studio,ADB通常已包含其中,无需额外操作。否则,可访问[官方文档](https://developer.android.com/studio/command-line/adb),按照页面顶部的指引完成安装。
安装ADB后,需通过pip安装Python库以便与ADB及设备进行接口交互。执行以下命令安装pure-python-adb库:pip install pure-python-adb。
可选步骤:为简化开发过程,可安装开源软件scrcpy。该工具允许在计算机屏幕上显示并控制Android设备,支持鼠标和键盘操作。访问[Github仓库](https://github.com/Genymobile/scrcpy)下载对应操作系统(Windows、macOS或Linux)的版本。若使用Windows系统,将压缩包解压至指定目录,并将该目录路径添加到系统环境变量PATH中。此后,只需在终端输入scrcpy即可从任意位置启动该程序。
三、入门
依赖项安装完毕后,即可启动ADB并连接设备。首先通过USB线将设备连接至PC,若已启用USB调试,屏幕会弹出授权提示,询问是否允许计算机控制设备,点击“允许”即可。接着在PC终端输入命令adb start-server启动ADB服务器,预期输出如下信息:
- daemon not running; starting now at tcp:5037
- daemon started successfully
若已安装scrcpy,可在终端输入**scrcpy**启动投屏程序。注意,此命令仅在scrcpy已加入系统PATH时有效;若未加入,需将终端目录切换至scrcpy安装目录,并执行scrcpy.exe**以启动可执行文件。若操作顺利,PC屏幕上应显示设备画面,并可通过鼠标键盘进行控制。
接下来,创建一个新的Python文件,验证是否可通过该库识别已连接的设备:
rom ppadb.client import Client as AdbClient
if __name__ == '__main__':
client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037
devices = client.devices()
if len(devices) == 0:
print('No devices')
quit()
device = devices[0]
print(f'Connected to {device}')
在此代码中,导入AdbClient类并实例化一个客户端对象。随后获取已连接设备的列表,并从列表中取出第一台设备(若仅连接一台设备,则通常即为该设备)。
四、编写脚本的基础
与设备交互的主要方式是通过Shell命令,借此可发送指令以模拟特定位置的触摸或执行从A点到B点的滑动操作。要模拟屏幕触摸(点击),需先了解屏幕坐标系的工作机制。为辅助定位,可在开发者选项中启用“指针位置”功能。启用后,屏幕任意触摸点的坐标将实时显示在顶部。坐标系规则如下:

该图显示了坐标系的工作方式
显示屏左上角对应坐标(0,0),右下角对应x和y坐标的最大值。
明确坐标系后,需掌握可执行的各类命令。以下列出常用命令及其用法,供快速参考:
Input tap x y
Input text “hello world!”
Input keyevent eventID
Here is a list of some common eventID's:
3: home button
4: back button
5: call
6: end call
24: volume up
25: volume down
26: turn device on or off
27: open camera
64: open browser
66: enter
67: backspace
207: contacts
220: brightness down
221: brightness up
277: cut
278: copy
279: paste
如需查找更多命令,可参考此长列表:https://forum.xda-developers.com/t/q-adb-input-keyevent-for-long-press-on-power- button.2063741 / post-64890206。
五、创建自拍计时器
了解基本操作后,开始编写第一个示例:快速自拍计时器。首先导入库并创建一个connect函数以连接设备:
import time
from ppadb.client import Client as AdbClient
def connect():
client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037
devices = client.devices()
if len(devices) == 0:
print('No devices')
quit()
device = devices[0]
print(f'Connected to {device}')
return device, client
可见connect函数与前述连接示例基本一致,区别在于此处返回device和client对象,以便后续调用。
if __name__ == '__main__':
device, client = connect()
# open up camera app
device.shell('input keyevent 27')
# wait 5 seconds
time.sleep(5)
# take a photo with volume up
device.shell('input keyevent 24')
print('Taken a photo!')
在主代码中调用connect函数获取device和client对象。随后,打开相机应用,等待5秒后自动拍照。流程简洁明了,正如前文所述,这仅是模拟手动操作步骤的自动化实现。建议先手动执行一遍操作并记录步骤,再转化为脚本,这是编写此类脚本的最佳实践。
六、创建定义搜索器
接下来尝试更复杂的任务:要求浏览器搜索特定单词的定义,并截图保存至计算机。
该程序的基本执行流程如下:
1. 打开浏览器
2. 点击搜索栏
3. 输入搜索查询
4. 等待加载
5. 截图并保存
在开始编码前,需通过前述方法确定默认浏览器搜索栏的坐标。以我的设备为例,坐标为(440,200)。
首先导入与之前相同的库,并保留相同的connect方法。
import time
from ppadb.client import Client as AdbClient
def connect():
client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037
devices = client.devices()
if len(devices) == 0:
print('No devices')
quit()
device = devices[0]
print(f'Connected to {device}')
return device, client
在主函数中调用connect函数,并为搜索栏的x和y坐标分配一个变量。注意该变量应为字符串而非列表或元组,以便直接嵌入Shell命令中。同时,通过input获取用户想要查询定义的单词:
if __name__ == '__main__':
device, client = connect()
search_bar = '440 200' # x y
query = input('What word do you want to find the definition of: ')
search_query = f'what is the definition of {query}'
将用户输入的查询词拼接到完整句子中,以确保能获取定义。随后打开浏览器,并将搜索查询输入至搜索栏,代码如下:
device.shell('input keyevent 64')
time.sleep(0.25) # wait for browser to load
device.shell(f'input tap {search_bar}')
device.shell(f'input text "{search_query}"') # make sure you have the quotation marks around your text
device.shell('input keyevent 66')
time.sleep(3) # wait for results to load
此处使用eventID 66模拟输入键按下以执行搜索。可根据需要调整等待时间。
最后,在device对象上调用screencap方法获取屏幕截图,并保存为* .png *文件:
screenshot = device.screencap()
with open('result.png', 'wb') as f: # save the screenshot as result.png
f.write(screenshot)
print('Saved screenshot!')
此处需以写字节模式('wb')打开文件,因为screencap方法返回的是表示图像的字节数据。
若一切顺利,将得到一个快速搜索特定单词定义的脚本。该脚本在我的手机上运行正常:

七、最后的想法
希望本文能为您带来新的知识。在深入研究此功能前,我个人甚至不知其存在。其有趣之处在于,它可以模拟您日常手动执行的所有操作,甚至能实现更多自动化功能。
感谢您的阅读! 💖
到此这篇关于教你用python控制安卓手机的文章就介绍到这了,更多相关用python控制手机内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













