实现安卓设备的自动化操作,例如自动打开应用、点击签到,是提升日常效率的常见需求。其核心原理并不复杂,本质上是利用脚本程序模拟用户对设备的远程控制。本文将详细介绍如何使用Python作为控制端,通过ADB命令实现基础安卓自动化,并逐步升级到更健壮的控件识别方案。
实现思路与方案选型
安卓自动化主要有三种实现路径:
- 电脑端控制:在电脑上运行Python脚本,通过ADB(Android Debug Bridge)命令远程控制已连接的手机。这是最直接、最容易上手的方式。
- 手机端控制:在安卓设备上安装Python环境(如Termux),直接在设备内部执行脚本。
- 专业测试框架:使用Appium这类专为自动化测试设计的框架。
对于新手和快速实现简单场景的需求,推荐使用第一种方案。其准备工作简单,只需电脑安装Python和ADB,手机开启开发者选项即可。
环境准备:三步快速搭建
-
安装并配置ADB工具
下载Android SDK Platform-Tools,解压后将包含adb.exe的目录路径添加到系统的环境变量PATH中。完成后,在命令行中执行 adb version 能正确显示版本号即表示配置成功。
-
手机开启USB调试
进入手机设置 -> 关于手机,连续点击“版本号”7次以激活开发者选项。返回设置菜单,进入新出现的“开发者选项”,开启“USB调试”功能。使用数据线连接手机和电脑,在电脑命令行执行 adb devices。首次连接时手机会弹出授权提示,点击“允许”后,命令行中会显示设备序列号及device状态,表示连接成功。
-
准备Python环境
Python端无需复杂库,利用内置的subprocess模块调用ADB命令即可。若希望封装得更好,可后续使用adbutils等第三方库。
实战一:使用原始ADB命令模拟点击与滑动
最基础的自动化操作是模拟屏幕点击(Tap)和滑动(Swipe)。以下代码演示了如何用Python封装ADB命令来实现。
import subprocess
def adb(*args):
cmd = ["adb"] + list(args)
print("执行:", " ".join(cmd))
return subprocess.run(cmd, capture_output=True, text=True)
# 模拟点击屏幕坐标 (x, y)
def tap(x, y):
adb("shell", "input", "tap", str(x), str(y))
# 模拟从 (x1, y1) 滑动到 (x2, y2)
def swipe(x1, y1, x2, y2, duration_ms=300):
adb("shell", "input", "swipe",
str(x1), str(y1), str(x2), str(y2), str(duration_ms))
if __name__ == "__main__":
# 点击屏幕中央(坐标需根据实际手机分辨率调整)
tap(500, 1600)
# 从屏幕中部向上滑动
swipe(500, 1600, 500, 600)
运行脚本,即可看到连接的手机屏幕执行了相应操作。
如何获取屏幕坐标?
可以先通过命令获取手机屏幕分辨率:
def get_screen_size():
r = adb("shell", "wm", "size")
print(r.stdout) # 输出示例:Physical size: 1080x2400
然后对手机截图并拖到电脑上,用任何图片查看工具测量目标按钮的大致坐标,填入脚本即可。
实战二:编写一个简单的自动签到脚本
假设需要每天打开某应用(包名:com.xxx.app),点击“我的”选项卡,再点击“签到”按钮。一个基础的脚本流程如下:
import time
import subprocess
def adb(*args):
return subprocess.run(["adb"] + list(args),
capture_output=True, text=True)
def tap(x, y):
adb("shell", "input", "tap", str(x), str(y))
def home():
adb("shell", "input", "keyevent", "3") # KEYCODE_HOME 键,返回桌面
def start_app(pkg):
adb("shell", "monkey", "-p", pkg, "-c",
"android.intent.category.LAUNCHER", "1")
def auto_sign():
pkg = "com.xxx.app" # 替换为实际应用包名
home() # 确保从桌面开始
time.sleep(1)
start_app(pkg) # 启动应用
time.sleep(5) # 等待应用加载
# 点击“我的”(坐标需自行测量替换)
tap(950, 2000)
time.sleep(1)
# 点击“签到”
tap(800, 800)
time.sleep(1)
if __name__ == "__main__":
auto_sign()
此方法完全依赖固定坐标,优点是简单直观,缺点是对应用界面变更或不同分辨率设备适应性差。适用于个人在固定设备上运行的简单任务。
升级方案:使用UIAutomator2进行控件识别
为了摆脱对屏幕坐标的依赖,可以使用uiautomator2库。它通过在设备上运行一个辅助服务,让脚本能够根据控件的文本、ID等属性进行定位和操作,极大地提升了脚本的健壮性。
首先安装库并初始化设备:
pip install uiautomator2
# 手机连接电脑后,执行初始化(仅首次需要)
python -m uiautomator2 init
使用uiautomator2重写签到脚本:
import uiautomator2 as u2
import time
def connect_device():
d = u2.connect() # USB连接默认识别唯一设备
print("已连接:", d.info)
return d
def auto_sign_with_u2():
d = connect_device()
# 点亮并解锁屏幕(示例为简单滑动解锁)
if not d.screen_on():
d.screen_on()
time.sleep(1)
d.swipe_ext("up")
# 启动应用
pkg = "com.xxx.app"
d.app_start(pkg)
time.sleep(5)
# 通过文本“我的”定位并点击,找不到则尝试通过resourceId点击
if d(text="我的").exists:
d(text="我的").click()
else:
d(resourceId="com.xxx.app:id/tab_mine").click()
time.sleep(2)
# 定位并点击“签到”按钮
if d(textContains="签到").exists:
d(textContains="签到").click()
else:
raise RuntimeError("找不到签到按钮")
time.sleep(2)
print("签到完成")
if __name__ == "__main__":
auto_sign_with_u2()
如何获取控件属性(如text、resourceId)?
可使用uiautomator2自带的Web Inspector功能。连接设备后,在脚本中运行d.watcher.start(),然后在浏览器中访问它提供的地址,即可可视化地查看和选取界面控件及其属性。
更多应用场景与脚本示例
安卓自动化的应用远不止签到,以下是一些实用场景的代码片段:
批量安装APK:
import subprocess
from pathlib import Path
def adb(*args):
return subprocess.run(["adb"] + list(args),
text=True, capture_output=True)
def install_apks(folder: str):
base = Path(folder)
for apk in base.glob("*.apk"):
print(f"正在安装: {apk.name}")
r = adb("install", "-r", str(apk))
print(r.stdout, r.stderr)
if __name__ == "__main__":
install_apks("./apk_folder")
常见问题与避坑指南
- 多设备连接:当电脑连接多台设备时,需在ADB命令中使用
-s <设备序列号>指定目标设备。
- 分辨率适配:尽量避免使用绝对坐标。若必须使用,可编写函数将坐标按屏幕比例进行换算。
- 权限与弹窗:自动化过程中可能被应用内的权限申请弹窗或更新提示打断。脚本中需加入关键节点的状态检查与异常处理逻辑。
- 稳定性增强:为生产环境使用的脚本添加超时重试、关键步骤日志记录等功能,确保脚本在预期内失败,而非无声卡死。
何时选择Appium?
如果目标是构建企业级的、跨平台的自动化测试流水线,需要集成CI/CD、生成详细测试报告、管理大量用例,那么应直接选择Appium这类专业框架。但对于个人自动化或快速原型验证,ADB配合Python或UIAutomator2是更轻量、高效的选择。
掌握基础的安卓自动化技能,能有效将重复的机械操作转化为自动执行的脚本,从而节省宝贵时间。建议立即动手,用一台旧手机实践一个真实需求,体会自动化带来的效率提升。