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