《自拍教程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
也可關注「武散人」微信訂閱號,隨時接受文章推送。