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

告别adb shell:用Python脚本一键搞定Android屏幕截图与导出

Python自动化告别adb shell一键搞定Android屏幕截图与导出每次调试Android应用时手动敲adb命令截图、导出、重命名是不是让你感到效率低下作为一名长期与Android设备打交道的开发者我深知这种重复劳动的痛苦。本文将分享如何用Python脚本彻底告别adb shell的繁琐操作实现全自动化的屏幕截图工作流。1. 为什么需要自动化截图工具在日常开发中我们经常需要截取设备屏幕状态。无论是调试UI布局、记录测试步骤还是生成产品演示素材截图都是高频操作。传统方式需要手动执行以下步骤连接设备并确保adb可用输入adb shell screencap -p /sdcard/temp.png执行adb pull /sdcard/temp.png手动重命名文件避免覆盖重复上述步骤进行批量截图这个过程不仅耗时还容易出错。通过Python脚本自动化我们可以节省时间一键完成截图、导出、命名全过程减少错误自动处理文件冲突和连接问题批量处理轻松实现定时或连续截图集成扩展与其他自动化工具无缝衔接2. 核心工具与准备工作2.1 环境配置在开始编写脚本前需要确保以下环境就绪# 检查adb是否可用 adb version # 确保设备已连接 adb devicesPython环境需要安装以下依赖pip install pillow # 用于图像处理2.2 ADB命令原理分析Android的截图功能主要通过screencap命令实现其核心参数如下参数说明示例-p保存为PNG格式screencap -p /sdcard/screen.png-d指定显示IDscreencap -d 4619827259835644672(无)输出原始数据到stdoutscreencap raw.data注意直接输出到stdout时数据包含4字节的宽度、高度等信息需要特殊处理3. Python自动化脚本实现3.1 基础截图功能封装首先实现最基本的截图和导出功能import subprocess import os import time def take_screenshot(device_idNone, output_dirscreenshots): 基础截图功能 if not os.path.exists(output_dir): os.makedirs(output_dir) timestamp time.strftime(%Y%m%d_%H%M%S) filename f{output_dir}/screen_{timestamp}.png # 设备选择参数 device_arg [-s, device_id] if device_id else [] try: # 截图并保存到设备 subprocess.run( [adb] device_arg [shell, screencap, -p, f/sdcard/{timestamp}.png], checkTrue ) # 导出到电脑 subprocess.run( [adb] device_arg [pull, f/sdcard/{timestamp}.png, filename], checkTrue ) # 删除设备上的临时文件 subprocess.run( [adb] device_arg [shell, rm, f/sdcard/{timestamp}.png], checkTrue ) return filename except subprocess.CalledProcessError as e: print(f截图失败: {e}) return None3.2 高级功能扩展基础版本已经能工作但我们可以添加更多实用功能自动重试机制def robust_screenshot(max_retries3, **kwargs): 带重试机制的截图 for attempt in range(max_retries): try: return take_screenshot(**kwargs) except Exception as e: if attempt max_retries - 1: raise time.sleep(1)多设备支持def get_connected_devices(): 获取已连接的设备列表 result subprocess.run( [adb, devices], capture_outputTrue, textTrue ) devices [] for line in result.stdout.splitlines()[1:]: if line.strip() and device in line: devices.append(line.split(\t)[0]) return devices定时截图功能def scheduled_screenshots(interval5, count10): 定时连续截图 for i in range(count): take_screenshot() time.sleep(interval)4. 工程化实践与优化4.1 性能优化技巧直接使用adb shell命令虽然简单但在高频截图场景下性能不佳。我们可以通过以下方式优化减少adb调用次数合并多个操作为一个shell命令使用stdout直接传输避免临时文件读写并行处理多设备同时截图优化后的核心代码示例def fast_screenshot(): 高性能截图实现 process subprocess.Popen( [adb, shell, screencap, -p], stdoutsubprocess.PIPE ) image_data, _ process.communicate() # 修复Android的换行符问题 image_data image_data.replace(b\r\n, b\n) with open(screenshot.png, wb) as f: f.write(image_data)4.2 错误处理与日志完善的错误处理是自动化脚本的关键import logging logging.basicConfig( filenamescreenshot.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) def safe_screenshot(): try: filename take_screenshot() logging.info(f截图成功: {filename}) return filename except subprocess.CalledProcessError as e: logging.error(fADB命令执行失败: {e}) except FileNotFoundError: logging.error(ADB未找到请检查环境变量) except Exception as e: logging.error(f未知错误: {e})4.3 与其他工具集成我们可以将截图功能集成到更大的自动化框架中class AndroidAutomator: def __init__(self, device_idNone): self.device_id device_id def screenshot(self, filenameNone): 集成截图方法 if filename is None: filename fscreenshot_{int(time.time())}.png take_screenshot(device_idself.device_id, output_pathfilename) return filename # 可以添加其他自动化方法...5. 完整脚本示例与应用场景5.1 可直接运行的完整脚本#!/usr/bin/env python3 Android自动化截图工具 功能 1. 一键截图并保存到指定目录 2. 支持自动命名(时间戳) 3. 支持多设备选择 4. 带错误重试机制 import subprocess import os import time import argparse from datetime import datetime def parse_args(): parser argparse.ArgumentParser(descriptionAndroid自动化截图工具) parser.add_argument(-d, --device, help指定设备ID) parser.add_argument(-o, --output, defaultscreenshots, help输出目录(默认: screenshots)) parser.add_argument(-n, --count, typeint, default1, help截图次数) parser.add_argument(-i, --interval, typefloat, default1.0, help连续截图间隔(秒)) return parser.parse_args() def check_adb(): try: subprocess.run([adb, version], checkTrue, stdoutsubprocess.DEVNULL) return True except: return False def take_screenshot(deviceNone, output_dirscreenshots): 执行截图操作 if not os.path.exists(output_dir): os.makedirs(output_dir) timestamp datetime.now().strftime(%Y%m%d_%H%M%S_%f) filename os.path.join(output_dir, fscreen_{timestamp}.png) device_args [-s, device] if device else [] try: # 使用管道直接传输避免临时文件 with open(filename, wb) as f: subprocess.run( [adb] device_args [shell, screencap, -p], checkTrue, stdoutf ) print(f截图已保存: {filename}) return filename except subprocess.CalledProcessError as e: print(f截图失败: {e}) if os.path.exists(filename): os.remove(filename) return None def main(): args parse_args() if not check_adb(): print(错误: adb未找到请检查Android SDK配置) return print(f开始截图共{args.count}次间隔{args.interval}秒) for i in range(args.count): print(f\n第{i1}次截图...) success False for attempt in range(3): # 最多重试3次 if take_screenshot(args.device, args.output): success True break time.sleep(1) if not success: print(截图多次尝试失败请检查设备连接) break if i args.count - 1: # 最后一次不需要等待 time.sleep(args.interval) if __name__ __main__: main()5.2 典型应用场景UI自动化测试配合测试框架自动截图记录测试结果应用演示制作定时截图生成操作流程文档竞品分析批量采集其他应用的界面设计远程调试通过截图了解设备实际显示状态监控系统定期截图监控设备运行状态# 示例在UI测试中使用 from uiautomator import Device d Device(emulator-5554) d(textSettings).click() take_screenshot(after_click_settings.png)6. 进阶技巧与问题排查6.1 常见问题解决方案问题1截图出现黑屏或花屏可能原因设备屏幕已关闭使用了不支持的色彩模式设备性能不足解决方案# 唤醒设备后再截图 subprocess.run([adb, shell, input, keyevent, KEYCODE_WAKEUP]) time.sleep(0.5) # 等待屏幕完全唤醒 take_screenshot()问题2截图速度慢优化方案降低截图分辨率使用jpeg格式替代png关闭不必要的adb日志# 使用低分辨率截图 subprocess.run([ adb, shell, screencap, -p, --size, 720x1280, , screen.jpg ])6.2 高级功能实现实时屏幕监控import cv2 import numpy as np def realtime_preview(): 实时屏幕预览(需要OpenCV) while True: process subprocess.Popen( [adb, shell, screencap, -p], stdoutsubprocess.PIPE ) img_data process.stdout.read() # 转换图像数据 nparr np.frombuffer(img_data, np.uint8) img cv2.imdecode(nparr, cv2.IMREAD_COLOR) cv2.imshow(Android Screen, img) if cv2.waitKey(1) 0xFF ord(q): break cv2.destroyAllWindows()基于内容的自动截图from PIL import Image import imagehash def capture_until_change(threshold5): 检测到屏幕变化时自动截图 last_hash None while True: current_screen take_screenshot() with Image.open(current_screen) as img: current_hash imagehash.average_hash(img) if last_hash and (current_hash - last_hash) threshold: print(检测到屏幕变化!) return current_screen last_hash current_hash time.sleep(0.5)在实际项目中这套自动化截图系统为我节省了大量时间。特别是在需要收集大量测试截图时只需简单设置参数就能自动完成所有工作。最实用的功能是定时连续截图配合图像差异检测可以完美记录用户操作的完整流程。

相关文章:

告别adb shell:用Python脚本一键搞定Android屏幕截图与导出

Python自动化:告别adb shell,一键搞定Android屏幕截图与导出 每次调试Android应用时,手动敲adb命令截图、导出、重命名,是不是让你感到效率低下?作为一名长期与Android设备打交道的开发者,我深知这种重复劳…...

Mac小白必看:手把手教你找回丢失的Recovery HD分区(附diskutil命令详解)

Mac用户必备技能:深度解析Recovery HD分区修复与diskutil实战指南 当你按下CommandR却只看到闪烁的问号图标时,那种手足无措的感觉我深有体会。Recovery HD分区就像是Mac的急救箱,藏着系统恢复、磁盘修复和时间机器备份等关键工具。但很多用户…...

从原理到实践:液压与气压传动核心概念与应用场景解析

1. 液压与气压传动的核心原理 液压与气压传动是现代工业中广泛应用的动力传输方式,它们虽然介质不同,但都遵循着相似的物理原理。液压系统使用不可压缩的液体(通常是液压油)作为工作介质,而气压系统则使用可压缩的空气…...

AI工具搭建自动化视频生成Quick Sync

# Quick Sync:AI驱动的自动化视频生成技术实战解析 前阵子团队接了个批量短视频生成的项目,要在短时间内产出数百条产品演示视频。一开始想着一个个用Premiere剪,但算算时间,光是渲染就够呛。后来试用了几种自动化方案&#xff0c…...

AI工具搭建自动化视频生成NVENC

最近在折腾视频生成这块,发现AI工具搭配NVENC(NVIDIA的硬件编码器)做自动化视频生成,其实是个挺有意思的组合。很多人以为写个脚本调用FFmpeg就能搞定,但真正要把NVENC用透,背后的门道还是挺多的。不如从几…...

避开C2000开发第一个坑:TMS320F28069的InitSysCtrl()函数里,为什么ADC时钟要开一下又关?

TMS320F28069开发揭秘:ADC时钟瞬启瞬闭背后的硬件校准逻辑 在TMS320F28069的InitSysCtrl()初始化函数中,有一段看似矛盾的代码操作:先启用ADC时钟,调用(*Device_cal)()函数后立即关闭。这个"开关ADC时钟"的瞬态操作绝非…...

Python地理空间数据处理技能库geoskills:简化GIS分析,提升开发效率

1. 项目概述:一个面向地理空间数据处理的技能库最近在GitHub上闲逛,发现了一个挺有意思的项目,叫geoskills,来自一个叫Cognitic-Labs的组织。光看名字,geo和skills的组合,就让我这个常年和数据打交道的人眼…...

英雄联盟玩家必备:5分钟快速上手LeagueAkari完整教程

英雄联盟玩家必备:5分钟快速上手LeagueAkari完整教程 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟繁琐的操作流程…...

HFSS与CST互导实战:5分钟搞定模型转换与数据对比(以微带天线为例)

HFSS与CST互导实战:微带天线模型转换与数据对比指南 在射频工程领域,HFSS和CST作为两大主流电磁仿真工具各有优势。实际项目中经常需要在这两个平台间迁移模型并对比结果,以确保仿真可靠性。本文将手把手演示如何高效完成模型互导与数据验证。…...

从单机到集群的基石:手把手配置ZooKeeper 3.5.8单机模式,为分布式应用铺路

从单机到集群的基石:手把手配置ZooKeeper 3.5.8单机模式,为分布式应用铺路 在分布式系统的世界里,协调服务就像交响乐团的指挥,确保每个乐器(节点)在正确的时间演奏正确的音符。ZooKeeper正是这样一个"…...

别再手动算归一化了!用Origin9.1的‘列公式’功能一键搞定数据预处理

用Origin9.1列公式功能高效实现数据归一化:从原理到实战 科研数据处理中,归一化是消除量纲影响、提升分析结果可比性的关键步骤。传统手动计算不仅耗时费力,还容易因公式输入错误导致结果偏差。Origin9.1的"列公式"功能&#xff08…...

一、NodeMCU-32S核心功能与上手场景解析

1. NodeMCU-32S开发板的核心特性解析 第一次拿到NodeMCU-32S这块开发板时,我就被它小巧的尺寸和丰富的接口吸引了。作为基于ESP32芯片设计的开发板,它最大的亮点就是双核处理器和Wi-Fi/蓝牙双模无线功能。这两个特性让它在物联网项目中特别吃香&#xff…...

用C语言手搓一个聊天室服务器:从socket到多线程的保姆级踩坑实录

用C语言手搓一个聊天室服务器:从socket到多线程的保姆级踩坑实录 深夜两点,屏幕的蓝光映在脸上,第17次编译失败后,我盯着gcc报出的"segmentation fault"陷入了沉思。这就是用C语言实现网络服务的魅力所在——没有现成的…...

从入门到精通:摄影测量学核心概念与应用全景解析

1. 摄影测量学入门指南:从零开始理解核心概念 第一次接触摄影测量学时,我被那些专业术语搞得晕头转向。直到有一次在公园用手机拍摄了一组树木照片,尝试用免费软件生成3D模型后,才真正理解了这门技术的魅力。摄影测量学本质上就是…...

5分钟掌握ExplorerPatcher:Windows界面定制终极指南

5分钟掌握ExplorerPatcher:Windows界面定制终极指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为Windows 11的新界面感到…...

VMware解锁macOS完整指南:3步免费运行苹果系统

VMware解锁macOS完整指南:3步免费运行苹果系统 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是否渴望在Windows或Linux电脑上体验macOS的魅力?无论你是开发者需要测试iOS应用…...

PyTorch数据集加载进阶:除了CIFAR10,你的自定义数据该怎么准备?

PyTorch数据集加载进阶:从CIFAR10到自定义数据的深度实践 在深度学习项目中,数据准备往往比模型构建更耗时。许多开发者能熟练使用torchvision.datasets加载标准数据集,却对自定义数据束手无策。本文将带你深入PyTorch数据加载机制&#xff…...

WarcraftHelper:魔兽争霸3兼容性修复终极解决方案

WarcraftHelper:魔兽争霸3兼容性修复终极解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代Windows系…...

实战:用Python的scipy和numpy搞定分数阶灰色模型(FGM),附完整代码和避坑指南

实战:用Python的scipy和numpy搞定分数阶灰色模型(FGM),附完整代码和避坑指南 灰色预测模型在数据分析领域一直占有一席之地,特别是当面对小样本、贫信息的数据预测问题时。传统灰色模型通过一阶累加生成指数规律明显的…...

边缘计算实战:基于 Linux Netns 与标准海事网关抵御局域网横向攻击的物理隔离架构

摘要:扁平化局域网极易遭受 ARP 欺骗与黑客横向攻击。本文记录了在标准工业级海事网关上基于 Linux netns 构建网络物理与逻辑隔离防线的实操复盘。 导语:在实操一个远洋船载网络的安全重构项目时,我们面临一个极其严峻的威胁模型&#xff1…...

逆向工程师的视角:如何用Windbg双机调试分析一个未知Windows驱动(实战案例解析)

逆向工程师的视角:如何用Windbg双机调试分析未知Windows驱动 在安全研究和恶意代码分析领域,逆向工程师常常需要面对未知的Windows驱动程序。这些驱动可能是第三方闭源组件,也可能是潜在的恶意软件载体。与传统的驱动开发调试不同&#xff0c…...

别再乱接电阻了!手把手教你为DDR4/DDR5内存信号选对端接方案(附仿真对比)

别再乱接电阻了!手把手教你为DDR4/DDR5内存信号选对端接方案(附仿真对比) 第一次调试DDR5内存接口时,我盯着示波器上扭曲的信号波形整整三天没合眼。当我把串联端接电阻从22Ω换成39Ω的瞬间,眼图突然像被施了魔法一样…...

Excel+ChatGPT函数实战:零代码实现语义理解与智能数据处理

1. 为什么说“在Excel里直接调用ChatGPT”不是噱头,而是真正在改写数据处理的工作流 你有没有过这样的时刻:盯着Excel表格里一列杂乱的客户反馈,想快速标出哪些是投诉、哪些是表扬,却卡在手动翻查、复制粘贴、反复试错公式上&…...

开源工具phantom-secrets:轻量级秘密管理方案,助力安全开发与CI/CD

1. 项目概述:一个用于秘密管理的开源工具 最近在整理自己的开发环境时,发现各种API密钥、数据库密码、配置文件里的敏感信息散落在各个角落,管理起来非常头疼。用文本文件记不安全,用密码管理器又觉得和开发流程有点脱节。直到我发…...

Wechatsync(文章同步助手)自动发布神器

下载地址:https://www.chajianxw.com/product-tool/16773.html 安装教程:https://www.chajianxw.com/tutorial/how-to-install-chrome-plugin.html AI-Skills 技能包一键调用:https://ai-skills.ai/?inviteCode=S2JV3NCK 目录 一、引言 二、系统整体架构设计 核心技术栈…...

AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?

在近期(2026年5月)的技术圈和AI社区引发了非常热烈的讨论。提出这个观点的是 Anthropic(Claude背后的公司)负责 Claude Code 团队的工程师 Thariq Shihipar,他最近发表了一篇题为《使用 Claude Code:HTML 极…...

JSON数据同步利器:深度解析ogre-software/json-synchronizer的核心原理与应用

1. 项目概述:一个被低估的JSON数据同步利器如果你经常和JSON数据打交道,尤其是在前后端分离、微服务架构或者多数据源集成的场景下,你肯定遇到过这样的烦恼:手头有两份甚至多份JSON数据,它们结构相似,但内容…...

紫光同创Logos系列FPGA实战:BGA封装PCB布局与Fanout布线避坑指南(附示意图)

紫光同创Logos系列FPGA实战:BGA封装PCB布局与Fanout布线避坑指南 第一次拿到紫光同创Logos系列FPGA的BGA封装芯片时,那种密密麻麻的焊盘阵列确实会让人头皮发麻。特别是FBG256和FBG484这类高密度封装,如何在有限的空间内完成高质量的Fanout布…...

Win11 22H2 打不开 IE?亲测有效!一行代码直接调出独立 IE 窗口

很多升级到 Windows 11 22H2 的用户都遇到过这样的困扰:明明银行、政务、企业内网等旧系统明确要求用 IE 浏览器登录,可系统里找不到 IE 入口,Edge 的 IE 兼容模式又频繁失效,直接打开 IE 还会强制跳转到 Edge,折腾半天…...

FPGA新手避坑指南:用SPWM驱动电机时,你的死区时间加对了吗?

FPGA电机驱动实战:SPWM死区时间设计的核心要点与避坑策略 在数字电源和电机控制领域,FPGA因其并行处理能力和精确时序控制而备受青睐。许多工程师在成功实现SPWM信号生成后,往往忽略了驱动电路中最致命的一环——死区时间设置。我曾亲眼见证过…...