欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

《自拍教程51》Python_adb批量生成App版本表格

程序员文章站 2022-06-27 20:17:46
案例一 :版本在软件研发阶段是很重要的, 不同的版本, 已修复的Bug也不一样, 所实现的功能不一样, Android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外, 还会逐个验证所搭载的所有App的版本是否都是正确, 防止App做系统集成的时候集成错了,导致App功能缺失或异常! 案例 ......

案例一:版本在软件研发阶段是很重要的, 不同的版本,
已修复的bug也不一样, 所实现的功能不一样,
android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外,
还会逐个验证所搭载的所有app的版本是否都是正确,
防止app做系统集成的时候集成错了,导致app功能缺失或异常!
案例二: 测试经理要求我做一个表,表格包含了系统的所有app名称,
app版本信息, 用于做性能测试数据统计(cpu & memory)。


那问题来了,如何批量把android里边的已经集成的所有app的版本列出来,并生成表格?
以魅族note5手机为例, 如果是手动记录登记,
一般是设置-》应用程序管理-》一个一个的看版本:
《自拍教程51》Python_adb批量生成App版本表格


准备阶段
  1. adb shell pm list package 可以列出所有系统内的app包名,
    pm是package manger的简称,是android的一个重要的app安装包管理工具,
    可用于安装app,卸载app,列出所有app等。
  2. adb shell dumpsys package + app包名可以解析version相关信息,
    dumpsys 是android重要的解析工具,可以解析app package。
  3. 可以考虑用openpyxl模块来生成一个excel格式,当然也可以考虑做成csv文本格式,
    如果是excel操作,都建议用openpyxl,尽量不用xlrd, xlwt等过时的模块。
    《自拍教程51》Python_adb批量生成App版本表格

python批处理脚本形式

批处理脚本的精髓就是顺序执行,可批量处理。

# coding=utf-8

import os
import re
import csv

app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
app_version_dict = {}  # 新建一个空字典,用于存放app package name及version信息。

# 先读取系统内的所有app的package
app_str = os.popen("adb shell pm list package").read()

for line in app_str.splitlines():
    app_list.append(line.replace("package:", ""))
print(app_list)

# 获取各个app package的version信息
for app in app_list:
    version_str = os.popen("adb shell \"dumpsys package %s| grep versionname\"" % app).read()
    version_name = re.findall(r"versionname=(.*)", version_str)[0]
    print("app : %s, version : %s" % (app, version_name))
    app_version_dict[app] = version_name

# 将app_version_dict字典写入csv 表格中。
table_title = ["app_package_name", "version"]  # 表格第一行

csvfile = "app_version.csv"
with open(csvfile, "w", newline='') as hf:
    writer = csv.dictwriter(hf, fieldnames=table_title)  # 将字典填写进csv,建议用dictwriter类
    writer.writeheader()
    for key, value in app_version_dict.items():
        writer.writerow({'app_package_name': key, 'version': value})

print("app的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))
os.system("pause")

python面向过程函数形式
# coding=utf-8

import os
import re
import csv


def get_package():
    app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
    app_str = os.popen("adb shell pm list package").read()
    for line in app_str.splitlines():
        app_list.append(line.replace("package:", ""))
    return app_list


def get_app_version(app_package):
    '''获取指定app的版本号'''
    version_str = os.popen("adb shell \"dumpsys package %s| grep versionname\"" % app_package).read()
    version_name = re.findall(r"versionname=(.*)", version_str)[0]
    print("app : %s,  version : %s" % (app_package, version_name))
    return version_name


def get_all_apps_version():
    '''获取所有app的版本号'''
    app_version_dict = {}  # 新建一个空字典,用于存放app package name及version信息。
    for app in get_package():
        version_name = get_app_version(app)
        app_version_dict[app] = version_name
    return app_version_dict


def write_csv(input_dict, csvfile):
    '''将app_version_dict字典写入csv 表格中'''
    table_title = ["app_package_name", "version"]  # 表格第一行
    with open(csvfile, "w", newline='') as hf:
        writer = csv.dictwriter(hf, fieldnames=table_title)
        writer.writeheader()
        for key, value in input_dict.items():
            writer.writerow({'app_package_name': key, 'version': value})
    print("app的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))


app_version_dict = get_all_apps_version()  # 获取所有的app及其版本组成的字典
csvfile = "app_version.csv"  # 自定义指定保存到哪个csvfile
write_csv(app_version_dict, csvfile)  # 将字典写入csv
os.system("pause")

python面向对象类形式
# coding=utf-8

import os
import re
import csv


class packageversiongetter():
    def __init__(self):
        self.app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
        self.app_version_dict = []  # 新建一个空字典,用于存放app package name及version信息。

    def get_package(self):
        app_str = os.popen("adb shell pm list package").read()
        for line in app_str.splitlines():
            self.app_list.append(line.replace("package:", ""))

    def get_app_version(self, app_package):
        '''获取指定app的版本号'''
        version_str = os.popen("adb shell \"dumpsys package %s| grep versionname\"" % app_package).read()
        version_name = re.findall(r"versionname=(.*)", version_str)[0]
        print("app : %s,  version : %s" % (app_package, version_name))
        return version_name

    def get_all_apps_version(self):
        '''获取所有app的版本号'''
        self.get_package()  # 确保self.app_list里边有数据,不会是空列表
        for app in self.app_list:
            version_name = self.get_app_version(app)
            self.app_version_dict[app] = version_name
        return self.app_version_dict


class csvwriter():
    def __init__(self, csvfile, input_dict):
        self.csvfile = csvfile
        self.input_dict = input_dict

    def write_csv(self):
        '''将app_version_dict字典写入csv 表格中'''
        table_title = ["app_package_name", "version"]  # 表格第一行
        with open(self.csvfile, "w", newline='') as hf:
            writer = csv.dictwriter(hf, fieldnames=table_title)
            writer.writeheader()
            for key, value in self.input_dict.items():
                writer.writerow({'app_package_name': key, 'version': value})
        print("app的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))


if __name__ == '__main__':
    p_obj = packageversiongetter()
    app_version_dict = p_obj.get_all_apps_version()  # 获取所有的app及其版本组成的字典

    csvfile = "app_version.csv"  # 自定义指定保存到哪个csvfile
    c_obj = csvwriter(csvfile, app_version_dict)
    c_obj.write_csv()  # 将字典写入csv
    os.system("pause")

运行方式与效果

确保android设备通过usb线与电脑连接了,adb设备有效连接,
以上代码的3种实现形式都可以直接运行,比如保存为get_app_version.py并放在桌面,
建议python get_app_version.py运行,当然也可以双击运行。
效果如下:备注有些版本是7是正常的,因为这些是google自带的android7版本的app.
《自拍教程51》Python_adb批量生成App版本表格

更多更好的原创文章,请访问官方网站:
自拍教程(自动化测试python教程,武散人编著)
原文链接:
也可关注“武散人”微信订阅号,随时接受文章推送。
《自拍教程51》Python_adb批量生成App版本表格