# -*- coding: utf-8 -*- """ 解析当前目录下的 config.ini 文件 A)拷贝ini文件中[symbols]里vmlinux、vendor、system 等对应的路径下的文件到out/symbols/(symbols.vmlinux、symbols.vendor、symbols.system B)ini路径中带'>'表示重命 调用方法 python sysbols.py """ import sys try: # python2 reload(sys) sys.setdefaultencoding('utf-8') except: # python3 import importlib importlib.reload(sys) import os import shutil # import ConfigParser try: # Python3 from configparser import ConfigParser except ImportError: # Python2 from ConfigParser import ConfigParser CONFIG_FILE = "config.ini" PAC_CONFIG_BRANCH = "pac_config" SYMBOLS = "symbols" target_board_file_bsp_r = "" NOT_FIND_LIST = [] FIND_LIST = [] CARRIER_LIST = [] SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) list_name = [] def listdirFun(path, list_name, count): # 传入存储的list if count != 0: for file in os.listdir(path): file_path = os.path.join(path, file) if os.path.isdir(file_path): if count - 1 == 0: list_name.append((file_path, os.path.getctime(file_path))) listdirFun(file_path, list_name, count - 1) elif os.path.exists(file_path): list_name.append((file_path, os.path.getctime(file_path))) def newestfile(target_list): newest_file = target_list[0] for i in range(len(target_list)): if i < (len(target_list) - 1) and newest_file[1] < target_list[i + 1][1]: newest_file = target_list[i + 1] else: continue print('newest file is', newest_file) return newest_file class Symbols(object): def __init__(self, target_board_path, symbols_folder): self.target_board_path = target_board_path self.symbols_folder = symbols_folder def copy_symbols(self): symbols_folder = self.symbols_folder target_board_path = self.target_board_path parameters = self.configParser() # ['vmlinux', 'vendor', 'system', 'ramdisk'] for key in parameters.keys(): value = parameters.get(key).strip().replace("\n", ",").split(',') self.copy_options(key, value, target_board_path, symbols_folder) common_parameters = self.common_configParser() for com_key in common_parameters.keys(): com_value = common_parameters.get(com_key).strip().replace("\n", ",").split(',') if len(com_value) > 0: self.copy_options(com_key, com_value, target_board_path, symbols_folder) ################归类log#################### for key in parameters.keys(): smbols_flag_key = SYMBOLS + "." + key print("[%s]" % smbols_flag_key) smbols_flag_list = [] for item1 in FIND_LIST: if "@@" in item1: symbols_key = item1.split('@@')[0].strip() symbols_value = item1.split('@@')[1].strip() if symbols_key == smbols_flag_key: print("find %s" % str(symbols_value)) for item2 in NOT_FIND_LIST: if "@@" in item2: symbols_key = item2.split('@@')[0].strip() symbols_value = item2.split('@@')[1].strip() if symbols_key == smbols_flag_key: print("not find %s" % str(symbols_value)) def copy_options(self, key, value, target_board_path, symbols_folder): for item in value: self.copy_parame(item, SYMBOLS + "." + key, target_board_path, symbols_folder) def copy_parame(self, symbols_file, new_folder_name, target_board_path, symbols_folder): global target_board_file_bsp_r global list_name symbols_file_tmp = symbols_file # ('symbols.vmlinux', ': ', './out/target/product/$BOARD/symbols/apex/ > apex') print(new_folder_name, ": ", symbols_file_tmp) if '>' in symbols_file: symbols_file = symbols_file_tmp.split('>')[0].strip() # symbols_file:./out/target/product/$BOARD/symbols/apex/ symbols_file_path, symbols_old_name = os.path.split(symbols_file) symbols_new_name = symbols_file_tmp.split('>')[1].strip() else: symbols_file_path, symbols_old_name = os.path.split(symbols_file) symbols_new_name = symbols_old_name board = target_board_path.split('/')[-1] print("board:" + board) # board:sp7731e_1h10 symbols_path = symbols_file.replace('$BOARD', board) symbols_path = symbols_path.replace('${BOARD}', board) cmd_sdk = 'grep "ro.build.version.sdk=" %s/system/build.prop | awk -F "=" \'{print $NF}\'' % target_board_path print(cmd_sdk) # grep "ro.build.version.sdk=" out/target/product/sp7731e_1h10/system/build.prop | awk -F "=" '{print $NF}' output = os.popen(cmd_sdk) platform_version = output.read().strip().replace("\n", ",").split(',')[0] print("platform_version:" + platform_version) if platform_version.strip() and int(platform_version) > 29: if 'PRODUCT' in symbols_path and 'bsp/out/' in symbols_path: # ('symbols.vmlinux', ': ', './bsp/out/androidr/$PRODUCT/dist/kernel/vmlinux') print("get bsp/out/product path") bsp_path = symbols_path.split('PRODUCT')[0] bsp_path = '/'.join(bsp_path.split('/')[1:-1]) # 去掉前后的‘/’ print("bsp_path:" + bsp_path) # bsp/out/androidr # cmd_bsp_r = '[ -d bsp/out/androidr ] && ls bsp/out/androidr | head -1' # cmd_bsp_r = '[ -d %s ] && ls %s | head -1'%(bsp_path,bsp_path) # output_bsp_r = os.popen(cmd_bsp_r) # target_board_file_bsp_r = output_bsp_r.read().strip().replace("\n",",").split(',') if not os.path.exists(os.getcwd() + '/' + bsp_path): print("not exist bsp_path: %s" % bsp_path) NOT_FIND_LIST.append(new_folder_name + "@@" + symbols_file) return if target_board_file_bsp_r == "": listdirFun(os.getcwd() + '/' + bsp_path, list_name, 3) # print("=========================%s"%list) new_file = newestfile(list_name) print('new_file :%s' % new_file[0]) target_board_file_bsp_r = new_file[0].split(bsp_path)[1].split('/')[1] print("target_board_file_bsp_r: %s" % target_board_file_bsp_r) else: print("target_board_file_bsp_r: %s" % target_board_file_bsp_r) symbols_path = symbols_path.replace('$PRODUCT', target_board_file_bsp_r) symbols_path = symbols_path.replace('${PRODUCT}', target_board_file_bsp_r) symbols_new_name = symbols_new_name.replace('${PRODUCT}', target_board_file_bsp_r) symbols_new_name = symbols_new_name.replace('$PRODUCT', target_board_file_bsp_r) symbols_old_name = symbols_old_name.replace('${PRODUCT}', target_board_file_bsp_r) symbols_old_name = symbols_old_name.replace('$PRODUCT', target_board_file_bsp_r) print("symbols_path:" + symbols_path) if '.' in symbols_path: symbols_path = symbols_path.split('./')[-1] symbols_full_file = symbols_path if os.path.exists(symbols_full_file): FIND_LIST.append(new_folder_name + "@@" + symbols_file) dest_symbols_path = os.path.join(symbols_folder, new_folder_name) if not os.path.exists(dest_symbols_path): os.mkdir(dest_symbols_path) if os.path.isfile(symbols_full_file): shutil.copy(symbols_full_file, dest_symbols_path) old_file_name = os.path.join(dest_symbols_path, symbols_old_name) new_file_name = os.path.join(dest_symbols_path, symbols_new_name) os.rename(old_file_name, new_file_name) else: if '>' in symbols_file_tmp: dest_symbols_path = os.path.join(dest_symbols_path, symbols_new_name) if not os.path.exists(dest_symbols_path): os.makedirs(os.path.join(dest_symbols_path)) if os.path.exists(dest_symbols_path): shutil.rmtree(dest_symbols_path, True) shutil.copytree(symbols_full_file, dest_symbols_path, symlinks=True) else: NOT_FIND_LIST.append(new_folder_name + "@@" + symbols_file) def copy_symbols_for_ota(self): print("======copy_symbols_for_ota===========") native_folder = os.path.join(target_board_path, "native_backup") if os.path.exists(native_folder): for folder in os.listdir(native_folder): print("folder:" + folder) folder_path = os.path.join(native_folder, folder) if os.path.isdir(folder_path) and "symbols" in folder: self.copy_dir(folder, folder_path, self.symbols_folder) else: print("not find native_backup folder") cp_sign = os.path.join(target_board_path, "cp_sign") if not os.path.exists(cp_sign): print("not find %s" % str(cp_sign)) return ap_list = os.listdir(cp_sign) for product in ap_list: product_path = os.path.join(cp_sign, product) if os.path.isfile(product_path): continue pac_ini_path = os.path.join(product_path, "pac.ini") ota_flag = self.read_ota_flag(pac_ini_path) if ota_flag[0] == "true": carrier = ota_flag[1] if carrier.strip(): CARRIER_LIST.append(carrier) print(CARRIER_LIST) for symbols in os.listdir(self.symbols_folder): for carrier in CARRIER_LIST: carrier_path = os.path.join(target_board_path, carrier) for folder in os.listdir(carrier_path): folder_path = os.path.join(carrier_path, folder) if os.path.isdir(folder_path) and folder == symbols: carrier_folder = os.path.join(self.symbols_folder, symbols, carrier) print(carrier_folder) if os.path.exists(carrier_folder): shutil.rmtree(carrier_folder, True) shutil.copytree(folder_path, carrier_folder, symlinks=True) print("make ota carrier list:") print(CARRIER_LIST) def copy_dir(self, folder_name, dir, out): out_folder = os.path.join(out, folder_name) print("out_folder:" + out_folder) if os.path.exists(out_folder): shutil.rmtree(out_folder, True) shutil.copytree(dir, out_folder, symlinks=True) def configParser(self): # 解析ini数据 config = os.path.abspath(os.path.join(SCRIPT_PATH, "..", PAC_CONFIG_BRANCH, CONFIG_FILE)) print("config:" + config) if not os.path.exists(config): print("not find config.ini") sys.exit(1) conf = BMConfigParser() conf.read(config) options_list = conf.options(SYMBOLS) print(options_list) options_dict = {} for option in options_list: param = conf.get(SYMBOLS, option) options_dict[option] = param return options_dict def common_configParser(self): # symbol common setting config = BMConfigDir(SCRIPT_PATH) dir = config.get_dir() symbol_path = config.get_symbolcommonpath() code_path = SCRIPT_PATH.split(dir)[0] symbol_common = os.path.join(code_path,symbol_path) print("symbol_common is %s"%symbol_common) common_opt_dict = {} # common symbol ini for symbol copy setting if os.path.isfile(symbol_common): common_conf = BMConfigParser() common_conf.read(symbol_common) options_commonlist = common_conf.options(SYMBOLS) print(options_commonlist) for opt_com in options_commonlist: com_param = common_conf.get(SYMBOLS, opt_com) common_opt_dict[opt_com] = com_param print("common is %s" % common_opt_dict) return common_opt_dict def read_ota_flag(self, pac_ini_path): print("pac_ini_path:" + str(pac_ini_path)) if not os.path.exists(pac_ini_path): print("not find: %s" % pac_ini_path) return ['', ''] conf = BMConfigParser() conf.read(pac_ini_path) options_list = conf.options("Attr") if "ota_flag" not in options_list: print("pac.ini not configured sparse") return ['', ''] ota_flag = conf.get("Attr", "ota_flag") carrier_flag = conf.get("Attr", "carrier") return [ota_flag, carrier_flag] class BMConfigParser(ConfigParser): def __init__(self, defaults=None): ConfigParser.__init__(self, defaults=defaults) def optionxform(self, option_str): return option_str class BMConfigDir(object): def __init__(self, sctipt_path): self.sctipt_path = sctipt_path def get_dir(self): config = os.path.abspath(os.path.join(self.sctipt_path, "..", PAC_CONFIG_BRANCH, CONFIG_FILE)) if not os.path.exists(config): print("not find config.ini") sys.exit(1) conf = BMConfigParser() conf.read(config) dir = conf.get("work_dir", "dir") return dir def get_symbolcommonpath(self): symbol_path = "" config = os.path.abspath(os.path.join(self.sctipt_path, "..", PAC_CONFIG_BRANCH, CONFIG_FILE)) if not os.path.exists(config): print("not find config.ini") sys.exit(1) conf = BMConfigParser() conf.read(config) if conf.has_option("work_dir", "symbols_common"): symbol_path = conf.get("work_dir", "symbols_common") return symbol_path if __name__ == "__main__": print("=============== copy symbols start =======================") config = BMConfigDir(SCRIPT_PATH) dir = config.get_dir() print("dir:" + dir) code_path = SCRIPT_PATH.split(dir)[0] os.chdir(code_path) print("pwd:" + os.getcwd()) board_path = 'out/target/product' BOARD_PATHS = os.environ.get("OUT") if BOARD_PATHS: BOARD_target = BOARD_PATHS.split("/")[-1] board_path = board_path + "/" + BOARD_target cmd = 'find {} -maxdepth 1 -name "*.xml"'.format(board_path) else: cmd = 'find {} -maxdepth 2 -name "*.xml"'.format(board_path) output = os.popen(cmd) target_board_file = output.read().strip().replace("\n", ",").split(',') target_board_path, target_board = os.path.split(target_board_file[0]) if not target_board_path: target_board_path = board_path print("[TARGET_BOARD]:" + str(target_board_path)) # [TARGET_BOARD]:out/target/product/sp7731e_1h10 if os.path.exists(os.path.join(target_board_path, "repac")): print("repac,no need create archive_symbols") else: symbols_folder = os.path.join(target_board_path, "archive_symbols") if os.path.exists(symbols_folder): shutil.rmtree(symbols_folder, True) os.mkdir(symbols_folder) symbols = Symbols(target_board_path, symbols_folder) if os.path.exists(os.path.join(target_board_path, "make_ota_flag")): symbols.copy_symbols_for_ota() else: symbols.copy_symbols() print("=============== copy symbols end =======================")