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

已修复的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. 读书笔记——《在线》

    * 2017年10月24日 星期二 晴* ## "在线"是未来世界发展的关键.一个事物是不是符合未来发展的趋势,就是要看它是否在线. 插图 **在线** 正文 作者是王坚,阿里巴巴 ...

  2. frp端口映射穿透内网

    前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...

  3. 某某项目SDV软件测试报告范例

    说明:本范例为符合CMMI 5级要求的范例 Prepared by 拟制 小张 Date 日期 2008-04-09 Reviewed by 评审人 小丽.小王.小李.小莉.小三.小四.小猪.小猫.小 ...

  4. Spring Boot 学习1-创建Spring Boot应用

    如果使用Maven, 确保先安装好Maven再继续. 创建POM文件 在这里有两种方式: 继承Spring Boot parent的pom. 不继承. 继承Spring Boot pom 1 2 3 ...

  5. mongodb写入安全级别

    MongoDB的写安全机制 写入安全(Write Concern)是一种由客户端设置的,用于控制写入安全级别的机制,通过使用写入安全机制可以提高数据的可靠性. MongoDB提供四种写入级别,分别是: ...

  6. 【转载】Java for循环

    转载只为个人学习,阅读请前往原地址:Java for循环的几种用法详解 本文主要是来了解一下Java中的几种for循环用法,分析得十分详细,一起来看看. J2SE 1.5提供了另一种形式的for循环. ...

  7. JSR310-新日期APIJSR310新日期API(完结篇)-生产实战

    前提 前面通过五篇文章基本介绍完JSR-310常用的日期时间API以及一些工具类,这篇博文主要说说笔者在生产实战中使用JSR-310日期时间API的一些经验. 系列文章: JSR310新日期API(一 ...

  8. AVCaptureInput和AVCaptureOutput子类介绍

    AVCaptureInput AVCaptureDeviceInput:用于从AVCaptureDevice对象捕获数据. AVCaptureScreenInput:从macOS屏幕上录制的一种捕获输 ...

  9. Go性能分析大杀器PPROF

    这是什么 想要进行性能优化,Go本身自带的工具链就包含了性能分析工具,而且也非常棒,pprof就是Go性能分析的利器,它是Go语言自带的包,有如下两种: runtime/pprof:采集程序(非 Se ...

  10. js原型继承题目

    var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f ...