找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3276

积分

0

好友

452

主题
发表于 2025-12-24 06:44:33 | 查看: 67| 回复: 0

实现安卓设备的自动化操作,例如自动打开应用、点击签到,是提升日常效率的常见需求。其核心原理并不复杂,本质上是利用脚本程序模拟用户对设备的远程控制。本文将详细介绍如何使用Python作为控制端,通过ADB命令实现基础安卓自动化,并逐步升级到更健壮的控件识别方案。

实现思路与方案选型

安卓自动化主要有三种实现路径:

  1. 电脑端控制:在电脑上运行Python脚本,通过ADB(Android Debug Bridge)命令远程控制已连接的手机。这是最直接、最容易上手的方式。
  2. 手机端控制:在安卓设备上安装Python环境(如Termux),直接在设备内部执行脚本。
  3. 专业测试框架:使用Appium这类专为自动化测试设计的框架。

对于新手和快速实现简单场景的需求,推荐使用第一种方案。其准备工作简单,只需电脑安装Python和ADB,手机开启开发者选项即可。

环境准备:三步快速搭建

  1. 安装并配置ADB工具
    下载Android SDK Platform-Tools,解压后将包含adb.exe的目录路径添加到系统的环境变量PATH中。完成后,在命令行中执行 adb version 能正确显示版本号即表示配置成功。

  2. 手机开启USB调试
    进入手机设置 -> 关于手机,连续点击“版本号”7次以激活开发者选项。返回设置菜单,进入新出现的“开发者选项”,开启“USB调试”功能。使用数据线连接手机和电脑,在电脑命令行执行 adb devices。首次连接时手机会弹出授权提示,点击“允许”后,命令行中会显示设备序列号及device状态,表示连接成功。

  3. 准备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")

常见问题与避坑指南

  1. 多设备连接:当电脑连接多台设备时,需在ADB命令中使用-s <设备序列号>指定目标设备。
  2. 分辨率适配:尽量避免使用绝对坐标。若必须使用,可编写函数将坐标按屏幕比例进行换算。
  3. 权限与弹窗:自动化过程中可能被应用内的权限申请弹窗或更新提示打断。脚本中需加入关键节点的状态检查与异常处理逻辑。
  4. 稳定性增强:为生产环境使用的脚本添加超时重试、关键步骤日志记录等功能,确保脚本在预期内失败,而非无声卡死。

何时选择Appium?

如果目标是构建企业级的、跨平台的自动化测试流水线,需要集成CI/CD、生成详细测试报告、管理大量用例,那么应直接选择Appium这类专业框架。但对于个人自动化或快速原型验证,ADB配合Python或UIAutomator2是更轻量、高效的选择。

掌握基础的安卓自动化技能,能有效将重复的机械操作转化为自动执行的脚本,从而节省宝贵时间。建议立即动手,用一台旧手机实践一个真实需求,体会自动化带来的效率提升。




上一篇:LoRA微调实战:在M1 Mac上对0.5B小模型进行低成本指令微调
下一篇:基于Erupt低代码框架:Java注解驱动,零前端代码快速构建企业级Admin后台
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-8 05:30 , Processed in 0.296728 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表