思路:
1、前提:已连接设备,查询连接设备,cmd输入命令:adb devices
2、批量获取device name,然后过滤
①正则表达式过滤:‘\n(.+?)\t‘
debug模式下可看到device name是以\n开头、\t结束
②字符串过滤
3、使用到的adb命令
# 查询已连接设备 adb devices # 多设备连接时,添加参数-s adb -s <devices_name> # 查询是否已安装某个apk adb -s <devices_name> shell pm list packages | findstr "<package_name>" # 安装apk adb -s <devices_name> install <apk路径> # 卸载apk adb -s <devices_name> uninstall <package_name> # 查询包名 adb shell pm list pm list packages -3 # 查询第三方应用 aapt dump badging <apk路径> # 获取包名
4、设备是否已安装apk,已安装则卸载,未安装则安装
后续可优化:1、apk安装路径从网站下载
2、多进程同步执行命令,可以多设备同时进行
实现代码:
1 # coding=utf-8 2 import re 3 import os 4 import time 5 6 7 def get_devices(): 8 str_init = ‘ ‘ 9 # 获取命令adb devices所有打印内容 10 all_info = os.popen(‘adb devices‘).readlines() 11 # 过滤打印设备名称 12 for i in range(len(all_info)): 13 str_init += all_info[i] 14 device = re.findall(‘\n(.+?)\t‘, str_init, re.S) 15 return device 16 17 18 def in_uninstall_apk(): 19 result = ‘‘ 20 file = r‘<安装包路径>‘ 21 for i in get_devices(): 22 # 查询是否已安装apk 23 package_list = os.popen(‘adb -s %s shell pm list packages | findstr "<pacakge_name>"‘ % i).read() 24 if len(get_devices()) == 0: 25 result = ‘无可连接设备‘ 26 # 已安装,则卸载 27 if ‘<pacakge_name>‘ in package_list: 28 cmd = ‘adb -s %s uninstall <pacakge_name>‘ % i 29 os.system(cmd) 30 result = f"设备:{‘、‘.join([str(count) for count in get_devices()])}卸载成功。" 31 else: # 未安装 32 cmd = ‘adb -s %s install %s‘ % (i, file) 33 os.system(cmd) 34 time.sleep(2) 35 result = f"设备:{‘、‘.join([str(count) for count in get_devices()])},安装apk:{file}成功。" 36 return result 37 38 39 print(in_uninstall_apk())
原文:https://www.cnblogs.com/spritegirl/p/14842538.html