需要操作多台安卓设备时终端挨个输入太慢

省略了挨个粘贴输入 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()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐