基于adb操作安卓手机封装的python库

import re
import shlex
import subprocessclass ADBClient:def __init__(self, ip, port):"""初始化ADBClient实例。:param ip: 远程设备的IP地址。:param port: 远程设备的端口号。"""self.ip = ipself.port = portdef is_app_running(self, package_name):"""检查指定的应用是否正在设备上运行。:param package_name: 应用的包名。:return: 如果应用正在运行,返回True;否则返回False。"""try:# 通过ADB命令获取当前运行中的应用列表,并检索目标应用包名result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "ps"], capture_output=True,text=True)output = result.stdout# 使用正则表达式搜索应用包名if re.search(package_name, output):return Trueelse:return Falseexcept subprocess.CalledProcessError as e:# 打印错误信息并返回False,表示未能成功执行ADB命令print(f"发生错误:{e}")return Falsedef open_app(self, package_name, activity_name):"""在设备上启动指定的应用。:param package_name: 应用的包名。:param activity_name: 应用要启动的Activity名称。:return: 如果应用成功启动,返回True;否则返回False。"""try:# 首先检查应用是否已经在运行if self.is_app_running(package_name):print("@@@应用已经在运行")return True# 如果应用未运行,则通过ADB命令启动应用subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "am", "start", "-n",f"{package_name}/{activity_name}"])except subprocess.CalledProcessError as e:# 如果ADB命令执行出错,打印错误信息print(f"发生错误:{e}")return Falsedef execute_adb_command(self, adb_command):"""执行ADB命令,并返回命令的输出和错误信息。参数:- adb_command: 要执行的ADB命令字符串。返回值:- 一个元组,包括命令的输出(stdout)和错误信息(stderr)。如果命令执行失败,返回None和错误信息。"""try:# 使用subprocess运行ADB命令,将命令字符串分割为列表,添加设备IP和端口信息result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + adb_command.split(), capture_output=True,text=True)# 返回执行结果的输出和错误信息return result.stdout, result.stderrexcept subprocess.CalledProcessError as e:# 如果命令执行出错,返回错误信息return None, f"发生错误:{e}"def get_current_window_info(self):"""获取当前窗口的信息,包括包名和应用名称。该方法通过运行ADB命令,提取当前焦点窗口的包名和应用名称。返回:tuple: 成功时返回一个包含包名和应用名称的元组 (pkg, path);如果无法提取到信息,则返回 (None, None)。"""# 构造获取当前窗口信息的ADB命令cmd = 'shell dumpsys window | grep mCurrentFocus'# 运行ADB命令并获取输出result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + cmd.split(), capture_output=True, text=True)output = result.stdout.strip()# 使用正则表达式提取包名和应用名称pattern = r"mCurrentFocus=Window\{.+?\s+(\S+)/(.+?)\}"match = re.search(pattern, output)if match:# 如果匹配成功,提取并返回包名和应用名称pkg = match.group(1)path = match.group(2)return pkg, pathelse:# 如果匹配失败,返回Nonereturn None, None# 坐标点击事件def tap_by_coordinates(self, x, y):try:# 构建 adb 命令cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell", "input", "tap", str(x), str(y)]# 执行点击事件subprocess.run(cmd, check=True)print(f"已点击坐标 ({x}, {y})")except subprocess.CalledProcessError as e:print(f"Error: {e}")# 跳转到path指定页面def toPath(self, action, param=None):"""根据指定的操作动作和参数,向应用发送命令,实现页面跳转或其他操作。参数:action: 字符串,指定要执行的操作,例如"settings"表示设置页面。param: 可选参数,字符串类型,当需要传递额外的参数给操作时使用,比如用户ID或视频ID等。返回值: True表示操作成功,False表示操作失败。"""commands = {# 某页面"settings": "am start -n ..."# 其他页面往这放}# 检查命令是否在映射中if action in commands:# 执行命令full_cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell"] + shlex.split(commands[action])subprocess.run(full_cmd, check=True)return Trueelse:# 如果命令不在映射中,返回Falsereturn False

食用方法

# 创建ADBClient实例,并尝试打开指定的应用
adb_client = ADBClient('192.168.1.5', '5003')
adb_client.open_app("com.zhiliaoapp.musically", "com.ss.android.ugc.aweme.splash.SplashActivity")
res = adb_client.execute_adb_command("root")
print("执行adb命令返回的结果:" + str(res))# 获取当前活动的应用程序包名称和页面ID
pkg, path = adb_client.get_current_window_info()
print("当前活动的应用程序包名称:", pkg)
print("当前活动的页面ID:", path)# 模拟点击"com.zhiliaoapp.musically:id/c5w"元素
adb_client.tap_by_coordinates(667, 633)# 跳转页面
adb_client.toPath('settings')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李沐53_语言模型——自学笔记

语言模型 1.预测文本序列出现的概率 2.应用在做预训练模型 3.生成文本,给定前面几个词,不断生成后续文本 4.判断多个序列中哪个更常见 真实数据集的统计 《时光机器》数据集构建词表, 并打印前10个最常用的(频率最高的&…

1942年苏军反攻哈尔科夫失败

1942年5月,苏军计划夺回哈尔科夫,消灭城内的德国南方集团军群第6集团军。苏军为这次战役投入了西南方面军和南方面军,苏军元帅铁木辛哥制定了作战计划,非常凑巧的是,德军也于大致相同的时间制定了进攻计划。5月12日&am…

C语言 | 动态内存管理

目录: 1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常见的动态内存的错误 5. 动态内存经典笔试题分析 6. 柔性数组 1. 为什么要有动态内存分配 我们已经掌握的内存开辟方式有: int val 20; //在栈空间上开辟四个字节 cha…

一篇文章搞定Jenkins自动化部署JDK17+SpringBoot3.X+新版AlibabaCloud打包Docker镜像推送私有镜像仓库

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

-内核编译-01

挂载根文件系统 1搭建【nfs】 1.1PC端配置 nfs:网络服务器 【sudo /etc/init.d/nfs-kernel-server restart】 【sudo /etc/init.d/nfs-kernel-server status】 【sudo netstat -anp|less】 1重启【nfs】网络服务方法2:查看日志 修改配置文件 进入…

无线通信基本原理笔记

通信:人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。 通信模型:信源→发送设备→信道(↑噪声)→接收设备→信宿 调制:把基带信号变换成适合在信道中传输的信号的技术。通过改变高频载波的幅度、相位…

计算机网络基础1--基础概念

1. IP地址 1.1 IPv4地址 分为网络号和主机号 地址块的第一个地址和最后一个地址通常不使用。 广播地址为主机号全取1的情况。 2. 常用报文格式 2.0 ethernet协议 2.1 arp协议 2.2 ip协议 2.3 tcp协议 2.4 udp协议 2.5 icmp协议

LeetCode-2007. 从双倍数组中还原原数组【贪心 数组 哈希表 排序】

LeetCode-2007. 从双倍数组中还原原数组【贪心 数组 哈希表 排序】 题目描述:解题思路一:排序 哈希表解题思路二:排序 队列解题思路三:消消乐 题目描述: 一个整数数组 original 可以转变成一个 双倍 数组 changed &…

2024年150道高频Java面试题(三十二)

63. 线程的 run() 和 start() 有什么区别? 在Java中,run()方法和start()方法是线程操作中的两个核心方法,它们来自于Thread类。 run()方法: run()方法是一个线程的实际执行代码所在的方法。它是一个由Runnable接口定义的抽象方…

java文件夹文件比较工具

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashSet; import java.util.Set;public class FolderFileNames {public static void main(String[] args) {// 假设您要读取的文件夹路径是 &q…

35. 搜索插入位置 C++

今天开始刷力扣hot100,还是那句话,把时间投资在自己身上绝对是最最值最最赚的,我相信我自己,我也相信坚持付出的力量,力扣这边刷题我准备主打C,加油,先从二分查找开始! 给定一个排序…

ubuntu 配置 spacemouse以及通过python/robosuite使用spacemouse

一 前言 3dconnexion 早在2014年就不更新对linux系统的驱动,因此安装驱动需要参考另一个网站:https://spacenav.sourceforge.net/ 二 安装步骤 1 安装 spacenavd 先安装依赖库 sudo apt install libxext-dev libxrender-dev libxmu-dev libxmuu-dev…

maridb双数据源联查解决方案:联合存储引擎(Federated Storage Engine)

本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的数据库链接(DBLINK)。使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。操作…

PCA(Principal Component Analysis,主成分分析)与矩阵X的协方差矩阵之间的联系

PCA(Principal Component Analysis,主成分分析)是一种常用的降维技术,用于将高维数据集投影到低维空间中。在PCA中,投影方程将原始特征向量 ( x 1 , x 2 , … , x p ) (x_1, x_2, \ldots, x_p) (x1​,x2​,…,xp​)映射…

Linux 网络编程项目--简易ftp

主要代码 config.h #define LS 0 #define GET 1 #define PWD 2#define IFGO 3#define LCD 4 #define LLS 5 #define CD 6 #define PUT 7#define QUIT 8 #define DOFILE 9struct Msg {int type;char data[1024];char secondBuf[128]; }; 服务器: #i…

【天软行业全景画像】报告第8期

行业全景画像因子 报告概要:传媒、环保、机械设备行业的拥挤度较高,实际投资交易应注意;煤炭、银行、石油石化行业动量较强,医药生物、综合、计算机行业动量较弱,业绩整体表现较差;食品饮料、公用事业行业景…

书生·浦语大模型实战营(第二期):XTuner 微调 LLM

目录 Finetune简介两种Finetune范式一条数据的一生标准格式数据添加对话模板两种finetune的loss计算 LoRA&QLoRA XTunerXTuner简介XTuner快速上手安装&训练配置模板对话工具数据处理数据集映射函数 InternLM2 1.8B模型多模态LLM给LLM装上电子眼:多模态LLM原…

技术速递|为 .NET iOS 和 .NET MAUI 应用程序添加 Apple 隐私清单支持

作者:Gerald Versluis 排版:Alan Wang Apple 正在推出一项隐私政策,将隐私清单文件包含在针对 App Store 上的 iOS、iPadOS 和 tvOS 平台的新应用程序和更新应用程序中。请注意,至少目前 macOS 应用程序被排除在外。 隐私清单文件…

el-table-column叠加el-popover使用

需求&#xff1a;el-table-column有一列展示多个tag信息&#xff0c;实现点击tag展示tag信息以及tag对应的详细信息 table的数据格式 data:[{...,isPopoverVisible:false,},{...,isPopoverVisible:false,},... ]写法&#xff1a; <el-table-column label"配置信息&q…

死磕GMSSL通信-C/C++系列(一)

死磕GMSSL通信-C/C++系列(一) 最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景 1、使用GMSSL guanzhi/GmSSL进行通信 2、使用加密套件SM2-WITH-SMS4-SM3 使用心得 ​…