案例一:版本在软件研发阶段是很重要的, 不同的版本,

已修复的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

也可关注“武散人”微信订阅号,随时接受文章推送。

《自拍教程51》Python_adb批量生成App版本表格的更多相关文章

  1. 《自拍教程52》Python_adb运行Shell脚本

    Android作为一款Linux终端,肯定是支持.sh后缀的Shell脚本的运行的, 有时候测试环境准备或者长时间截取复杂的日志等,开发会给到一些Shell脚本. Shell脚本的执行的优势: 快捷高 ...

  2. 《自拍教程45》Python_adb实时监控Logcat日志

    接上一篇:adb命令_一键截取logcat日志, 有一天, 系统稳定性开发负责人找到我,希望我能在跑android 系统monkey的时候, 实时监控logcat的输出,如果一旦发现"jav ...

  3. 《自拍教程46》Python_adb自动拍照100张

    Android手机测试, 涉及照相机(Camera)应用程序的稳定性测试的用例, 需要涉及100张照片的拍照自动化测试. 准备阶段 先清理老照片,照片一般存放在/scard/DCIM目录下 adb s ...

  4. 如何使用CodeSmith批量生成代码(原创系列教程)

    在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做 ...

  5. 【转】- 使用T4模板批量生成代码

    前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...

  6. Hybrid App技术批量制作APP应用与跨平台解决方案

    前言 简单的聊一聊我开发了4年之久的Hybrid App(混合模式移动应用)平台开发,目前一直在持续开发与维护,支持无编程快速开发! 其本意也不是要吹捧前端有多么强大,只是用自己的实际项目阐述下对于前 ...

  7. 代码批量生成WORD的遇到的问题及解决

    好久没搞工具了,最近因为处理大规模公文处理单文档,自己写了个批量处理WORD的程序:在调试过程中,主要遇到两个问题 第一个是WORD的模板 数据很多,但是WORD模板只需要一个,将数据替换WORD里标 ...

  8. C# 程序自动批量生成 google maps 的KML文件

    原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述 ...

  9. webpack4 系列教程(十三):自动生成HTML文件

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十三):自动生成 HTML 文件>原文地址.更欢迎来我的小站看更多原创内容:go ...

随机推荐

  1. 想清楚再入!VR硬件创业能“要你命”

    每一次跨时代新产品的出现,总会让科技行业疯狂一阵儿,十年前是智能手机,今天自然是VR.自2015年开始,VR火的越来越让人欣喜,让人兴奋,更让人越来越看不清,越来越害怕.数不清的大小品牌义无反顾的杀入 ...

  2. 模拟HTTP请求超时时间设置

    HTTP请求有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间(请求资源超时时间). 使用curl命令行 连接超时时间用 --connect-timeout 参数来指定 数据传输的最大 ...

  3. Windows系统在Python2.7环境下安装numpy, matplotlib, scipy - Lichanghao Blog

    numpy, matplotlib, scipy三个包是科学计算和绘图的利器.安装它们既可以在网上下载exe安装包,也可以用python内置的包管理工具来下载安装,后者较为方便. 这几天做美赛要用到, ...

  4. bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白

    bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白 $("#sel_userName").selectpicker({ "w ...

  5. LeetCode--链表2-双指针问题

    LeetCode--链表2-双指针问题 思考问题: 判断一个链表是否有环 列举几种情况: graph LR A-->B B-->C C-->D D-->E E-->C g ...

  6. ts文件的编译和运行

    hello.ts代码 function sayHello(person: string): string { return 'Hello, ' + person; } let user = 'Tom' ...

  7. node生成excel,动态替换表格内容

    这里使用的是exceljs模块, 好上手,易操作 1. 大致使用步骤 npm install exceljs // 引用var Excel = require('exceljs'); // 创建一个w ...

  8. springboot1.5.9整合websocket实现实时显示的小demo

    最近由于项目需要实时显示数据库更新的数据变化情况,一开始想过在前端使用ajax异步轮询方法实现,但后面考虑到性能和流量等要求,就放弃该方法而选择使用websocket(毕竟现在springboot整合 ...

  9. MySQL中INSERT INTO SELECT的使用

    1. 语法介绍      有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (fi ...

  10. Java Grammar(二):运算符

    运算符简介 计算机自打诞生以来,用作最多的就是进行计算,而计算离不开运算符,所以运算符在我们的Java语言中的地位举足轻重,我们现在就来了解一下Java给我们提供的运算符. 从运算的元素的个数来区分, ...