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

已修复的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. DBFlow框架的学习笔记之入门

    什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...

  2. python3.4多线程实现同步的四种方式

    临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区. 1. 锁机制 threadin ...

  3. mysql 分表实现方法详解

    如果你需要进行mysql分表了我们就证明你数据库比较大了,就是把一张表分成N多个小表,分表后,单表的并发能力提高了,磁盘I/O性能也提高了.并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出 ...

  4. Leetcode 943. Find the Shortest Superstring(DP)

    题目来源:https://leetcode.com/problems/find-the-shortest-superstring/description/ 标记难度:Hard 提交次数:3/4 代码效 ...

  5. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...

  6. mysql插入数据报错一二

    上周selenium+phantomjs+python3简单爬取一个网站,往数据库写数据遇到以下两个问题,记录一下: 报错一:Data truncated for column 'update_tim ...

  7. echart 之实现温度计

    百度这个图表支持不是很好,有的需要自己写,看大神们实现温度计都是用 水球特效实现的我这里雕虫小计啊但是满足我了我的项目需求特此分享出来,可惜自己不是专业的前端 这是我的实现结果 好了上代码html: ...

  8. 高性能内存队列Disruptor--原理分析

    1.起源     Disruptor最初由lmax.com开发,2010年在Qcon公开发表,并于2011年开源,其官网定义为:"High Performance Inter-Thread ...

  9. Python爬虫 - UserAgent列表

    PC端: PC_USER_AGENT = [ 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Mozilla/4.0 (compatibl ...

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

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