最主流、最强大、最灵活的方式是使用 pure-python-adb 库,它允许你通过 Python 脚本直接执行 ADB (Android Debug Bridge) 命令,从而控制你的 Android 设备。

下面我将分步介绍如何实现这一点。
核心概念:ADB (Android Debug Bridge)
ADB 是一个强大的命令行工具,它允许你与模拟器或连接的 Android 设备进行通信,ADB 是整个过程的桥梁,你的 Python 脚本会发送命令给 ADB,ADB 再在 Android 设备上执行这些命令并返回结果。
ADB 的主要功能:
- 安装和调试应用。
- 访问 Unix Shell (可以执行 shell 命令)。
- 管理模拟器或手机上的端口映射。
- 在设备上复制文件。
使用 pure-python-adb 库 (推荐)
这是最推荐的方法,因为它不依赖 Java 环境,安装简单,功能全面。

步骤 1:准备工作
-
开启开发者选项和 USB 调试
- 在你的 Android 手机或模拟器上,进入
设置->关于手机。 - 连续点击
版本号或内部版本号7次左右,直到提示“您已处于开发者模式”。 - 返回
设置->系统->开发者选项。 - 打开
USB 调试开关。
- 在你的 Android 手机或模拟器上,进入
-
安装 ADB
- Windows: 最简单的方式是安装 Android Studio,它会自动为你配置好 ADB,或者,你可以下载 Platform Tools 并将其
platform-tools文件夹路径添加到系统环境变量PATH中。 - macOS / Linux: 通常可以通过包管理器安装。
- macOS (使用 Homebrew):
brew install android-platform-tools - Ubuntu/Debian:
sudo apt-get install android-tools-adb
- macOS (使用 Homebrew):
- Windows: 最简单的方式是安装 Android Studio,它会自动为你配置好 ADB,或者,你可以下载 Platform Tools 并将其
-
连接设备
- 通过 USB 连接: 使用 USB 线将手机连接到电脑,并在手机弹出的窗口中允许 USB 调试。
- 通过 Wi-Fi 连接 (推荐,更方便):
- 确保 手机和电脑在同一个 Wi-Fi 网络下。
- 通过 USB 连接手机,在命令行执行
adb tcpip 5555(5555 是默认端口,可以自定义)。 - 断开 USB 线。
- 在电脑上执行
adb connect <手机的IP地址>:5555。adb connect 192.168.1.10:5555。 - 之后你的设备就会一直保持无线连接状态,直到你执行
adb disconnect。
-
验证连接
(图片来源网络,侵删)- 在电脑的命令行中输入
adb devices,你应该能看到你的设备列表,并显示为device状态。List of devices attached 192.168.1.10:5555 device
- 在电脑的命令行中输入
步骤 2:安装 Python 库
打开你的终端或命令提示符,安装 pure-python-adb。
pip install pure-python-adb
步骤 3:编写 Python 脚本
现在你可以开始编写 Python 代码来与你的 Android 设备交互了。
示例 1:获取设备信息
from adb import adb_device
from adb.adb_device import AdbDeviceUsb, AdbDeviceTcp
import time
# --- 1. 连接到设备 ---
# 自动查找通过USB连接的设备
try:
device = AdbDeviceUsb().find()
if not device:
raise ConnectionError("未找到通过USB连接的设备,请确保已开启USB调试并连接。")
print(f"已通过USB连接到设备: {device.serial}")
except Exception as e:
print(f"USB连接失败: {e}")
# 如果USB失败,可以尝试TCP连接 (需要先配置好无线连接)
try:
device = AdbDeviceTcp("192.168.1.10", 5555) # 替换成你的设备IP和端口
device.connect()
print(f"已通过TCP连接到设备: {device.serial}")
except Exception as e_tcp:
print(f"TCP连接也失败: {e_tcp}")
exit()
# --- 2. 执行 ADB 命令并获取输出 ---
# 获取设备型号
model = device.shell("getprop ro.product.model")
print(f"设备型号: {model.strip()}")
# 获取Android系统版本
android_version = device.shell("getprop ro.build.version.release")
print(f"Android版本: {android_version.strip()}")
# 获取屏幕分辨率
resolution = device.shell("wm size")
print(f"屏幕分辨率: {resolution.strip()}")
# 检查Wi-Fi IP地址
ip_address = device.shell("ip addr show wlan0 | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}'")
print(f"Wi-Fi IP地址: {ip_address.strip() if ip_address else '未连接Wi-Fi'}")
# --- 3. 安装和卸载应用 ---
# 注意:你需要一个真实的APK文件路径
# apk_path = "/path/to/your/app.apk"
# print(f"正在安装应用: {apk_path}")
# device.install(apk_path)
# print("应用安装成功!")
# # 卸载应用 (包名)
# package_name = "com.example.myapp"
# print(f"正在卸载应用: {package_name}")
# device.uninstall(package_name)
# print("应用卸载成功!")
# --- 4. 截屏 ---
print("正在截屏...")
device.shell("screencap -p /sdcard/screenshot.png")
# 从设备拉取截图到电脑
device.pull("/sdcard/screenshot.png", "screenshot_from_python.png")
print("截图已保存为 'screenshot_from_python.png'")
# --- 5. 启动一个应用 (包名/Activity名) ---
# 启动浏览器
# device.shell("am start -a android.intent.action.VIEW -d https://www.google.com")
time.sleep(2) # 等待2秒
device.close() # 关闭连接
示例 2:自动化操作 (点击、输入)
自动化操作通常需要借助 UI 自动化框架,如 uiautomator2。pure-python-adb 本身不直接提供 UI 元素定位,但它可以启动这些框架的服务。
准备工作:
在设备上安装 uiautomator2 的服务器端。
adb shell pm install -r --user 0 https://github.com/openatx/uiautomator2/releases/download/v2.16.3/app-uiautomator2-v2.16.3.apk adb shell pm grant --user 0 com.github.uiautomator
Python 脚本示例:
from adb import adb_device
import uiautomator2 as u2
# 连接到设备
# 使用uiautomator2的连接方式,它会自动处理ADB连接
d = u2.connect("192.168.1.10:5555") # 替换成你的设备IP和端口
# 1. 点击屏幕上的某个坐标 (x, y)
# 假设我们要点击屏幕中央
# width, height = d.window_size()
# x, y = width // 2, height // 2
# d.click(x, y)
# print(f"已点击坐标: ({x}, {y})")
# 2. 启动一个应用并输入文本
# 启动设置应用
d.app_start("com.android.settings")
print("已启动 '设置' 应用")
# 等待应用启动并找到 "关于手机" 的文本元素
about_element = d(text="关于手机").wait.exists(timeout=10000)
if about_element:
print("找到 '关于手机' 元素,正在点击...")
about_element.click()
print("已点击 '关于手机'")
else:
print("未找到 '关于手机' 元素")
# 等待并找到 "版本号" 元素,并点击几次来激活开发者选项
version_element = d(text="版本号").wait.exists(timeout=5000)
if version_element:
print("找到 '版本号' 元素,正在快速点击7次...")
for i in range(7):
version_element.click()
time.sleep(0.1)
print("已快速点击7次,开发者选项已激活!")
else:
print("未找到 '版本号' 元素")
# 回到桌面
d.press("home")
print("已返回桌面")
# 关闭所有后台应用
d.press("recent")
time.sleep(1)
# 关闭第一个应用卡片
d(resourceId="com.android.systemui:id/dismiss_task").click()
d.session("uiautomator2").close() # 关闭uiautomator2会话
使用 SL4A (Scripting Layer for Android)
这是一种比较老但仍然有效的方法,它的原理是:在 Android 设备上安装一个 SL4A 服务器和 Python 解释器,然后你的 Python 脚本(部分)可以直接在设备上运行,从而直接调用 Android API。
工作流程:
- 在手机上安装: 你需要在手机上安装 SL4A 应用、Python for Android 解释器以及一些 Android API 的库(如
api_sl4a.py,android.py)。 - 编写脚本: Python 脚本通过一个 socket 连接到手机上的 SL4A 服务器。
- 调用 API: 连接成功后,你就可以调用
android模块里的函数来操作手机,如makeToast(),vibrate(),startActivity()等。
优点:
- Python 代码直接在 Android 环境中执行,响应速度快。
- 可以直接访问 Android 硬件传感器(加速度计、GPS等)。
缺点:
- 配置极其复杂,需要在手机上手动安装一堆依赖。
- 社区不活跃,文档和教程都比较陈旧。
- 灵活性不如
pure-python-adb+uiautomator2的组合。
简单示例代码 (需要先在手机上配置好SL4A):
import socket
import json
# SL4A 默认端口是 9999
HOST, PORT = '192.168.1.10', 9999
# 连接到手机上的SL4A服务
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# 发送一个RPC请求,调用Android的makeToast函数
# RPC协议是JSON格式
rpc_call = {
"id": 1,
"method": "call",
"params": ["self", "makeToast", "Hello from Python via SL4A!"]
}
# 发送请求
s.sendall((json.dumps(rpc_call) + '\n').encode())
# 接收响应
response = s.recv(1024)
print(f"SL4A 响应: {response.decode()}")
s.close()
总结与对比
| 特性 | pure-python-adb (推荐) |
SL4A |
|---|---|---|
| 工作原理 | Python在电脑上,通过ADB命令控制手机 | Python脚本在手机上运行 |
| 安装配置 | 简单 (只需安装ADB和Python库) | 复杂 (需在手机上安装多个组件) |
| 主要用途 | 自动化测试、设备管理、文件操作、UI自动化 (配合uiautomator2) | 快速原型开发、直接调用Android API |
| 性能 | 依赖ADB命令,有网络/USB延迟 | 高,直接在设备上执行 |
| 灵活性 | 极高,几乎可以执行任何ADB命令 | 受限于SL4A提供的API |
| 社区与维护 | 活跃,是当前自动化测试的主流选择 | 不活跃,项目较老 |
对于绝大多数 Python 与 Android 交互的需求,特别是自动化测试、UI操作、设备管理等场景,使用 pure-python-adb (通常结合 uiautomator2) 是最佳选择,它简单、强大且社区支持良好。
只有当你需要开发一个直接运行在手机上的、需要实时访问传感器等硬件资源的 Python 应用时,才需要考虑 SL4A。
