diff --git a/tools/rom_ram_analyzer/L0L1/README.md b/tools/rom_ram_analyzer/lite_small/README.md similarity index 48% rename from tools/rom_ram_analyzer/L0L1/README.md rename to tools/rom_ram_analyzer/lite_small/README.md index ce3da518c03fff74dbf2ebb477895a662fa3cf6d..790e5db6ba00b78318fa21f47789f09b42a49b4b 100644 --- a/tools/rom_ram_analyzer/L0L1/README.md +++ b/tools/rom_ram_analyzer/lite_small/README.md @@ -6,16 +6,26 @@ ## 支持产品 -目标是支持所有的产品,但是目前由于配置文件没设计好,只支持:ipcamera_hispark_taurus ipcamera_hispark_taurus_linux wifiiot_hispark_pegasus +支持产品:ipcamera_hispark_taurus ipcamera_hispark_taurus_linux wifiiot_hispark_pegasus ## 代码思路 1. 扫描BUILD.gn文件,收集各个target的编译产物及其对应的component_name, subsystem_name信息,并存储到config.yaml中的gn_info_file字段指定的json文件中 2. 根据配置文件config.yaml扫描产品的编译产物目录,得到真实的编译产物信息(主要是大小) 3. 用真实的编译产物与从BUILD.gn中收集的信息进行匹配,从而得到编译产物-大小-所属部件的对应信息 -4. 如果匹配失败,会直接利用grep到项目路径下进行搜索 +4. 如果匹配失败,会直接利用grep到项目路径下进行模糊搜索,取出现次数top1的BUILD.gn,并根据该BUILD.gn文件去查找子系统和部件 5. 如果还搜索失败,则将其归属到others +## 说明 + +1. 关于UNDEFINED:如果target的声明中和get_subsystem_component.py(原作者:陈毓德)脚本的运行结果中都没有查找到子系统和部件信息,则为UNDEFINED +1. 关于NOTFOUND:表示对应的编译产物没有在BUILD.gn的扫描结果中匹配(包括模糊匹配)到 +1. 本工具是基于gn的template进行匹配,如果新增了自定义的template,则需要相应在代码中进行配置 +1. 由于本工具是进行的静态扫描,且部分gn文件中使用了较为复杂的gn语法,因此本工具的**准确率无法达到100%,结果仅供参考** + +**建议** + +因为是静态扫描,因此过于复杂的gn语法会导致扫描BUILD.gn文件时无法确定其编译产物,典型的:在for循环中嵌套target声明.因此就本工具来说,不建议使用过于复杂的gn语法. ## 使用 @@ -24,14 +34,14 @@ 1. 获取整个本文件所在的整个目录 1. 对系统进行编译 1. linux平台 -1. python3.8及以后 +1. python3 1. 安装requirements ```txt xlwt==1.3.0 ``` -1. `python3 rom_analysis.py --product_name {your_product_name} --oh_path {root_path_of_oh} [--recollect_gn bool]`运行代码,其中recollect_gn表示是需要重新扫描BUILD.gn还是直接使用已有结果.eg: `python3 rom_analysis.py --product_name ipcamera_hispark_taurus` -3. 运行完毕会产生4个json文件及一个xls文件,如果是默认配置,各文件描述如下: +1. `python3 rom_analysis.py --product_name {your_product_name} --oh_path {root_path_of_oh} [-g] [-s]`运行代码,其中-g表示直接使用上次扫描的BUILD.gn的结果,-s表示直接使用已有的子系统和部件信息,默认都会重新扫描.eg: `python3 rom_analysis.py --product_name ipcamera_hispark_taurus`. +1. 运行完毕会产生4个json文件及一个xls文件,如果是默认配置,各文件描述如下: - gn_info.json:BUILD.gn的分析结果 - sub_com_info.json:从bundle.json中进行分析获得的各部件及其对应根目录的信息 - {product_name}_product.json:该产品实际的编译产物信息,根据config.yaml进行收集 @@ -42,6 +52,10 @@ 主要是在config.py中配置Processor,并在config.yaml中添加相应内容 +## 如何提高准确率 + +1. 如果已知编译产物不可能从某些目录下的BUILD.gn产生,则可以将其对应目录加入到config.yaml的black_list,从而不对该目录下的BUILD.gn进行扫描,以减少出错概率 + ## 后续工作 1. 部分log的输出有待优化 \ No newline at end of file diff --git a/tools/rom_ram_analyzer/L0L1/__init__.py b/tools/rom_ram_analyzer/lite_small/__init__.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/__init__.py rename to tools/rom_ram_analyzer/lite_small/__init__.py diff --git a/tools/rom_ram_analyzer/L0L1/pkgs/__init__.py b/tools/rom_ram_analyzer/lite_small/pkgs/__init__.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/pkgs/__init__.py rename to tools/rom_ram_analyzer/lite_small/pkgs/__init__.py diff --git a/tools/rom_ram_analyzer/L0L1/pkgs/basic_tool.py b/tools/rom_ram_analyzer/lite_small/pkgs/basic_tool.py similarity index 94% rename from tools/rom_ram_analyzer/L0L1/pkgs/basic_tool.py rename to tools/rom_ram_analyzer/lite_small/pkgs/basic_tool.py index febe48256c9ef3290b2313426958ea4e1b549093..b04afab5ba43bf6ab2f8468345d4011aa9d6a163 100644 --- a/tools/rom_ram_analyzer/L0L1/pkgs/basic_tool.py +++ b/tools/rom_ram_analyzer/lite_small/pkgs/basic_tool.py @@ -113,10 +113,11 @@ class BasicTool: TODO 将cls.execute用subprocess代替 """ cmd = f"grep -Ern '{pattern}' '{cls.abspath(path)}'" + # E:启用正则表达式 r:递归搜索 n:显示行号 if include: cmd += f" --include='{include}'" for e in exclude: - cmd += f" --exclude-dir={e}" + cmd += f" --exclude-dir='{e}'" o = cls.execute(cmd) if post_handler: o = post_handler(o) @@ -137,6 +138,8 @@ class BasicTool: if __name__ == '__main__': - for i in BasicTool.grep_ern("^( *)ohos_shared_library", "/home/aodongbiao/oh", include="BUILD.gn", exclude=("out", "doc", ".ccache"), post_handler=lambda x: x.split('\n')): + res = BasicTool.grep_ern("^( *)ohos_prebuilt_shared_library", "/home/aodongbiao/oh", include="BUILD.gn", exclude=("/home/aodongbiao/oh/out","doc", ".ccache"), post_handler=lambda x: x.split('\n')) + # print(res) + for i in res: if "oh/out" in i: print(i) diff --git a/tools/rom_ram_analyzer/L0L1/pkgs/gn_common_tool.py b/tools/rom_ram_analyzer/lite_small/pkgs/gn_common_tool.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/pkgs/gn_common_tool.py rename to tools/rom_ram_analyzer/lite_small/pkgs/gn_common_tool.py diff --git a/tools/rom_ram_analyzer/L0L1/pkgs/simple_excel_writer.py b/tools/rom_ram_analyzer/lite_small/pkgs/simple_excel_writer.py similarity index 86% rename from tools/rom_ram_analyzer/L0L1/pkgs/simple_excel_writer.py rename to tools/rom_ram_analyzer/lite_small/pkgs/simple_excel_writer.py index ebe37e17e588d307cb85f3f5627f90b1a94e1cca..94a9496fc81cb6bf2ca7de759f4d13eddb19c1a7 100644 --- a/tools/rom_ram_analyzer/L0L1/pkgs/simple_excel_writer.py +++ b/tools/rom_ram_analyzer/lite_small/pkgs/simple_excel_writer.py @@ -1,5 +1,5 @@ import xlwt -from xlwt import Worksheet +from xlwt import Worksheet, Pattern as PTRN, Alignment as ALGT, Font as FT, XFStyle as XFSL import typing import logging from typing import Optional @@ -18,27 +18,26 @@ class SimpleExcelWriter: } self.__default_sheet_name = default_sheet_name # 表头样式 - self.__head_style = xlwt.XFStyle() + self.__head_style = XFSL() # 内容样式 - self.__content_style = xlwt.XFStyle() + self.__content_style = XFSL() # 字体 - font = xlwt.Font() - font.bold = True + ft = FT() + ft.bold = True # 设置背景颜色 - pattern = xlwt.Pattern() - pattern.pattern = xlwt.Pattern.SOLID_PATTERN - pattern.pattern_fore_colour = 22 # 背景颜色 + ptrn = PTRN() + ptrn.pattern = PTRN.SOLID_PATTERN + ptrn.pattern_fore_colour = 22 # 背景颜色 # 居中对齐 - alignment = xlwt.Alignment() - alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向 - alignment.vert = xlwt.Alignment.VERT_CENTER # 垂直方向 - - self.__head_style.font = font - self.__head_style.alignment = alignment - self.__head_style.pattern = pattern - self.__content_style.alignment = alignment + algmt = ALGT() + algmt.horz = ALGT.HORZ_CENTER # 水平方向 + algmt.vert = ALGT.VERT_CENTER # 垂直方向 + self.__head_style.font = ft + self.__head_style.alignment = algmt + self.__head_style.pattern = ptrn + self.__content_style.alignment = algmt def __increment_y(self, sheet_name: str, value: int = 1) -> int: if sheet_name in self.__sheet_pos.keys(): diff --git a/tools/rom_ram_analyzer/L0L1/pkgs/simple_yaml_tool.py b/tools/rom_ram_analyzer/lite_small/pkgs/simple_yaml_tool.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/pkgs/simple_yaml_tool.py rename to tools/rom_ram_analyzer/lite_small/pkgs/simple_yaml_tool.py diff --git a/tools/rom_ram_analyzer/L0L1/src/__init__.py b/tools/rom_ram_analyzer/lite_small/src/__init__.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/src/__init__.py rename to tools/rom_ram_analyzer/lite_small/src/__init__.py diff --git a/tools/rom_ram_analyzer/L0L1/src/config.py b/tools/rom_ram_analyzer/lite_small/src/config.py similarity index 92% rename from tools/rom_ram_analyzer/L0L1/src/config.py rename to tools/rom_ram_analyzer/lite_small/src/config.py index 05f1a2623be8fa43fdaa95a8158e739717e8e1f8..aa9b1edb0d4d3f9d916f715feccae5fce6d62672 100644 --- a/tools/rom_ram_analyzer/L0L1/src/config.py +++ b/tools/rom_ram_analyzer/lite_small/src/config.py @@ -22,8 +22,10 @@ def parse_args(): help="product name. eg: -p ipcamera_hispark_taurus") parser.add_argument("-o", "--oh_path", type=str, default=".", help="root path of openharmony") - parser.add_argument("-g", "--recollect_gn", action="store_false", help="recollect gn info or not") - parser.add_argument("-s", "--recollect_sc", action="store_false", help="recollect subsystem_component info or not") + parser.add_argument("-g", "--recollect_gn", + action="store_false", help="recollect gn info or not") + parser.add_argument("-s", "--recollect_sc", action="store_false", + help="recollect subsystem_component info or not") args = parser.parse_args() return args @@ -202,6 +204,17 @@ collector_config: Tuple[BaseProcessor] = ( }, unit_post_handler=LiteComponentPostHandler(), ), + DefaultProcessor(project_path=project_path, + result_dict=result_dict, + target_type=_target_type[13], + match_pattern=fr"^( *){_target_type[13]}\(.*?\, .*?\)", + sub_com_dict=sub_com_dict, + target_name_parser=TargetNameParser.second_parser, + other_info_handlers={ + }, + unit_post_handler=DefaultPostHandler(), + ud_post_handler=TargetS2MPostHandler + ) ) __all__ = ["configs", "result_dict", "collector_config", "sub_com_dict"] diff --git a/tools/rom_ram_analyzer/L0L1/src/config.yaml b/tools/rom_ram_analyzer/lite_small/src/config.yaml similarity index 86% rename from tools/rom_ram_analyzer/L0L1/src/config.yaml rename to tools/rom_ram_analyzer/lite_small/src/config.yaml index f6e0f3e653551836392bf289210574c7e2e1ce9c..254c4cda4531a094b676b67ddc71353d64a36190 100644 --- a/tools/rom_ram_analyzer/L0L1/src/config.yaml +++ b/tools/rom_ram_analyzer/lite_small/src/config.yaml @@ -27,6 +27,7 @@ target_type: - ohos_sa_profile - ohos_prebuilt_shared_library - lite_component + - target subsystem_component: @@ -51,6 +52,7 @@ ipcamera_hispark_taurus: - ohos_prebuilt_shared_library - lite_library - lite_component + - target bin: - executable @@ -75,6 +77,7 @@ ipcamera_hispark_taurus_linux: - ohos_prebuilt_shared_library - lite_library - lite_component + - target bin: - executable @@ -96,6 +99,7 @@ wifiiot_hispark_pegasus: - static_library - ohos_static_library - lite_library + - target rk3568: # rk的目前从packages/phone/system_module_info.json中分析准确度更高,因为rk基本都使用的是ohos_xxx,而L0和L1的更多的是使用的gn原生target template @@ -116,6 +120,7 @@ rk3568: # rk的目前从packages/phone/system_module_info.json中分析准确度 - ohos_prebuilt_shared_library - lite_library - lite_component + - target bin: - ohos_executable @@ -134,11 +139,18 @@ default_extension: default_prefix: shared_library: lib static_library: lib -# black list for command 'grep' -black_list: +# black list for command 'grep', it should be the subdirectory of the root path of oh +black_list: - .repo - .ccache - doc - test - build - - out + # 排除out目录,为了避免排除其他路径下的out目录,这里详细列出了out下的所有目录 + - out/gen + - out/hispark_pegasus + - out/hispark_taurus + - out/kernel + - out/preloader + - out/rk3568 + # 如果发现了跨形态的错误,如:检查A形态,但是发现将A形态的产品归属到B形态下了,则也可以将B形态的对应路径加在这里进行过滤 diff --git a/tools/rom_ram_analyzer/L0L1/src/get_subsystem_component.py b/tools/rom_ram_analyzer/lite_small/src/get_subsystem_component.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/src/get_subsystem_component.py rename to tools/rom_ram_analyzer/lite_small/src/get_subsystem_component.py diff --git a/tools/rom_ram_analyzer/L0L1/src/misc.py b/tools/rom_ram_analyzer/lite_small/src/misc.py similarity index 88% rename from tools/rom_ram_analyzer/L0L1/src/misc.py rename to tools/rom_ram_analyzer/lite_small/src/misc.py index d000507a5944a1712fe46caef25891ab68bfadd8..189a78f855ba33760082d51cbfaaf2a5c5025613 100644 --- a/tools/rom_ram_analyzer/L0L1/src/misc.py +++ b/tools/rom_ram_analyzer/lite_small/src/misc.py @@ -5,6 +5,7 @@ import logging from abc import ABC, abstractmethod from collections import defaultdict from typing import * +from pprint import pprint import preprocess from pkgs.gn_common_tool import GnVariableParser from pkgs.simple_yaml_tool import SimpleYamlTool @@ -44,14 +45,19 @@ def gn_lineno_collect(match_pattern: str, project_path: str) -> DefaultDict[str, :param project_path: 项目路径(搜索路径) :return: {gn_file: [line_no_1, line_no_2, ..]} """ - black_list = map(lambda x: os.path.join( - project_path, x), _config.get("black_list")) + black_list = _config.get("black_list") + tbl = [x for x in black_list if os.sep in x] def handler(content: Text) -> List[str]: - return list(filter(lambda y: len(y) > 0, list(map(lambda x: x.strip(), content.split("\n"))))) - - grep_list = BasicTool.grep_ern(match_pattern, path=project_path, include="BUILD.gn", exclude=tuple(black_list), - post_handler=handler) + t = list(filter(lambda y: len(y) > 0, list( + map(lambda x: x.strip(), content.split("\n"))))) + for item in tbl: + p = os.path.join(project_path, item) + t = list(filter(lambda x: p not in x, t)) + return t + + grep_list = BasicTool.grep_ern(match_pattern, path=project_path, + include="BUILD.gn", exclude=tuple(black_list), post_handler=handler) gn_line_dict: DefaultDict[str, List[int]] = defaultdict(list) for gl in grep_list: gn_file, line_no, _ = gl.split(":") @@ -226,3 +232,16 @@ def LiteLibS2MPostHandler(unit: Dict, result_dict: Dict) -> None: k = LiteLibPostHandler()(new_new_unit) new_new_unit["description"] = "may not exist" result_dict["lite_library"][k] = new_new_unit + + +def TargetS2MPostHandler(unit: Dict, result_dict: Dict) -> None: + unit["description"] = "may not exist" + tmp_a = copy.deepcopy(unit) + tmp_a["real_target_type"] = "static_library" + k = LiteLibPostHandler()(tmp_a) + result_dict["target"][k] = tmp_a + + tmp_s = copy.deepcopy(unit) + tmp_s["real_target_type"] = "shared_library" + k = LiteLibPostHandler()(tmp_s) + result_dict["target"][k] = tmp_s diff --git a/tools/rom_ram_analyzer/L0L1/src/preprocess.py b/tools/rom_ram_analyzer/lite_small/src/preprocess.py similarity index 100% rename from tools/rom_ram_analyzer/L0L1/src/preprocess.py rename to tools/rom_ram_analyzer/lite_small/src/preprocess.py diff --git a/tools/rom_ram_analyzer/L0L1/src/rom_analysis.py b/tools/rom_ram_analyzer/lite_small/src/rom_analysis.py similarity index 80% rename from tools/rom_ram_analyzer/L0L1/src/rom_analysis.py rename to tools/rom_ram_analyzer/lite_small/src/rom_analysis.py index ba1c6e192a94470e0eaf648d0325afbd6994ce7d..26824e9f730b10d288aa69acdd0e17d6d79f837a 100644 --- a/tools/rom_ram_analyzer/L0L1/src/rom_analysis.py +++ b/tools/rom_ram_analyzer/lite_small/src/rom_analysis.py @@ -47,31 +47,40 @@ class RomAnalysisTool: @classmethod def _add_rest_dir(cls, top_dir: str, rela_path: str, sub_path: str, dir_list: List[str]) -> None: """ - dir_list:相对于原始top目录的所有子目录的全路径 + :top_dir 顶层目录,不会变化 + :rela_path 最顶层的值为空 + :sub_path 一般是a/b/c这种形式 + :dir_list 相对于原始top目录的子目录的全路径 + example: + / + |-a + |-b + |-c + |-|-d + |-|-e + |-|-f + |-|-|-g + |-|-|-h + top_dir: / + rela_path: "" + sub_path: c/e + dir_list: [c] + => [c/d, c/f], assume 'a' and 'b' has been removed from dir_list """ - if not sub_path: + if (not sub_path) or (os.sep not in sub_path): return # 将其他目录添加到dir_list - all_subdir = os.listdir(os.path.join(top_dir, rela_path)) - for d in all_subdir: - t = os.path.join(rela_path, d) - if os.path.isdir(os.path.join(top_dir, t)) and t not in dir_list: - dir_list.append(t) - # 移除sub_path的当前层级的目录 - t = sub_path.split(os.sep) - if os.path.join(rela_path, t[0]) in dir_list: - dir_list.remove(os.path.join(rela_path, t[0])) - else: - logging.error( - f"'{os.path.join(rela_path,t[0])}' not in '{top_dir}'") - sp = str() - if len(t) == 1: + t, sub_sub_path = sub_path.split(os.sep, 1) # 如果是c/e,分割成c,e + t = os.path.join(rela_path, t) + if t in dir_list: + dir_list.remove(t) + sub_sub_dir_list = os.listdir(os.path.join(top_dir, t)) + for ssdl in sub_sub_dir_list: + if os.path.join(rela_path,sub_path) != os.path.join(t,ssdl): + dir_list.append(os.path.join(t, ssdl)) + if not sub_sub_dir_list: return - elif len(t) == 2: - sp = t[1] - else: - sp = os.path.join(*t[1:]) - cls._add_rest_dir(top_dir, os.path.join(rela_path, t[0]), sp, dir_list) + cls._add_rest_dir(top_dir, t, sub_sub_path, dir_list) @classmethod def _find_files(cls, product_name: str) -> Dict[str, List[str]]: @@ -86,7 +95,7 @@ class RomAnalysisTool: relative_dir: Dict[str, str] = product_dir.get("relative") if not relative_dir: logging.warning( - f"'{relative_dir}' of {product_name} not found in the config.yaml") + f"'relative_dir' of {product_name} not found in the config.yaml") exit(1) # 除了so a hap bin外的全部归到etc里面 for k, v in relative_dir.items(): @@ -102,7 +111,11 @@ class RomAnalysisTool: rest_dir_list: List[str] = os.listdir( root_dir) # 除了配置在relative下之外的所有剩余目录,全部归到etc下 for v in relative_dir.values(): - cls._add_rest_dir(root_dir, str(), v, rest_dir_list) + if v in rest_dir_list: + rest_dir_list.remove(v) + for v in relative_dir.values(): + if os.sep in v: + cls._add_rest_dir(root_dir, str(), v, rest_dir_list) if "etc" not in product_dict.keys(): product_dict["etc"] = list() for r in rest_dir_list: @@ -141,7 +154,7 @@ class RomAnalysisTool: rom_size_dict["size"] += size @classmethod - def _fuzzy_match(cls, file_name: str, extra_black_list: Tuple[str] = ("test",)) -> Tuple[str, str, str]: + def _fuzzy_match(cls, file_name: str, filter_path_keyword: Tuple[str] = ("test",)) -> Tuple[str, str, str]: """ 直接grep,利用出现次数最多的BUILD.gn去定位subsystem_name和component_name""" _, base_name = os.path.split(file_name) @@ -153,15 +166,28 @@ class RomAnalysisTool: base_name = base_name[:base_name.index(".z.so")] elif base_name.endswith(".so"): base_name = base_name[:base_name.index(".so")] - exclude_dir = [os.path.join(project_path, x) - for x in configs["black_list"]] - exclude_dir.extend(list(extra_black_list)) + exclude_dir = configs["black_list"] + tbl = [x for x in exclude_dir if os.sep in x] + def handler(content: Text) -> List[str]: + t = list(filter(lambda y: len(y) > 0, list( + map(lambda x: x.strip(), content.split("\n"))))) + for item in tbl: + p = os.path.join(project_path, item) + t = list(filter(lambda x: p not in x, t)) + return t grep_result: List[str] = BasicTool.grep_ern( base_name, project_path, include="BUILD.gn", exclude=tuple(exclude_dir), - post_handler=lambda x: list(filter(lambda x: len(x) > 0, x.split('\n')))) + post_handler=handler) + tmp = list() + for gr in grep_result: + for item in filter_path_keyword: + if item in gr: + continue + tmp.append(gr) + grep_result = tmp if not grep_result: return str(), str(), str() gn_dict: Dict[str, int] = collections.defaultdict(int) @@ -229,9 +255,11 @@ class RomAnalysisTool: ] = configs[product_name]["query_order"] query_order["etc"] = configs["target_type"] rom_size_dict: Dict = dict() - # prodcut_dict: {"a":["a.txt", ...]} + # prodcut_dict: {"so":["a.so", ...]} for t, l in product_dict.items(): for f in l: # 遍历所有文件 + if os.path.isdir(f): + continue # query_order: {"a":[static_library", ...]} find_flag = False type_list = query_order.get(t) @@ -240,9 +268,10 @@ class RomAnalysisTool: if not type_list: logging.warning( f"'{t}' not found in query_order of the config.yaml") - continue + break for tn in type_list: # tn example: ohos_shared_library - output_dict: Dict[str, Dict] = gn_info.get(tn) + output_dict: Dict[str, Dict] = gn_info.get( + tn) # 这个模板对应的所有可能编译产物 if not output_dict: logging.warning( f"'{tn}' not found in the {gn_info_file}") @@ -269,7 +298,7 @@ class RomAnalysisTool: }, rom_size_dict) find_flag = True if not find_flag: - cls._put("others", "others", { + cls._put("NOTFOUND", "NOTFOUND", { "file_name": f.replace(project_path, ""), "size": size, }, rom_size_dict) @@ -288,8 +317,7 @@ def main(): if __name__ == "__main__": main() - # t = os.listdir( - # "/home/aodongbiao/developtools_integration_verification/tools") - # RomAnalysisTool._add_rest_dir( - # "/home/aodongbiao/developtools_integration_verification/tools", "", "rom_ram_analyzer/L2/pkgs", t) - # print(t) + # relative_dir = ["bin", "usr/lib", "etc"] + # root_dir = "/home/aodongbiao/oh/out/hispark_taurus/ipcamera_hispark_taurus/rootfs" + # rest_dir_list = os.listdir(root_dir) + # RomAnalysisTool._find_files("ipcamera_hispark_taurus") diff --git a/tools/rom_ram_analyzer/L0L1/src/template_processor.py b/tools/rom_ram_analyzer/lite_small/src/template_processor.py similarity index 84% rename from tools/rom_ram_analyzer/L0L1/src/template_processor.py rename to tools/rom_ram_analyzer/lite_small/src/template_processor.py index e4124c83a08293124b60b8ec7751db089af5da80..8e3a9e4ce1ad28fb6f73656418adaaf786dab645 100644 --- a/tools/rom_ram_analyzer/L0L1/src/template_processor.py +++ b/tools/rom_ram_analyzer/lite_small/src/template_processor.py @@ -17,6 +17,7 @@ from typing import * from abc import ABC, abstractmethod import os import logging +from pprint import pprint from pkgs.basic_tool import do_nothing, BasicTool from pkgs.gn_common_tool import GnCommonTool, GnVariableParser @@ -91,12 +92,16 @@ class BaseProcessor(ABC): if not gn_path.startswith(self.project_path): logging.error("gn_path and project_path is not consistent: gn_path={}, project_path={}".format( gn_path, self.project_path)) - return "", "" - k = gn_path.replace(self.project_path, "").lstrip(os.sep) + return str(), str() + gp = gn_path.replace(self.project_path, "").lstrip(os.sep) + alter_list = list() for k, v in self.sc_dict.items(): - if k.startswith(k): - return v.get("subsystem"), v.get("component") - return "", "" + if gp.startswith(k): + alter_list.append(k) + if not alter_list: + return str(), str() + alter_list.sort(key=lambda x: len(x), reverse=True) + return self.sc_dict[alter_list[0]].get("subsystem"), self.sc_dict[alter_list[0]].get("component") @abstractmethod def run(self): @@ -107,6 +112,14 @@ class BaseProcessor(ABC): def _gn_var_process(project_path: str, gn_v: str, alt_v: str, gn_path: str, ifrom: str, efrom: str, strip_quote: bool = False) -> Tuple[str, str]: + """ + :param project_path:项目根路径 + :gn_v:gn中的值(可能为变量或空) + :alt_v: 如果gn_v为空,则直接使用alt_v代替 + :gn_path: gn文件的路径 + :ifrom: 如果gn_v不为空,则其来自哪个字段 + :efrom: 如果gn_v为空,则其(准确来说是alt_v)来自哪个字段 + """ if strip_quote: gn_v = gn_v.strip('"') if gn_v: @@ -123,6 +136,10 @@ def _gn_var_process(project_path: str, gn_v: str, alt_v: str, gn_path: str, ifro class DefaultProcessor(BaseProcessor): + + @property + def UNDEFINED(self): + return "UNDEFINED" def helper(self, target_name: str, paragraph: str, gn_path: str, line_no: int, _sub: str, _com: str) -> Tuple[str]: output_name = GnVariableParser.string_parser("output_name", paragraph) @@ -130,8 +147,14 @@ class DefaultProcessor(BaseProcessor): output_name, target_name, gn_path, "target_name", "target_name", True) sub = GnVariableParser.string_parser("subsystem_name", paragraph) com = GnVariableParser.string_parser("part_name", paragraph) - sub, sub_from = _gn_var_process(self.project_path, sub, _sub, gn_path, "gn", "json", True) - com, com_from = _gn_var_process(self.project_path, com, _com, gn_path, "gn", "json", True) + sub, sub_from = _gn_var_process( + self.project_path, sub, _sub, gn_path, "gn", "json", True) + com, com_from = _gn_var_process( + self.project_path, com, _com, gn_path, "gn", "json", True) + if not sub: + sub = self.UNDEFINED + if not com: + com = self.UNDEFINED result = { "gn_path": gn_path, "target_type": self.target_type, @@ -188,8 +211,14 @@ class StrResourceProcessor(DefaultProcessor): resources, gn_path, self.project_path).strip('"') sub = GnVariableParser.string_parser("subsystem_name", paragraph) com = GnVariableParser.string_parser("part_name", paragraph) - sub, sub_from = _gn_var_process(self.project_path, sub, _sub, gn_path, "gn", "json") - com, com_from = _gn_var_process(self.project_path, com, _com, gn_path, "gn", "json") + sub, sub_from = _gn_var_process( + self.project_path, sub, _sub, gn_path, "gn", "json") + com, com_from = _gn_var_process( + self.project_path, com, _com, gn_path, "gn", "json") + if not sub: + sub = self.UNDEFINED + if not com: + com = self.UNDEFINED _, file_name = os.path.split(resources) result = { "gn_path": gn_path, @@ -218,8 +247,14 @@ class ListResourceProcessor(DefaultProcessor): return sub = GnVariableParser.string_parser("subsystem_name", paragraph) com = GnVariableParser.string_parser("part_name", paragraph) - sub, sub_from = _gn_var_process(self.project_path, sub, _sub, gn_path, "gn", "json") - com, com_from = _gn_var_process(self.project_path, com, _com, gn_path, "gn", "json") + sub, sub_from = _gn_var_process( + self.project_path, sub, _sub, gn_path, "gn", "json") + com, com_from = _gn_var_process( + self.project_path, com, _com, gn_path, "gn", "json") + if not sub: + sub = self.UNDEFINED + if not com: + com = self.UNDEFINED for ff in resources: _, file_name = os.path.split(ff) result = { diff --git a/tools/rom_ram_analyzer/L2/README.md b/tools/rom_ram_analyzer/standard/README.md similarity index 92% rename from tools/rom_ram_analyzer/L2/README.md rename to tools/rom_ram_analyzer/standard/README.md index 52bc5a909162a30ed782103fee55e03f874794f0..69c6b5282ecd92f89dcc701aa7df904942371de6 100644 --- a/tools/rom_ram_analyzer/L2/README.md +++ b/tools/rom_ram_analyzer/standard/README.md @@ -15,7 +15,7 @@ 1. 获取整个rom_ram_analyzer目录 1. 对系统进行编译 1. rom分析在linux平台,ram分析在windows平台 -1. python3.8及以后 +1. python3及以后 1. 安装requirements ```txt xlwt==1.3.0 @@ -55,7 +55,7 @@ # -e True:output result in excel format additionally ``` -## 输出格式说明(json) +## 输出格式介绍(json) ```json @@ -70,6 +70,10 @@ } ``` +## 附加说明 + +1. 由于目前standard产品使用的基本都是自定义的template,能够有效收集更多信息,因此相较于lite_small的分析脚本,本脚本能够具有更高的准确率,请放心使用 + # ram_analyzer.py ## 功能介绍 @@ -86,7 +90,7 @@ 2. hdc可用 2. 设备已连接 3. 系统已烧录 -3. python3.8及以后 +3. python3 4. 安装requirements ```txt xlwt==1.3.0 @@ -132,9 +136,12 @@ { 进程名:{ "size": 本进程占用内存的大小, - 部件名: { - elf文件名: elf文件大小 - ... + 子系统名: { + 部件名: { + elf文件名: elf文件大小 + ... + } + ... } ... }, diff --git a/tools/rom_ram_analyzer/L2/__init__.py b/tools/rom_ram_analyzer/standard/__init__.py similarity index 100% rename from tools/rom_ram_analyzer/L2/__init__.py rename to tools/rom_ram_analyzer/standard/__init__.py diff --git a/tools/rom_ram_analyzer/L2/pkgs/__init__.py b/tools/rom_ram_analyzer/standard/pkgs/__init__.py similarity index 100% rename from tools/rom_ram_analyzer/L2/pkgs/__init__.py rename to tools/rom_ram_analyzer/standard/pkgs/__init__.py diff --git a/tools/rom_ram_analyzer/L2/pkgs/basic_tool.py b/tools/rom_ram_analyzer/standard/pkgs/basic_tool.py similarity index 100% rename from tools/rom_ram_analyzer/L2/pkgs/basic_tool.py rename to tools/rom_ram_analyzer/standard/pkgs/basic_tool.py diff --git a/tools/rom_ram_analyzer/L2/pkgs/gn_common_tool.py b/tools/rom_ram_analyzer/standard/pkgs/gn_common_tool.py similarity index 100% rename from tools/rom_ram_analyzer/L2/pkgs/gn_common_tool.py rename to tools/rom_ram_analyzer/standard/pkgs/gn_common_tool.py diff --git a/tools/rom_ram_analyzer/L2/pkgs/simple_excel_writer.py b/tools/rom_ram_analyzer/standard/pkgs/simple_excel_writer.py similarity index 86% rename from tools/rom_ram_analyzer/L2/pkgs/simple_excel_writer.py rename to tools/rom_ram_analyzer/standard/pkgs/simple_excel_writer.py index a1f2aa67e0e3a5257b66b93cacf1c13e745294a0..7ce9d2d1e5b8d350dd754d16dd50b99bc1178da8 100644 --- a/tools/rom_ram_analyzer/L2/pkgs/simple_excel_writer.py +++ b/tools/rom_ram_analyzer/standard/pkgs/simple_excel_writer.py @@ -1,5 +1,6 @@ import xlwt from xlwt import Worksheet +from xlwt import Pattern as PTRN, Alignment as ALMT, Font as FT, XFStyle as XFSTL import typing from typing import Optional from collections.abc import Iterable @@ -17,27 +18,27 @@ class SimpleExcelWriter: } self.__default_sheet_name = default_sheet_name # 表头样式 - self.__head_style = xlwt.XFStyle() + self.__head_style = XFSTL() # 内容样式 - self.__content_style = xlwt.XFStyle() + self.__content_style = XFSTL() # 字体 - font = xlwt.Font() - font.bold = True - - # 居中对齐 - alignment = xlwt.Alignment() - alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向 - alignment.vert = xlwt.Alignment.VERT_CENTER # 垂直方向 + ft = FT() + ft.bold = True # 设置背景颜色 - pattern = xlwt.Pattern() - pattern.pattern = xlwt.Pattern.SOLID_PATTERN - pattern.pattern_fore_colour = 22 # 背景颜色 + ptrn = PTRN() + ptrn.pattern = PTRN.SOLID_PATTERN + ptrn.pattern_fore_colour = 22 # 背景颜色 + + # 居中对齐 + algmt = ALMT() + algmt.horz = ALMT.HORZ_CENTER # 水平方向 + algmt.vert = ALMT.VERT_CENTER # 垂直方向 - self.__head_style.font = font - self.__head_style.alignment = alignment - self.__head_style.pattern = pattern - self.__content_style.alignment = alignment + self.__head_style.font = ft + self.__head_style.alignment = algmt + self.__head_style.pattern = ptrn + self.__content_style.alignment = algmt def __increment_y(self, sheet_name: str, value: int = 1) -> int: if sheet_name in self.__sheet_pos.keys(): diff --git a/tools/rom_ram_analyzer/L2/ram_analyzer.py b/tools/rom_ram_analyzer/standard/ram_analyzer.py similarity index 100% rename from tools/rom_ram_analyzer/L2/ram_analyzer.py rename to tools/rom_ram_analyzer/standard/ram_analyzer.py diff --git a/tools/rom_ram_analyzer/L2/rom_analyzer.py b/tools/rom_ram_analyzer/standard/rom_analyzer.py similarity index 100% rename from tools/rom_ram_analyzer/L2/rom_analyzer.py rename to tools/rom_ram_analyzer/standard/rom_analyzer.py