案例一:版本在軟體研發階段是很重要的, 不同的版本,
已修復的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
也可關注“武散人”微信訂閱號,隨時接受文章推送,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/162489.html
標籤:Python
上一篇:day14裝飾器
下一篇:無監督學習與sklearn庫
