告别手动点点点:用ADB+Python打造你的安卓设备自动化小助手
告别手动点点点用ADBPython打造你的安卓设备自动化小助手在移动互联网时代安卓设备已经成为我们日常生活和工作的重要工具。然而频繁的手动操作不仅效率低下还容易出错。想象一下如果你能通过几行代码自动完成应用安装、数据备份、定时任务等操作那将节省多少宝贵时间本文将带你深入探索如何将ADB命令与Python脚本结合构建一个功能强大的个人设备自动化工具。1. 环境准备与基础配置1.1 ADB工具安装与配置ADBAndroid Debug Bridge是谷歌提供的调试工具它建立了PC与安卓设备之间的桥梁。要开始自动化之旅首先需要正确安装和配置ADB环境下载平台工具包访问 官方下载页面 获取最新版本Windows用户选择platform-tools-latest-windows.zip配置环境变量# 将adb所在目录添加到系统PATH # Windows示例假设解压到D:\platform-tools setx /M PATH %PATH%;D:\platform-tools验证安装adb version # 应显示类似以下信息 # Android Debug Bridge version 1.0.411.2 设备连接与授权确保设备已开启开发者选项和USB调试模式不同品牌设备开启方式略有差异通常在设置→关于手机→连续点击版本号7次可激活开发者选项连接设备后执行以下命令检查连接状态adb devices # 成功连接应显示设备序列号及状态 # List of devices attached # xxxxxxxx device若设备未授权需在设备上确认调试授权对话框。对于无线调试Android 11adb pair 192.168.x.x:xxxx # 配对码 adb connect 192.168.x.x:xxxx2. Python与ADB的完美结合2.1 使用subprocess调用ADBPython的subprocess模块是与系统命令交互的利器。以下是一个基础封装类import subprocess from typing import Optional class ADBController: def __init__(self, device_id: Optional[str] None): self.device_id device_id def run_adb(self, command: str) - str: 执行ADB命令并返回输出 full_cmd fadb {f-s {self.device_id} if self.device_id else }{command} try: result subprocess.run( full_cmd, shellTrue, checkTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f命令执行失败: {e.stderr}) return 2.2 常用功能封装示例设备信息获取def get_device_info(self) - dict: return { model: self.run_adb(shell getprop ro.product.model), android_version: self.run_adb(shell getprop ro.build.version.release), resolution: self.run_adb(shell wm size), density: self.run_adb(shell wm density) }应用管理def install_app(self, apk_path: str) - bool: output self.run_adb(finstall -r {apk_path}) return Success in output def uninstall_app(self, package_name: str, keep_dataFalse) - bool: flag -k if keep_data else output self.run_adb(funinstall {flag}{package_name}) return Success in output3. 自动化实战项目3.1 批量截图与整理系统以下脚本实现定时截图并按日期分类存储from datetime import datetime import os def auto_screenshot(interval: int, duration: int): 定时截图 :param interval: 截图间隔(秒) :param duration: 总持续时间(秒) today datetime.now().strftime(%Y%m%d) os.makedirs(fscreenshots/{today}, exist_okTrue) for i in range(duration // interval): timestamp datetime.now().strftime(%H%M%S) self.run_adb(fshell screencap -p /sdcard/screen_{timestamp}.png) self.run_adb(fpull /sdcard/screen_{timestamp}.png screenshots/{today}/) time.sleep(interval)3.2 游戏自动化测试框架针对游戏测试需求我们可以构建一个基于坐标操作的测试框架class GameTester: def __init__(self, adb: ADBController): self.adb adb self.actions [] def record_tap(self, x: int, y: int, delay1): 记录点击动作 self.actions.append((tap, x, y, delay)) def record_swipe(self, x1: int, y1: int, x2: int, y2: int, duration500): 记录滑动动作 self.actions.append((swipe, x1, y1, x2, y2, duration)) def execute(self, repeat1): 执行记录的动作序列 for _ in range(repeat): for action in self.actions: if action[0] tap: self.adb.run_adb(fshell input tap {action[1]} {action[2]}) time.sleep(action[3]) elif action[0] swipe: self.adb.run_adb(fshell input swipe {action[1]} {action[2]} {action[3]} {action[4]} {action[5]})4. 高级技巧与优化4.1 多设备并行控制当需要管理多台设备时可以扩展我们的ADBControllerclass MultiDeviceManager: def __init__(self): self.devices {} self._detect_devices() def _detect_devices(self): output subprocess.getoutput(adb devices) for line in output.splitlines()[1:]: if line.strip() and device in line: device_id line.split(\t)[0] self.devices[device_id] ADBController(device_id) def run_on_all(self, command: str): 在所有设备上执行相同命令 results {} for device_id, controller in self.devices.items(): results[device_id] controller.run_adb(command) return results4.2 性能监控与日志分析结合ADB命令和Python数据分析库可以构建设备监控系统import pandas as pd from io import StringIO def get_cpu_usage(self) - pd.DataFrame: 获取CPU使用情况 output self.run_adb(shell top -n 1 -b) return pd.read_csv(StringIO(output), sepr\s, skiprows[0], headerNone) def monitor_performance(interval5, duration60): 性能监控 data [] start_time time.time() while time.time() - start_time duration: cpu_data get_cpu_usage() mem_data self.run_adb(shell cat /proc/meminfo) # 解析内存数据... data.append({ timestamp: datetime.now(), cpu_usage: cpu_data.iloc[0][9], # 第一个进程的CPU使用率 free_mem: parse_meminfo(mem_data)[MemFree] }) time.sleep(interval) return pd.DataFrame(data)4.3 异常处理与重试机制健壮的自动化系统需要完善的错误处理from functools import wraps import time def retry(max_attempts3, delay1): 重试装饰器 def decorator(func): wraps(func) def wrapper(*args, **kwargs): last_error None for attempt in range(max_attempts): try: return func(*args, **kwargs) except Exception as e: last_error e print(f尝试 {attempt 1}/{max_attempts} 失败: {e}) time.sleep(delay) raise Exception(f所有尝试失败: {last_error}) return wrapper return decorator retry(max_attempts5, delay2) def reliable_adb_command(self, command: str): 带重试机制的ADB命令 return self.run_adb(command)5. 项目扩展与生态整合5.1 与Tasker等自动化工具联动通过ADB可以扩展Tasker等自动化工具的能力def trigger_tasker_profile(self, profile_name: str): 触发Tasker配置文件 self.run_adb(fshell am broadcast -a net.dinglisch.android.tasker.ACTION_TASK f-e tn \{profile_name}\)5.2 构建Web控制界面使用Flask等框架为自动化脚本添加Web控制端from flask import Flask, jsonify, request app Flask(__name__) adb ADBController() app.route(/api/screenshot, methods[POST]) def take_screenshot(): filename fscreen_{datetime.now().strftime(%Y%m%d_%H%M%S)}.png adb.run_adb(fshell screencap -p /sdcard/{filename}) adb.run_adb(fpull /sdcard/{filename} static/screenshots/) return jsonify({status: success, file: filename}) app.route(/api/apps, methods[GET]) def list_apps(): apps adb.run_adb(shell pm list packages -3).splitlines() return jsonify({user_apps: [pkg.replace(package:, ) for pkg in apps]})5.3 定时任务管理系统结合APScheduler实现复杂的定时任务from apscheduler.schedulers.background import BackgroundScheduler scheduler BackgroundScheduler() def schedule_daily_backup(): 每天凌晨备份指定应用数据 scheduler.scheduled_job(cron, hour2) def job(): adb.run_adb(shell pm list packages -3 apps.txt) # 处理备份逻辑... scheduler.start()