Android系统测试,
开始测试前,我们需要先确认所测试的系统版本是否正确,
还有报bug的时候,开发需要你提供具体的系统版本信息。
还有系统打版时间等,
不同的版本修复了不同的bug,合入了不同的新功能等,
如果测试人员测试的系统版本都不对,会直接被开发怼到哭。
如何一键获取Android系统版本信息呢?
一般我们通过读取/system/build.prop这个配置文件来获取,
这套方案基本适合所有的Android终端设备获取系统版本信息。


SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
准备阶段
  1. adb shell cat /system/build.prop,可以获取系统版本信息。
  2. os.popen()可以轻易地获取以上命令的输出字符串。
  3. python的re正则表达式可以轻易地进行数据匹配,查找等强大的字符串处理

build.prop文件介绍

build.prop是Android系统中的一个重要的属性文件,
其是在版本编译时自动生成的一个属性文件,
记录了包括系统版本,系统编译时间,Android版本号等,
刷机完成后,一般存储在Android设备的/system/build.prop文件。
我们可以通过cat /system/build.prop命令查看这个文件.
比如魅族Note5的build.prop文件(可点击下载)

os.popen()函数介绍

之前的课程,我们一直用的是os.system()函数执行命令行,
本次我们增加难度,换用os.popen()函数执行命令行,
os.popen()函数的优势是:

  1. 能很方便地获取命令执行后的输出字符串
  2. 非阻塞式执行命令

Python批处理脚本形式
# coding=utf-8

import os
import re

#执行并读取命令行输出
info = os.popen("adb shell cat /system/build.prop").read()
# 一般获的的字符串都先建议进行移除字符串头尾的空格和换行符
info = info.strip()

# 获取系统版本
try:
    build_version = re.findall(r"ro.build.display.id=(.*)", info)[0].strip()
except:
    build_version = "Unknown"
print("Build Version: %s"%build_version)

#获取系统版本打版(编译)时间
try:
    build_time = re.findall(r"ro.build.date=(.*)", info)[0].strip()
except:
    build_time = "Unknown"
print("Build Time: %s"%build_time)

#获取系统原生Android的版本号
try:
    android_version = re.findall(r"ro.build.version.release=(.*)", info)[0].strip()
except:
    android_version = "Unknown"
print("Android Version: %s"%android_version)

os.system("pause")

re.findall()函数,可以进行匹配字符串,如果匹配到这个区域(.*),
就是括号内的东西,则提取出来,返回一个匹配成功的字符串列表。
我们只提取列表里的第一项字符串,
只要是字符串,都建议进行strip()处理。
try...except是尝试去匹配,因为难免有的android设备,
可能字段不一致,导致无法匹配上任何字符串,则返回空的字符串列表,
则无法通过序号[0]访问字典导致直接报错的异常情况,
且当出现异常时,相应的系统版本信息将赋值为“Unknown”,
有利于提高程序的健壮性!

Python面向过程函数形式
# coding=utf-8

import os
import re


def get_info():
    # 执行并读取命令行输出
    info = os.popen("adb shell cat /system/build.prop").read()
    # 一般获的的字符串都先建议进行移除字符串头尾的空格和换行符
    info = info.strip()

    # 获取系统版本
    try:
        build_version = re.findall(r"ro.build.display.id=(.*)", info)[0].strip()
    except:
        build_version = "Unknown"

    # 获取系统版本打版(编译)时间
    try:
        build_time = re.findall(r"ro.build.date=(.*)", info)[0].strip()
    except:
        build_time = "Unknown"

    # 获取系统原生Android的版本号
    try:
        android_version = re.findall(r"ro.build.version.release=(.*)", info)[0].strip()
    except:
        android_version = "Unknown"

    return build_version, build_time, android_version  # 一次性返回1个列表(3个变量值)


build_version, build_time, android_version = get_info()

print("Build Version: %s" % build_version)
print("Build Time: %s" % build_time)
print("Android Version: %s" % android_version)
os.system("pause")


Python面向对象类形式
  1. 以"万物皆可归类"的思想, 先抽象化出一个类来,
    类名一般建议用"名词", 所以我们命名为"InfoGetter",
    代表信息获取器, 且一般要驼峰式(首字母大写)来规范类的命名。
  2. 养成良好的类的初始化(__init__)的习惯,
    初始化过程中, 可以初始化3个属性(变量),类范围内可随意调用
  3. 有一个get_info函数就够了
  4. 类是一个抽象的事物, 必须实例化成具体的对象后,
    才能进行调用, 所以我们实例化并命名成了i_obj, 表明是一个对象。
  5. 实例化成具体对象后, 对象就可以调用get_info这个函数了
# coding=utf-8

import os
import re


class InfoGetter():
    def __init__(self):
        self.build_version = None
        self.build_time = None
        self.android_version = None

    def get_info(self):
        # 执行并读取命令行输出
        info = os.popen("adb shell cat /system/build.prop").read()
        # 一般获的的字符串都先建议进行移除字符串头尾的空格和换行符
        info = info.strip()

        # 获取系统版本
        try:
            self.build_version = re.findall(r"ro.build.display.id=(.*)", info)[0].strip()
        except:
            self.build_version = "Unknown"

        # 获取系统版本打版(编译)时间
        try:
            self.build_time = re.findall(r"ro.build.date=(.*)", info)[0].strip()
        except:
            self.build_time = "Unknown"

        # 获取系统原生Android的版本号
        try:
            self.android_version = re.findall(r"ro.build.version.release=(.*)", info)[0].strip()
        except:
            self.android_version = "Unknown"
        return self.android_version, self.build_time, self.android_version


if __name__ == '__main__':
    i_obj = InfoGetter()
    build_version, build_time, android_version = i_obj.get_info()

    print("Build Version: %s" % build_version)
    print("Build Time: %s" % build_time)
    print("Android Version: %s" % android_version)
    os.system("pause")


代码运行方式

确保Android车机设备通过USB线与电脑连接了,adb设备有效连接,
以上代码的3种实现形式都可以直接运行,比如保存为get_info.py并放在桌面,
每次需要获取系统版本信息的时候,双击运行get_info.py,
运行效果如下(以魅族Note5为例),
《自拍教程42》adb命令_一键读取系统版本信息 Python 第1张

对比如下(安全补丁时间和系统打版编译时间是两码事)
《自拍教程42》adb命令_一键读取系统版本信息 Python 第2张

更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=3ccb257563254802b640d624d3c6ca6f
也可关注“武散人”微信订阅号,随时接受文章推送。
《自拍教程42》adb命令_一键读取系统版本信息 Python 第3张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄