当前位置: 首页 > news >正文

Python+ADB自动化控制安卓设备:从基础连接到实战应用

1. ADB与Python自动化控制入门

刚接触安卓设备自动化时,我被ADB(Android Debug Bridge)这个工具惊艳到了。它就像一把瑞士军刀,能通过命令行完成各种设备操作。而Python作为胶水语言,可以轻松封装ADB命令,实现更复杂的自动化流程。

要开始使用ADB,首先需要在电脑上安装它。Windows用户可以直接下载platform-tools压缩包,解压后记得把路径添加到系统环境变量。Mac用户更简单,用Homebrew一行命令就能搞定:brew install android-platform-tools。安装完成后,在终端输入adb version就能验证是否成功。

连接设备时有个小技巧:先用USB线连接手机或平板,开启开发者选项里的USB调试。第一次连接时,设备上会弹出授权提示,记得点击允许。这时运行adb devices,如果看到设备序列号就说明连接成功了。我遇到过设备不识别的情况,后来发现是USB线质量问题,换根线就解决了。

无线连接更方便,先用USB执行adb tcpip 5555,然后拔掉线,运行adb connect 设备IP:5555就能无线控制了。不过要注意,有些厂商会限制无线ADB,比如华为EMUI需要额外开启"仅充电模式下允许ADB调试"。

2. Python封装ADB基础操作

用Python操作ADB的核心就是os.system()subprocess模块。我更喜欢用subprocess,因为它能更好地处理命令输出。比如获取设备分辨率:

import subprocess def get_device_resolution(): output = subprocess.check_output(['adb', 'shell', 'wm', 'size']) return output.decode().strip().split(' ')[2]

封装点击操作时,我发现直接使用input tap命令有时不够稳定。后来改用sendevent方式,可靠性提升不少:

def precise_click(x, y): subprocess.run(['adb', 'shell', 'input', 'tap', str(x), str(y)])

滑动操作也很常用,比如模拟上下滚动:

def swipe(start_x, start_y, end_x, end_y, duration=300): cmd = f"adb shell input swipe {start_x} {start_y} {end_x} {end_y} {duration}" subprocess.run(cmd, shell=True)

实际项目中,我会把这些基础操作封装成类,加入异常处理和重试机制。比如连接断开时自动重连,操作失败时记录日志等。这样代码的健壮性会好很多。

3. 游戏自动化实战案例

用Python+ADB实现游戏自动化,最关键是解决两个问题:如何获取游戏界面元素位置,以及如何实现精准操作。

获取坐标有几种方法:

  1. 开启开发者选项中的"显示指针位置"
  2. 使用adb shell getevent -l监听触摸事件
  3. 通过Scrcpy实时查看点击位置

我做过一个简单的游戏辅助,用PyAutoGUI监听键盘,然后映射到屏幕点击:

import pyautogui import subprocess # 技能按键映射 skill_map = { 'q': '500 1200', 'w': '700 1200', 'e': '900 1200', 'r': '1100 1200' } while True: key = pyautogui.KEYBOARD_KEYS if key in skill_map: subprocess.run(f'adb shell input tap {skill_map[key]}', shell=True)

更复杂的场景可以用图像识别定位。比如用OpenCV模板匹配找特定按钮:

import cv2 import numpy as np def find_button(button_img, threshold=0.8): subprocess.run('adb exec-out screencap -p > screen.png', shell=True) screen = cv2.imread('screen.png', 0) template = cv2.imread(button_img, 0) res = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= threshold) return list(zip(*loc[::-1]))[0] if len(loc[0]) > 0 else None

4. 使用Scrcpy增强控制体验

Scrcpy真是个神器,它能把安卓屏幕镜像到电脑,还支持键鼠控制。安装很简单:

  • Mac:brew install scrcpy
  • Windows:choco install scrcpy

我最喜欢它的按键映射功能,创建配置文件~/.config/scrcpy/scrcpy-keyboard.json

{ "mappings": [ { "key": "A", "action": "touch", "x": "100", "y": "500" }, { "key": "D", "action": "touch", "x": "300", "y": "500" } ] }

然后运行scrcpy --keyboard scrcpy-keyboard.json就能用键盘控制了。相比纯ADB方案,Scrcpy的延迟更低(约30ms),而且能看到实时画面。

对于需要精准操作的游戏,我会开启Scrcpy的高性能模式:

scrcpy --max-fps 60 --bit-rate 8M --max-size 1920

这能显著提升画面流畅度。如果网络条件好,还可以尝试无线连接:

adb tcpip 5555 scrcpy --tcpip=设备IP

5. 常见问题与性能优化

在长期使用中,我总结了一些常见坑点和优化技巧:

  1. 设备断连问题:无线连接时,可以写个守护进程定期检查连接状态。我常用的检查命令是adb get-state,返回device表示正常。

  2. 操作延迟优化:批量执行命令时,使用adb shell一次执行多个操作,比单独执行快很多。比如:

commands = [ 'input tap 100 200', 'sleep 0.1', 'input tap 300 400' ] subprocess.run(['adb', 'shell', ';'.join(commands)])
  1. 分辨率适配:不同设备分辨率不同,最好用相对坐标。我通常会先获取设备分辨率,然后计算比例:
width, height = map(int, get_device_resolution().split('x')) def relative_click(rel_x, rel_y): abs_x = int(width * rel_x) abs_y = int(height * rel_y) precise_click(abs_x, abs_y)
  1. 防检测技巧:有些游戏会检测自动化操作。可以加入随机延迟和位置偏移:
import random import time def safe_click(x, y): offset_x = random.randint(-5, 5) offset_y = random.randint(-5, 5) delay = random.uniform(0.1, 0.3) time.sleep(delay) precise_click(x + offset_x, y + offset_y)
  1. 多设备管理:当需要控制多个设备时,要在命令中指定序列号:
device_serial = '123abc' subprocess.run(f'adb -s {device_serial} shell input tap 100 200', shell=True)

6. 进阶应用场景

除了游戏控制,这套技术还能用在很多地方:

自动化测试:结合pytest可以做UI自动化。我设计过一个自动遍历测试方案:

def test_app_screens(): screens = ['home', 'settings', 'profile'] for screen in screens: navigate_to(screen) assert verify_screen(screen) take_screenshot(f'{screen}.png')

批量设备管理:在公司有20台测试机需要同时操作时,我用multiprocessing实现了并行控制:

from multiprocessing import Pool def run_on_device(serial): subprocess.run(f'adb -s {serial} install app.apk', shell=True) with Pool(4) as p: p.map(run_on_device, device_serials)

数据采集:定期截图并分析内容。我做过一个竞品监控工具:

import schedule import time def monitor_competitor(): subprocess.run('adb exec-out screencap -p > screenshot.png', shell=True) analyze_image('screenshot.png') schedule.every(6).hours.do(monitor_competitor) while True: schedule.run_pending() time.sleep(60)

家庭自动化:把旧手机改造成智能家居控制器。我用Flask做了个简单的web接口:

from flask import Flask app = Flask(__name__) @app.route('/click/<x>/<y>') def click(x, y): subprocess.run(f'adb shell input tap {x} {y}', shell=True) return 'OK'

在实际项目中,我发现稳定性最关键。所以现在我的代码都会包含完善的日志和异常处理。比如连接断开自动重试,操作失败记录上下文等。这些经验都是踩过坑才积累起来的。

http://www.jsqmd.com/news/556140/

相关文章:

  • 别急着升级glibc!解决scikit-learn的libgomp内存错误,我更推荐这个方法
  • (ubuntu黑屏)Z890M + U7 265KF + RTX 5070 Ti 安装 Ubuntu 22.04.5 实战记录(网卡 + 显卡驱动全解)
  • [AXI] AXI Datamover:构建高性能数据搬运引擎的实战指南
  • 解密Gemini AI智能体全栈架构:从LangGraph到生产级应用
  • 为什么你的模型总在局部最优徘徊?余弦退火可能是解药
  • 比迪丽LoRA模型Ubuntu部署教程:3步完成环境配置与启动
  • Jessibuca Pro:打破Web视频播放瓶颈的5大创新解决方案
  • 为什么最终选 TQUIC:T-Box QUIC 库选型的约束过滤与源码验证
  • Mac Mouse Fix版本演进分析:从功能增强到体验革命的技术跃迁
  • Kafka Connect UI零基础入门:从部署到配置全攻略
  • 企业级AI技能开发实战指南:从零到一构建Claude技能系统
  • 突破式3步实现:用MOOTDX构建零成本金融数据获取引擎
  • MySQL数据同步神器Canal实战:从配置到Java客户端开发全流程
  • OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并发表现
  • SmolVLA详细步骤:从start.sh启动到app.py调试的完整开发流程
  • HFSS新手避坑指南:用T形波导案例,手把手教你搞定电磁仿真建模与参数化扫描
  • 告别官方开发板:手把手教你为自制的RK3568板卡移植Linux系统(Ubuntu 18.04环境)
  • 从反证法到三角不等式:极限唯一性证明的思维拆解
  • YOLOv12+BoT-SORT实战:手把手教你搭建热红外无人机跟踪基线(附代码)
  • 3步精通Rufus:ext文件系统格式化实战攻略
  • 追赶30名
  • 2026二硫化硒去屑洗发水推荐榜:止痒控油怎么选 - 新闻快传
  • 智能缠论量化交易实战工具:从市场痛点到实战落地的完整解决方案
  • 别再乱用@DateTimeFormat和@JsonFormat了!SpringBoot时间处理保姆级避坑指南
  • SpringCloud Gateway + OAuth2 + JWT:实战中遇到的5个坑和我的填坑方案
  • OFA视觉蕴含模型详细步骤:从镜像启动到API集成全流程详解
  • 几何完备扩散模型GCDM:从理论突破到SBDD实战评测与部署指南
  • 量化版SenseVoice语音识别体验:模型缩小74%,速度提升33%实测
  • BGE-Large-Zh入门必看:从零部署纯本地中文向量工具(无网络依赖)
  • Z-Image-GGUF企业级应用:集成SpringBoot构建智能内容创作平台