Files
2026-09-22 09:38:26 +08:00

507 lines
19 KiB
Python

# -*- coding: utf-8 -*-
"""
解析当前目录下的 common.ini 文件,获取cp0/cp2/gnss等信息生成version.txt文件
调用方法
python bt_version.py
"""
import os
import time
import re
#import ConfigParser
#from symbols import BMConfigDir
try:
# Python3
from configparser import ConfigParser
except ImportError:
# Python2
from ConfigParser import ConfigParser
CONFIG_FILE = "common.ini"
VERSION_TXT = "bt_version.txt"
SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))
class BT_VERSION(object):
def __init__(self, product, pac_time, target_board_path):
self.product = product
self.pac_time = pac_time
common_ini = self.parse_common_ini()
self.cp0_version = common_ini[0].strip()
self.cp2_version = common_ini[1].strip()
self.gnss_version = common_ini[2].strip()
self.cm4_version = common_ini[3].strip()
self.audio_version = common_ini[4].strip()
self.cp2_version_txt = ''
self.gnss_version_txt = ''
self.pac_name = ''
self.cm4_version_txt = ''
self.audio_version_txt = ''
self.cp_version_dict = {}
self.target_board_path = target_board_path
def get_pac_name(self):
print("====get_pac_name=====")
conf = BMConfigParser()
conf.read(os.path.join(self.product, "pac.ini.bak"))
pac_name = conf.get("Attr", "PAC_NAME")
self.pac_name = pac_name.split('.')[0]
print("pac_name:"+self.pac_name)
return self.pac_name
def get_pac_time(self):
print("====get_pac_time=====")
print("pac_time:"+str(self.pac_time))
return self.pac_time
def get_ap_vnd(self):
print("====get_ap_vnd=====")
board_path = self.product.split('cp_sign')[0]
odm_prop_path = os.path.join(board_path, "odm", "etc", "build.prop")
odm_build_date = os.popen("grep ro.odm.build.date= %s 2>/dev/null" % odm_prop_path).read().strip()
if odm_build_date:
ap_vnd_date = odm_build_date.split('=')[-1]
print("ap vnd date : " + ap_vnd_date)
return ap_vnd_date
else:
print("*****not find build.date*****")
return ""
def get_ap(self):
print("====get_ap=====")
board_path = self.product.split('cp_sign')[0]
odm_prop_path = os.path.join(board_path, "odm", "etc", "build.prop")
system_ext_prop_path = os.path.join(board_path, "system_ext", "etc", "build.prop")
odm_cmd = "grep ro.odm.build.description %s 2>/dev/null"%odm_prop_path
system_ext_cmd = "grep ro.system_ext.build.description %s 2>/dev/null"%system_ext_prop_path
odm_ap = os.popen(odm_cmd).read().strip()
system_ext_ap = os.popen(system_ext_cmd).read().strip()
if system_ext_ap and odm_ap:
system_ext_part = system_ext_ap.split('=')[-1]
ap = odm_ap.split('=')[-1].split(' ')[0] + system_ext_part[system_ext_part.find(' '):]
print("AP version(ro.build.description) combined: " + ap)
return ap
else:
print("*****not find build.description*****")
sys_prop_path = os.path.join(board_path, "system", "build.prop")
cmd = "grep ro.build.description %s 2>/dev/null"%sys_prop_path
ap = os.popen(cmd).read().strip()
if ap:
ap = ap.split('=')[-1]
print("AP version(ro.build.description)" + ap)
return ap
else:
print("*****not find ro.build.description*****")
cmd1 = 'find %s -maxdepth 1 -name "*.json"'%board_path
json_path_tmp = os.popen(cmd1).read().strip()
if not os.path.exists(json_path_tmp):
print("not find json file")
return ""
json_path, json_name = os.path.split(json_path_tmp)
current_cwd = os.getcwd()
os.chdir(board_path)
cmd2 = 'grep -ri \'"DISTRO_VERSION":\' %s'%json_name
ap = os.popen(cmd2).read().strip()
if not ap.strip():
os.chdir(current_cwd)
print("****not find DISTRO_VERSION****")
return ""
ap = ap.split('"')[3]
print("ap:" + ap)
os.chdir(current_cwd)
return ap
def get_cp0(self):
print("====get_cp0====")
cp0_version_options = self.cp0_version.split('\n')
print(cp0_version_options)
modem_value = ''
for modem_key in cp0_version_options:
value = self.get_modem_bin(modem_key)
modem_value = value.strip().strip('1@')
if not modem_value:
continue
break
if not modem_value:
print('*****modem_value is null*****')
return ''
img = modem_value.strip('./')
cmd = 'strings %s | grep "HW Version:" | awk \'{print $NF}\'' %(img)
hw_version = os.popen(cmd).read().strip()
cmd2 = 'strings %s | grep "BASE Version:" | awk \'{print $NF}\'' % (img)
base_version = os.popen(cmd2).read().strip()
cmd3 = 'strings %s | grep -Po "\d{2}-\d{2}-\d{4} \d{1,2}:\d{1,2}:\d{1,2}"' % (img)
kernel_time = os.popen(cmd3).read().strip()
cp0_version = '|'.join([base_version, hw_version, kernel_time])
print("CP0_Version:"+cp0_version)
return cp0_version
def get_cp2(self):
print('=====get_cp2=====')
# 优先从cp_version.txt中获取
if self.cp_version_dict.get("WCN"):
cp2_version = self.cp_version_dict.pop("WCN")
print("version_txt: cp_version.txt \ncp2_version:{}".format(cp2_version))
return cp2_version.strip()
cp2_version_options = self.cp2_version.split('\n')
print(cp2_version_options)
modem_value = ''
for modem_key in cp2_version_options:
value = self.get_modem_bin(modem_key)
modem_value = value.strip()
modem_value = modem_value.strip('1@')
if not modem_value:
continue
break
if not modem_value:
print('*****modem_value is null*****')
return ''
img = modem_value.strip('./')
tmp_path = os.path.dirname(img)
for i in range(10):
if not tmp_path:
print("*****not found cp2 version txt*****")
return ""
version_path = os.path.join(tmp_path, 'version.txt')
print("[CHECK]version path:" + version_path)
if os.path.isfile(version_path):
with open(version_path,'r') as f:
cp2_version = f.read()
print("version_txt: {} \ncp2_version:{}".format(version_path, cp2_version))
return cp2_version.strip()
tmp_path = os.path.dirname(tmp_path)
def get_firmware(self):
print("======get_firmware======")
versioninfo_path = "vendor/sprd/modules/gpsfirmware/versioninfo.txt"
if not os.path.exists(versioninfo_path):
print("*****not found gpsfirmware*****")
return ''
cmd = "grep 'GE2:' %s" % versioninfo_path
firmware = os.popen(cmd).read().strip()
if not firmware:
print("*****firmware is null*****")
return ''
firmware = firmware.split('@')[-1]
print(firmware)
return firmware
def get_gnss_version(self):
print("======get_gnss_version======")
# 优先从cp_version.txt中获取
if self.cp_version_dict.get("GNSS"):
gnss_version = self.cp_version_dict.pop("GNSS")
print("version_txt: cp_version.txt \ngnss_version:{}".format(gnss_version))
return gnss_version.strip()
gnss_version_options = self.gnss_version.split('\n')
print(gnss_version_options)
modem_value = ''
for modem_key in gnss_version_options:
value = self.get_modem_bin(modem_key)
modem_value = value.strip()
modem_value = modem_value.strip('1@')
if not modem_value:
continue
break
if not modem_value:
print('*****modem_value is null*****')
return ''
img = modem_value.strip('./')
tmp_path = os.path.dirname(img)
for i in range(10):
if not tmp_path:
print("*****not found gnss version txt*****")
return ""
version_path = os.path.join(tmp_path, 'version.txt')
print("[CHECK]version path:" + version_path)
if os.path.isfile(version_path):
with open(version_path,'r') as f:
gnss_version = f.read()
print("version_txt: {} \ngnss_version:{}".format(version_path, gnss_version))
return gnss_version.strip()
tmp_path = os.path.dirname(tmp_path)
def get_cm4_version(self):
print("======get_cm4_version======")
cm4_version_options = self.cm4_version.split('\n')
print(cm4_version_options)
modem_value = ''
for modem_key in cm4_version_options:
value = self.get_modem_bin(modem_key)
modem_value = value.strip()
modem_value = modem_value.strip('1@')
if not modem_value:
continue
break
if not modem_value:
print('*****modem_value is null*****')
return ''
img = modem_value.strip('./')
tmp_path = os.path.dirname(img)
for i in range(10):
if not tmp_path:
print("*****not found cm4 version txt*****")
return ""
version_path = os.path.join(tmp_path, 'version.txt')
print("[CHECK]version path:" + version_path)
if os.path.isfile(version_path):
with open(version_path,'r') as f:
cm4_version = f.read()
print("version_txt: {} \ncm4_version:{}".format(version_path, cm4_version))
return cm4_version.strip()
tmp_path = os.path.dirname(tmp_path)
def get_audio_version(self):
print("======get_audio_version======")
audio_version_options = self.audio_version.split('\n')
print(audio_version_options)
modem_value = ''
for modem_key in audio_version_options:
value = self.get_modem_bin(modem_key)
modem_value = value.strip()
modem_value = modem_value.strip('1@')
if not modem_value:
continue
break
if not modem_value:
print('*****modem_value is null*****')
return ''
img = modem_value.strip('./')
tmp_path = os.path.dirname(img)
for i in range(10):
if not tmp_path:
print("*****not found audio dsp version txt*****")
return ""
version_path = os.path.join(tmp_path, 'version.txt')
print("[CHECK]version path:" + version_path)
if os.path.isfile(version_path):
with open(version_path,'r') as f:
audio_version = f.read()
print("version_txt: {} \naudio_dsp_version:{}".format(version_path, audio_version))
if self.get_cp0().split("|")[0] == audio_version.strip() :
return ''
else:
return audio_version.strip()
tmp_path = os.path.dirname(tmp_path)
def get_product(self):
print("=====get_product=======")
board_path = self.product.split('cp_sign')[0]
odm_prop_path = os.path.join(board_path, "odm", "etc", "build.prop")
cmd = "grep ro.product.odm.name %s 2>/dev/null"%odm_prop_path
product = os.popen(cmd).read().strip().split('=')[-1]
if not product:
product = self.pac_name.split('-')[0]
print("product:"+product)
return product
def get_gms_version(self):
print("=====get_gms_version=====")
check_gms = self.pac_name.split('-')[-1].split('_')[0]
print("check_gms:"+check_gms)
if check_gms != "gms":
print("*****Is not gms product*****")
return ''
gms_version_txt = os.path.join(self.target_board_path, 'gms_version.txt')
if os.path.exists(gms_version_txt):
print('Load gms version from prebuilt file: ' + gms_version_txt)
with open(gms_version_txt, 'r') as gf:
gms_version = gf.readline().strip()
if gms_version:
print('Prebuilt gms version: ' + gms_version)
else:
print('Bad prebuilt gms version: ' + gms_version)
return gms_version
current_cwd = os.getcwd()
path = os.path.join(current_cwd, "vendor")
os.chdir(path)
cmd = "find -name \"gms.mk\" | xargs grep -ri \"ro.com.google.gmsversion\" \; 2>/dev/null | awk -F '=' '{print$NF}'"
gms_version = os.popen(cmd).read().strip()
if re.search("GMS_PACKAGE_VERSION_ID",gms_version):
os.chdir(path)
cmd_m = "find -name \"gms_package_version.mk\" | xargs grep -ri \"GMS_PACKAGE_VERSION_ID\" \; 2>/dev/null | awk -F ':=' '{print$NF}'"
gms_version = os.popen(cmd_m).read().strip()
print("gms_version:"+gms_version)
os.chdir(current_cwd)
return gms_version
def get_google_patch_version(self):
current_cwd = os.getcwd()
fileVer=current_cwd+"/build/core/version_defaults.mk"
if not os.path.exists(fileVer):
print('the file isnt exist:',fileVer)
return ''
with open(fileVer,'r') as fv:
for line in fv.readlines():
#line = re.sub('^\s+|\s+$','',line)
m=re.search('PLATFORM_SECURITY_PATCH\s*:=\s*(.*)',line,re.I)
if m:
return m.group(1)
print('dont get google gms version')
return ''
def get_mainline_version(self):
current_cwd = os.getcwd()
mainline_file_path = os.path.join(current_cwd, "vendor/partner_modules/INFO")
if not os.path.exists(mainline_file_path):
print("mainline_file not exists, file path: {}".format(mainline_file_path))
return ""
with open(mainline_file_path, 'r') as f:
for line in f.readlines():
if line.startswith("mainline_version:"):
value = line.replace("mainline_version:", "").strip()
return value
print("not found mainline version.")
return ""
def _load_cp_version(self, path):
print("=============== start load cp_version.txt =============== ")
with open(path, 'r') as f:
for line in f.readlines():
line = line.strip()
config_pair = line.split("=", 1)
if len(config_pair) == 2:
key, value = config_pair
if key and value:
self.cp_version_dict[key] = value
else:
print("cp_version.txt invalid line: {}".format(line))
else:
print("cp_version.txt invalid line: {}".format(line))
def out_version(self, target_board_path):
print("=============== make BT_VERSION start =======================")
version_path = os.path.join(self.product, VERSION_TXT)
if os.path.exists(version_path):
os.remove(version_path)
# 加载cp_version.txt
cp_version_path = os.path.join(target_board_path, "cp_version.txt")
if os.path.isfile(cp_version_path):
self._load_cp_version(cp_version_path)
with open(version_path, 'w') as out_f:
out_f.write("["+self.get_pac_name()+"]")
out_f.write("\n")
out_f.write("PAC_Time="+self.get_pac_time())
out_f.write("\n")
out_f.write("AP="+self.get_ap())
out_f.write("\n")
# 解耦分支获取vnd分支编译时间戳
ap_vnd = self.get_ap_vnd()
if ap_vnd:
out_f.write("AP_VND="+ap_vnd)
out_f.write("\n")
out_f.write("CP0="+self.get_cp0())
out_f.write("\n")
out_f.write("CP2="+self.get_cp2())
out_f.write("\n")
out_f.write("CM4="+self.get_cm4_version())
out_f.write("\n")
out_f.write("AUDIO_DSP="+self.get_audio_version())
out_f.write("\n")
out_f.write("firmware="+self.get_firmware())
out_f.write("\n")
out_f.write("gnss_version="+self.get_gnss_version())
out_f.write("\n")
out_f.write("Product="+self.get_product())
out_f.write("\n")
out_f.write("gms_version="+self.get_gms_version())
out_f.write("\n")
out_f.write("Google_security_patch="+self.get_google_patch_version())
out_f.write("\n")
out_f.write("mainline_version="+self.get_mainline_version())
# 将cp_version.txt其他字段写入
if self.cp_version_dict:
for ik, iv in self.cp_version_dict.items():
out_f.write("{}={}\n".format(ik, iv))
print("=============== make BT_VERSION end =======================")
def parse_common_ini(self):
conf = BMConfigParser()
common_ini = os.path.join(SCRIPT_PATH, CONFIG_FILE)
if not os.path.exists(common_ini):
print("*****not find common.ini*****")
return ""
conf.read(common_ini)
cp0_version = conf.get("cp0_version", "partition")
cp2_version = conf.get("cp2_version", "partition")
gnss_version = conf.get("gnss_version", "partition")
cm4_version = conf.get("cm4_version", "partition")
audio_version = conf.get("audio_version", "partition")
param = [cp0_version,cp2_version,gnss_version,cm4_version,audio_version]
return param
def get_modem_bin(self, modem_key):
conf = BMConfigParser()
conf.read(os.path.join(self.product, "pac.ini.bak"))
modem_keys = conf.options("pac_list")
if modem_key not in modem_keys:
return ""
modem_bin = conf.get("pac_list", modem_key)
return modem_bin.strip()
def find_cp2_txt(self, dir):
if not os.path.exists(dir):
print("find_cp2_txt--not find "+str(dir))
return
for file in os.listdir(dir):
file_tmp = os.path.join(dir, file)
if os.path.isfile(file_tmp):
if file == "version.txt":
self.cp2_version_txt = file_tmp
break
else:
if file == ".git":
continue
self.find_cp2_txt(file_tmp)
def find_gnss_txt(self, dir):
if not os.path.exists(dir):
print("find_gnss_txt--not find "+str(dir))
return
for file in os.listdir(dir):
file_tmp = os.path.join(dir, file)
if os.path.isfile(file_tmp):
if file == "version.txt":
self.gnss_version_txt = file_tmp
break
else:
if file == ".git":
continue
self.find_gnss_txt(file_tmp)
class BMConfigParser(ConfigParser):
def __init__(self, defaults=None):
ConfigParser.__init__(self, defaults=defaults)
def optionxform(self, option_str):
return option_str