![cover](https://img-blog.csdnimg.cn/97ac8839625f4365adec2fd950a4f78b.png)
【安卓辅助】安卓批量管理器
省略了挨个粘贴输入 adb -s device_sn 的麻烦,面对多台设备时提高了操作的效率。
·
安卓批量管理器
需要操作多台安卓设备时终端挨个输入太慢
省略了挨个粘贴输入 adb -s device_sn 面对多台设备时提高了操作的效率。
操作界面
代码如下
from multiprocessing.sharedctypes import Value
import PySimpleGUI as sg
import os
from email.policy import default
# from re import S
import PySimpleGUI as sg
import os
import re
import time
"""
批量操作安卓设备的工具,
TODO: logcat。。。
Author:v_litianchao
Date:2022/10/25
"""
class DevicesManager():
""" 多台设备管理工具 """
def __init__(self):
# 最多能连接多少台设备,要改这个的同时也要改 tab1_devices_operate_layout
self.max_device_num = 16
# 在历史操作命令里,准备一些常用的命令
self.command_history = [
'shell dumpsys package com.baidu.duershow.media | grep version',
'root',
'remount',
'reboot',
]
# Tab1中的 常用的按钮 以及其对应命令
self.common_button = {
'卸载': 'uninstall ',
'安装': 'install -r -t ',
'query广播': 'shell am broadcast -a com.baidu.duer.query -e q "播放歌曲"',
'查看软件版本': 'shell dumpsys package App_name | grep version',
'清理软件': 'shell pm clear com.baidu.duershow.media',
}
# 每次操作的返回信息
self.alret = '( * ̄▽ ̄)'
def online_devices(self):
"""连接的设备"""
cmd = 'adb devices '
d = os.popen(cmd=cmd)
d = [i.split('\t')[0] for i in d.read().replace(
'List of devices attached\n', '').split('\n') if i]
# print(d)
# return ['456', '789', '123']
return d
def device_model(self, device=''):
"""获取设备的型号"""
cmd = 'adb -s {} shell getprop | grep ro.ota.product.model'.format(
device)
m = os.popen(cmd=cmd)
m = m.read()
print(m)
# m = re.compile(r'[\[]](.*)[\]]', m)
m = re.findall(": \[(.+?)\]", m)
if m:
m = m[0]
else:
m = 'ERROR'
return m
def dev_table(self,):
"""设备列表"""
a = self.online_devices()
t = []
for i in a:
t.append([i, self.device_model(i)])
return t
def appoint_devices_and_exec(self, devices=['sn'], cmd=''):
"""
指定一些设备的SN并且逐一执行命令
:param devices: list 列表里的元素为设备的SN
:param cmd: String 命令省去了 adb -s sn 的部分
:return: list 每台设备执行命令后的返回
"""
res = []
for i in range(self.max_device_num):
res.append('╮(╯_╰)╭没执行')
self.window['设备'+str(i)].update(value='╮(╯_╰)╭没执行')
if not cmd:
print('空命令')
return
for i, j in zip(devices, range(len(devices))):
exec_cmd = "adb -s {} {} ".format(i, cmd)
print(exec_cmd)
r = os.popen(exec_cmd)
r = r.read()
print(r)
output = exec_cmd+'\n'+r
# 获取元素在列表中的位置
print(self.dev_table(), i)
n = [d[0] for d in self.dev_table()].index(i)
self.window['设备'+str(n)].update(value=output)
print()
def appear_interface_main(self,):
"""主要显示界面"""
selected_devices = []
devices_table = self.dev_table()
tab_devices_operate_layout = [
[
sg.Text('先选择设备再执行测试>'),
sg.Button('刷新设备列表')
],
[
sg.Text('adb -s '), sg.Table(values=devices_table,
headings=['设备SN', '设备型号'],
auto_size_columns=True,
display_row_numbers=True,
enable_events=True, # 点击开启
justification='right',
num_rows=len(
self.online_devices()),
key='-TABLE-',
row_height=25), sg.Multiline(size=(30, 5), key='cmd'), sg.Button('执行选中设备adb shell'),
],
[
sg.Text('选择多台设备需要按住ctrl或command多条选中'),
],
[
sg.Text('操作>'),
],
[sg.Button(bt) for bt in self.common_button],
[
sg.Text('历史>'),
sg.Listbox(self.command_history, size=(70, 5),
enable_events=True, # 点击开启
key='-LIST-'),
],
[
sg.Text('终端>'),
sg.TabGroup([
# [
# # sg.Tab('例1x', [[sg.CB(i)]for i in range(2)]),
# sg.Tab('0', [[sg.Multiline(size=(90, 10), key='设备0')]]),
# sg.Tab('1', [[sg.Multiline(size=(90, 10), key='设备1')]]),
# sg.Tab('2', [[sg.Multiline(size=(90, 10), key='设备2')]]),
# ],
[sg.Tab(str(i), [[sg.Multiline(size=(90, 10), key='设备'+str(i))]])
for i in range(self.max_device_num)],
], key='devices_termnal'),
# sg.Col(col_layout)
],
]
col_layout = [
[sg.Text('姓名', size=(3, 1)), sg.In(size=(3, 1))],
[sg.Text('性别', size=(3, 1)), sg.In(size=(3, 1))],
[sg.Text('国籍', size=(3, 1)), sg.In(size=(3, 1))],
]
tab_logcat_layout = [[sg.LB(list(range(15)), size=(20, 6)),
sg.TabGroup([[sg.Tab('1x', [[sg.CB(i)]for i in range(2)]),
sg.Tab('2x', [[sg.Combo(list(range(15)), size=(10, 3))]])]]),
sg.Col(col_layout)], [
sg.Frame('slider', [[sg.Slider(orientation='h', size=(50, 10))]])]]
layout_main = [
[
sg.TabGroup([
[
sg.Tab('设备操作', tab_devices_operate_layout,
title_color='blue',),
sg.Tab('Logcat预留', tab_logcat_layout),
],
])
],
[sg.Text(self.alret, key='alret'), ],
]
self.window = sg.Window('Python GUI', layout_main, keep_on_top=True)
while True:
event, values = self.window.read()
# print(event,values)
if event == None:
break
if event in ('刷新设备列表'):
self.window['-TABLE-'].update(values=self.dev_table(),
num_rows=len(self.online_devices()),)
# 点击表格
if event in ('-TABLE-'):
# print('选中了这几行的数据', values['-TABLE-'])
selected_devices = [self.online_devices()[i]
for i in values['-TABLE-']]
# print(selected_devices)
if event in ('执行选中设备adb shell'):
# print('devices', selected_devices, 'cmd', values['cmd'])
term_r = self.appoint_devices_and_exec(
devices=selected_devices, cmd=values['cmd'])
if values['cmd'] != self.command_history[0]:
if values['cmd'] in self.command_history:
self.command_history.remove(values['cmd'])
self.command_history.insert(0, values['cmd'])
self.window['-LIST-'].update(self.command_history)
if event in ('-LIST-'):
# 历史命令
self.window['cmd'].update(value=values['-LIST-'][0])
elif event in self.common_button.keys():
# 常用按钮
self.window['cmd'].update(value=self.common_button[event])
self.window.close()
a = DevicesManager()
a.appear_interface_main()
更多推荐
所有评论(0)