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

  • 2020 年 3 月 30 日
  • 笔记

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

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

准备阶段
  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等过时的模块。

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
也可关注“武散人”微信订阅号,随时接受文章推送。