在之前的代码中,主要注重了项目内容和功能的迭代,而忽视了对计算机算力及内存的消耗,并且可能出现长时间运转后无法响应的问题,最新版代码为v4.0版本,v3.0主要为ui的更新,并未在CSDN上同步。
代码未经允许不可私自分享,最终所有权归作者所有!
目录
一、项目概述
本项目是一个基于uiautomator2 的 Android 自动化游戏脚本,主要用于 Efootball(实况足球)游戏的日常任务自动化。
项目版本:v4.0,重构版,相比v3.0的主要改进:
- 代码结构:重新调整模块化,使得模块清晰可见
- 配置管理:从硬编码改为JSON外置
- 图像识别:优化选择算法,增加识别休眠状态
- 日志系统:从print改为logging模块
- 错误处理:增加完善的重试机制
二、核心架构
项目采用模块化设计,分为以下核心模块:
|--------|-----------------|----------|
| 模块 | 文件名 | 功能说明 |
| 核心模块 | core/device.py | 设备连接管理 |
| 核心模块 | core/scanner.py | 图像识别 |
| 核心模块 | core/tasks.py | 任务执行 |
| 核心模块 | core/utils.py | 工具函数 |
| 界面模块 | ui/* | GUI界面 |
三、设备管理模块 (device.py)
设备管理模块采用 单例模式,确保全局只有一个设备管理器实例。
class DeviceManager:
"""设备管理器(单例模式)"""
_instance = None
_lock = Lock()
_devices: Dict[str, u2.Device] = {}
def __new__(cls):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
- 关键功能:
- get_device(): 获取设备连接,带健康检查
- _health_check(): 检查设备连接是否正常
- disconnect(): 断开设备连接
- get_device_info(): 获取设备详细信息
四、图像识别模块 (scanner.py)
图像识别模块是脚本的核心,提供四种扫描器:
- ImageScanner: 基础模板匹配,支持缓存
- MultiScaleScanner: 多尺度匹配,提高鲁棒性
- AsyncScanner: 异步扫描,并行处理多模板
- FeatureScanner: SIFT/ORB特征点匹配
【代码示例】模板匹配核心逻辑:
def locate_image(self, screenshot, template_path, threshold=0.8):
# 1. 加载模板(带缓存)
template = self.load_template(template_path)
# 2. 截图转灰度
screenshot_gray = cv2.cvtColor(screenshot, cv2.COLOR_RGB2GRAY)
# 3. 模板匹配
result = cv2.matchTemplate(screenshot_gray, template, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc(result)
# 4. 返回匹配结果
if max_val >= threshold:
return MatchResult(found=True, position=(x, y), confidence=max_val)
return MatchResult(found=False)
【代码示例】多尺度匹配核心逻辑:
def locate_image(self, screenshot, template_path, threshold=0.8):
template = self.load_template(template_path)
best_result = MatchResult(found=False)
# 遍历多个缩放比例
for scale in self.scales: # [0.8, 0.9, 1.0, 1.1, 1.2]
resized = cv2.resize(template, (0, 0), fx=scale, fy=scale)
result = cv2.matchTemplate(screenshot_gray, resized, cv2.TM_CCOEFF_NORMED)
if max_val > best_result.confidence and max_val >= threshold:
best_result = MatchResult(...)
return best_result
五、任务执行模块 (tasks.py)
任务执行模块负责自动化流程的控制,包含三个核心类:
- TaskConfig: 任务配置数据类
- TaskConfigManager: 配置文件管理器
- TaskRunner: 任务执行器
【代码示例】TaskConfig 数据类:
@dataclass
class TaskConfig:
id: int # 任务ID
name: str # 任务名称
folder: str # 图像文件夹
threshold: float # 匹配阈值 (0.0-1.0)
mode: str # 执行模式 (break/nobreak)
device_id: str # 设备ID
scan_interval: float # 扫描间隔
click_delay: float # 点击延迟
【代码示例】TaskRunner 核心循环:
def run(self, config, on_found, on_click):
# 指数退避参数
base_interval = 0.5
max_interval = 3.0
consecutive_miss = 0
while not self.is_stopped():
screenshot = device.screenshot()
# 扫描所有模板
for image_file in image_files:
result = self.scanner.locate_image(screenshot, image_path, threshold)
if result.found:
on_found(result.template_name, result.position)
device.click(result.position)
consecutive_miss = 0
break
# 指数退避等待
consecutive_miss += 1
if consecutive_miss >= 4:
time.sleep(10) # 休眠
else:
time.sleep(current_interval)
current_interval = min(current_interval * 2, max_interval)
核心亮点:
- 指数退避:连续未匹配时等待时间翻倍,避免CPU空转
- 休眠机制:连续多次未匹配后进入休眠,节省资源
- 可中断:支持随时停止任务
- 可暂停:支持暂停/恢复任务
六、工具函数模块 (utils.py)
工具函数模块提供通用的辅助功能:
- setup_logger(): 配置日志记录器(文件+控制台)
- @retry: 重试装饰器,支持自定义异常类型和回调
- @measure_time: 计时装饰器
- Timer: 计时器上下文管理器
- Singleton: 单例元类
【代码示例】@retry 重试装饰器:
@retry(max_attempts=3, delay=1.0, exceptions=(ConnectionError,))
def connect_device(device_id):
"""设备连接失败自动重试"""
return u2.connect(device_id)
# 使用示例
device = connect_device("emulator-5554")
七、GUI界面模块
GUI模块使用 PySide6构建,包含:
- main_window.py: 主窗口界面
- worker.py: 后台任务工作线程(QThread)
- ui_form.py: Qt Designer生成的界面
- back_rc.py: 资源文件编译结果
【代码示例】TaskWorker 工作线程:
class TaskWorker(QThread):
"""后台执行自动化任务"""
status_changed = Signal(str)
progress = Signal(int, int)
error = Signal(str)
def run(self):
# 在后台线程执行任务
self.runner = TaskRunner(scanner, DeviceManager)
self.runner.run(config, on_found=self._on_found)
def _on_found(self, template_name, position):
# 发送信号到主线程更新UI
self.status_changed.emit(f"找到: {template_name}")
八、关键技术点总结
本项目涉及的关键技术点:
- **单例模式:**确保设备管理器全局唯一,避免重复连接
- **线程安全:**使用Lock保护共享资源,支持多线程并发
- **模板缓存:**避免重复加载图像,提升识别速度
- **多尺度匹配:**适应不同分辨率和屏幕尺寸
- **指数退避:**智能调整扫描频率,平衡响应速度与资源消耗
- **信号槽机制:**PySide6线程间通信,解耦UI与业务逻辑
- **上下文管理器:**Timer简化耗时统计
九、运行效果展示
程序运行后会显示如下界面:
【界面功能说明】
- 任务列表:显示所有可用的自动化任务
- 设备状态:显示当前连接的Android设备
- 开始/停止:控制任务执行
- 日志输出:实时显示识别结果和操作记录
【运行截图】

【日志输出示例】
2026-04-04 09:00:00 [INFO] automation - 设备 emulator-5554 连接成功
2026-04-04 09:00:01 [INFO] automation - 开始执行任务: 积分赛
2026-04-04 09:00:02 [INFO] automation - 找到目标: 10.png @ (540, 960), 置信度: 0.95
2026-04-04 09:00:03 [INFO] automation - 点击成功: (540, 960)
2026-04-04 09:00:05 [INFO] automation - 找到目标: 20.png @ (320, 540), 置信度: 0.92
总结
本项目展示了如何使用Python实现Android自动化脚本,主要亮点:
- 模块化设计:代码结构清晰,易于维护和扩展
- 多种图像识别算法:可根据场景选择最优方案
- 完善的错误处理:指数退避+休眠机制确保稳定性
- 友好的GUI:PySide6实现的图形界面便于操作
- 配置外置:JSON格式配置,无需修改代码即可调整任务
源码已上传,欢迎交流学习!
【项目文件结构】
jiaoben3/
├── main.py # 主入口
├── core/ # 核心模块
│ ├── device.py # 设备管理(96行)
│ ├── scanner.py # 图像识别(320行)
│ ├── tasks.py # 任务执行(320行)
│ └── utils.py # 工具函数(140行)
├── ui/ # GUI模块
├── config/ # 配置文件
│ └── tasks.json # 16种任务配置
└── images_*/ # 各任务模板图像