《自拍教程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
也可關注“武散人”微信訂閱號,隨時接受文章推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章