• 《自拍教程42》Python adb一键读取系统版本信息


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


    准备阶段
    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为例),

    对比如下(安全补丁时间和系统打版编译时间是两码事)


    更多更好的原创文章,请访问官方网站:www.zipython.com
    自拍教程(自动化测试Python教程,武散人编著)
    原文链接:https://www.zipython.com/#/detail?id=3ccb257563254802b640d624d3c6ca6f
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    windows service 安装和卸载指令
    jackson 进行json与java对象转换 之四
    jackson 进行json与java对象转换 之三
    jackson 进行json与java对象转换 之二
    jackson 进行json与java对象转换 之一
    jackson2.x与Jackson1.9的比较
    判断Integer值相等不能用==
    java:String使用equals和==比较的区别
    Java中自定义枚举(Enum)项的值,可设置为指定的值
    Java enum(枚举)使用详解之四
  • 原文地址:https://www.cnblogs.com/zipython/p/12482381.html
Copyright © 2020-2023  润新知