案例一: 版本在软件研发阶段是很重要的, 不同的版本,
已修复的 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.
更多更好的原创文章, 请访问官方网站: https://www.zipython.com/
自拍教程 (自动化测试 Python 教程, 武散人编著)
来源: http://www.bubuko.com/infodetail-3484480.html