《自拍教程51》Python_adb批量生成App版本表格
- 2020 年 3 月 30 日
- 筆記
案例一:版本在软件研发阶段是很重要的, 不同的版本,
已修复的Bug也不一样, 所实现的功能不一样,
Android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外,
还会逐个验证所搭载的所有App的版本是否都是正确,
防止App做系统集成的时候集成错了,导致App功能缺失或异常!
案例二: 测试经理要求我做一个表,表格包含了系统的所有App名称,
App版本信息, 用于做性能测试数据统计(CPU & Memory)。那问题来了,如何批量把Android里边的已经集成的所有App的版本列出来,并生成表格?
以魅族Note5手机为例, 如果是手动记录登记,
一般是设置-》应用程序管理-》一个一个的看版本:
准备阶段
- adb shell pm list package 可以列出所有系统内的app包名,
pm是package manger的简称,是Android的一个重要的app安装包管理工具,
可用于安装app,卸载app,列出所有app等。 - adb shell dumpsys package + App包名可以解析version相关信息,
dumpsys 是Android重要的解析工具,可以解析App package。 - 可以考虑用openpyxl模块来生成一个excel格式,当然也可以考虑做成csv文本格式,
如果是excel操作,都建议用openpyxl,尽量不用xlrd, xlwt等过时的模块。
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.
更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=966384ef80e24721afbede1dfafb55e5
也可关注“武散人”微信订阅号,随时接受文章推送。