python自動安裝apk包(單線程和線程池兩種代碼)

1、readme

1、把需要安裝的應用放在apps裏,包名嵌套apk的形式
2、連接設備,保證adb devices能連上
3、運行main.py
4、安裝包較大,請耐心等待

2、main.py(單線程 4個app88秒,後面有線程池的寫法)

import datetime
import os
import subprocess


class App:
    def install_app(self, app_path):
        # 安裝app
        # [b'Performing Streamed Install\r\n', b'Success\r\n']
        print('===開始安裝{}'.format(app_path))
        status = False  # True安裝成功,False 失敗
        installCmd = r'adb install -r %s' % (app_path)
        result = subprocess.Popen(installCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        for i in result.stdout.readlines():
            info = i.decode('utf-8')
            if 'Success' in info:
                status = True
        return status, app_path

    def run(self, app_path):
        return self.install_app(app_path)


def get_devices():
    # 獲取設備
    cmd = r'adb devices'
    devList = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    devices = []
    for line in devList.stdout.readlines()[1:]:
        line = line.decode('utf-8')
        if 'List' not in line:
            devices.append((line.split('\t'))[0])
    devices.pop()
    return devices


if __name__ == '__main__':

    start = datetime.datetime.now()
    devices = get_devices()
    if len(devices) == 0:
        print('error:請連接設備再運行!')

    # apps根路徑,在當前包的apps裏
    url = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'apps')
    app_paths = []
    for package in os.listdir(url):
        for app in os.listdir(os.path.join(url, package)):
            if '.apk' in app:
                app_paths.append(os.path.join(url, package, app))
    success = []
    error = []
    for app_path in app_paths:
        status, app_path = App().run(app_path)
        if status:
            success.append(app_path)
        else:
            error.append(app_path)

    print('成功安裝:{}'.format(','.join(success)))
    if len(error) == 0:
        error.append('無')
    if len(success) == 0:
        success.append('無')
    print('失敗安裝:{}'.format(','.join(error)))

    end = datetime.datetime.now()
    print('===cost:{}s'.format((end - start).seconds))

3、目錄結構

4、線程池(4個app55秒)

import datetime
import os
import subprocess
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

class App:

    def install_app(self, app_path):
        # 安裝app
        # [b'Performing Streamed Install\r\n', b'Success\r\n']
        print('===開始安裝{}'.format(app_path))
        status = False  # True安裝成功,False 失敗
        installCmd = r'adb install -r %s' % (app_path)
        result = subprocess.Popen(installCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        for i in result.stdout.readlines():
            info = i.decode('utf-8')
            if 'Success' in info:
                status = True
        return status, app_path

    def run(self, app_path):
        return self.install_app(app_path)


def get_devices():
    # 獲取設備
    cmd = r'adb devices'
    devList = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    devices = []
    for line in devList.stdout.readlines()[1:]:
        line = line.decode('utf-8')
        if 'List' not in line:
            devices.append((line.split('\t'))[0])
    devices.pop()
    return devices


if __name__ == '__main__':

    start = datetime.datetime.now()
    devices = get_devices()
    if len(devices) == 0:
        print('error:請連接設備再運行!')

    # apps根路徑,在當前包的apps裏
    url = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'apps')
    app_paths = []
    for package in os.listdir(url):
        for app in os.listdir(os.path.join(url, package)):
            if '.apk' in app:
                app_paths.append(os.path.join(url, package, app))
    success = []
    error = []

    executor = ThreadPoolExecutor(max_workers=4)
    tasks = [executor.submit(App().run,app_path) for app_path in app_paths]
    for future in as_completed(tasks):
        try:
            status,app_path = future.result()
            if status:
                success.append(app_path)
            else:
                error.append(app_path)
        except Exception as e:
            print('===error:{}'.format(e))

    if len(error) == 0:
        error.append('無')
    if len(success) == 0:
        success.append('無')
    print('成功安裝:{}'.format(','.join(success)))
    print('失敗安裝:{}'.format(','.join(error)))

    end = datetime.datetime.now()
    print('===cost:{}s'.format((end - start).seconds))


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章