《自拍教程43》Python adb一键读取硬件配置

Android系统测试过程中,
比如接口测试,需要用到设备的iccid, 或者uuid,
车载测试需要用到VIN号(车辆唯一标识号),
4G测试等需要设计IMEI号等设备配置字参数等,
我们还可以读取到设备的分辨率,emmc磁盘容量,
cpu型号,内存大小等,这些硬件配置信息,
可以辅助我们做测试,如何读取到这些硬件信息呢?


准备阶段
  1. adb shell getprop命令,可以获取到Android设备iccid, imei,emmc磁盘容量等
  2. adb shell wm size 可以读取到分辨率
  3. adb shell cat /proc/cpuinfo 可以读取到cpu相关的信息
  4. adb shell cat /proc/meminfo 或adb shell free 可以读取到内存相关的信息
  5. os.popen()函数可以快速调用以上命令并获取输出字符串。
  6. python的re正则表达式可以轻易地进行数据匹配,查找等强大的字符串处理

getprop命令介绍

getprop命令是android自带的动态获取系统属性参数,
包括了软件,硬件属性参数等,其有好几种执行方式,包括:
用法一: getprop 获取全部系统属性参数,
比如魅族Note5的getprop我们保存为txt文件(可点击下载)

用法二: getprop 属性名,可获取某个指定属性的具体参数信息,比如:

相对应的,也有setprop命令是设置某个属性的具体参数的,
测试一般不建议随意设置属性参数。

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

import os
import re

# 获取iccid
try:
    iccid_1 = os.popen("adb shell getprop persist.radio.cfu.iccid.0").read().strip()
    iccid_2 = os.popen("adb shell getprop persist.radio.cfu.iccid.1").read().strip()
except:
    iccid_1 = "Unknown"
    iccid_2 = "Unknown"
print("iccid_1: %s" % iccid_1)
print("iccid_2: %s" % iccid_2)

# 获取imei
try:
    imei = os.popen("adb shell getprop ril.gsm.imei").read().strip().split(",")
except:
    imei = ["Unknown", "Unknown"]
print("IMEI_1: %s" % imei[0])
print("IMEI_2: %s" % imei[1])

# 获取EMMC磁盘容量
try:
    emmc_size = os.popen("adb shell getprop vold.emmc_size").read().strip()
    emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
except Exception as e:
    print(e)
    emmc_size = "Unknown"
print("EMMC_Size: %s GB" % emmc)

# 获取Android设备的内存容量大小
ram_size = os.popen("adb shell cat /proc/meminfo").read()
try:
    ram_size = re.findall(r"MemTotal:(.*)", ram_size)[0].strip()
    ram_size = re.sub("kB", "", ram_size)
    ram_size = str(round(int(ram_size) / 1024 / 1024))
except Exception as e:
    print(e)
    ram_size = "Unknown"
print("RAM Size: %s GB" % ram_size)

# 获取Android设备的CPU型号
cpu_profile = os.popen("adb shell cat /proc/cpuinfo").read()
try:
    cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
except:
    cpu_profile = "Unknown"
print("CPU Profile: %s" % cpu_profile)

# 获取Android设备的分辨率
resolution = os.popen("adb shell wm size").read()
resolution = resolution.split(":")[1].strip()
print("Resolution: %s" % resolution)

os.system("pause")

try ...
except Exception as e 是用来做调试用的,
即当出现常规异常的时候,print(e)显示报错内容,
且当出现异常时,相应的硬件信息将赋值为“Unknown”,
有利于提高程序的健壮性!

Python面向过程函数形式

本次进行改进:

  1. os.popen("命令").read()用的太多了,我们需要考虑封装成一个函数。
  2. 获取各类硬件设备配置的语句块,分别独立做成一个个的函数。
# coding=utf-8

import os
import re


# 独立一个get_popen执行命令并获取其输出字符串
def get_popen(command):
    p_str = os.popen("%s" % command).read()
    return p_str.strip()


def get_iccid():  # 获取iccid
    try:
        iccid_1 = get_popen("adb shell getprop persist.radio.cfu.iccid.0")
        iccid_2 = get_popen("adb shell getprop persist.radio.cfu.iccid.1")
    except:
        iccid_1 = "Unknown"
        iccid_2 = "Unknown"
    return iccid_1, iccid_2


def get_imei():  # 获取imei
    try:
        imei = get_popen("adb shell getprop ril.gsm.imei").split(",")
    except:
        imei = ["Unknown", "Unknown"]
    return imei


def get_emmc_size():  # 获取EMMC磁盘容量
    try:
        emmc_size =get_popen("adb shell getprop vold.emmc_size")
        emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
    except:
        emmc_size = "Unknown"
    return emmc_size


def get_ram_size():  # 获取Android设备的内存容量大小
    ram_size = get_popen("adb shell cat /proc/meminfo")
    try:
        ram_size = re.findall(r"MemTotal:(.*)", ram_size)[0].strip()
        ram_size = re.sub("kB", "", ram_size)
        ram_size = str(round(int(ram_size) / 1024 / 1024))
    except:
        ram_size = "Unknown"
    return ram_size


def get_cpu_profile():  # 获取Android设备的CPU型号
    cpu_profile = get_popen("adb shell cat /proc/cpuinfo")
    try:
        cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
    except:
        cpu_profile = "Unknown"
    return cpu_profile


def get_resolution():  # 获取Android设备的分辨率
    resolution = get_popen("adb shell wm size")
    resolution = resolution.split(":")[1].strip()
    return resolution


iccid_1, iccid_2 = get_iccid()
imei = get_imei()
emmc_size = get_emmc_size()
ram_size = get_ram_size()
cpu_profile = get_cpu_profile()
resolution = get_resolution()
print("iccid_1: %s" % iccid_1)
print("iccid_2: %s" % iccid_2)
print("IMEI_1: %s" % imei[0])
print("IMEI_2: %s" % imei[1])
print("EMMC_Size: %s GB" % emmc_size)
print("RAM Size: %s GB" % ram_size)
print("CPU Profile: %s" % cpu_profile)
print("Resolution: %s" % resolution)

os.system("pause")

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

import os
import re


# 独立一个get_popen执行命令并获取其输出字符串
def get_popen(command):
    p_str = os.popen("%s" % command).read()
    return p_str.strip()


class HWInfoGetter():
    def __init__(self):
        self.iccid_1 = None
        self.iccid_2 = None
        self.imei = None
        self.emmc_size = None
        self.ram_size = None
        self.cpu_profile = None
        self.resolution = None

    def get_iccid(self):  # 获取iccid
        try:
            self.iccid_1 = get_popen("adb shell getprop persist.radio.cfu.iccid.0")
            self.iccid_2 = get_popen("adb shell getprop persist.radio.cfu.iccid.1")
        except:
            self.iccid_1 = "Unknown"
            self.iccid_2 = "Unknown"
        return self.iccid_1, self.iccid_2

    def get_imei(self):  # 获取imei
        try:
            self.imei = get_popen("adb shell getprop ril.gsm.imei").split(",")
        except:
            self.imei = ["Unknown", "Unknown"]
        return self.imei

    def get_emmc_size(self):  # 获取EMMC磁盘容量
        try:
            self.emmc_size = get_popen("adb shell getprop vold.emmc_size")
            self.emmc_size = str(int(int(emmc_size) / 1024 / 1024 / 1024))
        except:
            self.emmc_size = "Unknown"
        return self.emmc_size

    def get_ram_size(self):  # 获取Android设备的内存容量大小
        self.ram_size = get_popen("adb shell cat /proc/meminfo")
        try:
            self.ram_size = re.findall(r"MemTotal:(.*)", self.ram_size)[0].strip()
            self.ram_size = re.sub("kB", "", self.ram_size)
            self.ram_size = str(round(int(self.ram_size) / 1024 / 1024))
        except:
            self.ram_size = "Unknown"
        return self.ram_size

    def get_cpu_profile(self):  # 获取Android设备的CPU型号
        cpu_profile = get_popen("adb shell cat /proc/cpuinfo")
        try:
            self.cpu_profile = re.findall(r"Hardware\s+:(.*)", cpu_profile)[0].strip()
        except:
            self.cpu_profile = "Unknown"
        return self.cpu_profile

    def get_resolution(self):  # 获取Android设备的分辨率
        self.resolution = get_popen("adb shell wm size")
        self.resolution = self.resolution.split(":")[1].strip()
        return self.resolution


if __name__ == '__main__':
    h_obj = HWInfoGetter()
    iccid_1, iccid_2 = h_obj.get_iccid()
    imei = h_obj.get_imei()
    emmc_size = h_obj.get_emmc_size()
    ram_size = h_obj.get_ram_size()
    cpu_profile = h_obj.get_cpu_profile()
    resolution = h_obj.get_resolution()
    print("iccid_1: %s" % iccid_1)
    print("iccid_2: %s" % iccid_2)
    print("IMEI_1: %s" % imei[0])
    print("IMEI_2: %s" % imei[1])
    print("EMMC_Size: %s GB" % emmc_size)
    print("RAM Size: %s GB" % ram_size)
    print("CPU Profile: %s" % cpu_profile)
    print("Resolution: %s" % resolution)
    os.system("pause")

代码运行方式

确保Android车机设备通过USB线与电脑连接了,adb设备有效连接,
以上代码的3种实现形式都可以直接运行,比如保存为get_hw_info.py并放在桌面,
每次需要获取系统版本信息的时候,双击运行get_hw_info.py,
运行效果如下(以魅族Note5为例),

对比如下:


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

posted @ 2020-03-13 12:33  zipython  阅读(690)  评论(0编辑  收藏  举报