13f085823Sopenharmony_ci#!/usr/bin/env python3 23f085823Sopenharmony_ci# coding=utf-8 33f085823Sopenharmony_ci 43f085823Sopenharmony_ci# 53f085823Sopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd. 63f085823Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 73f085823Sopenharmony_ci# you may not use this file except in compliance with the License. 83f085823Sopenharmony_ci# You may obtain a copy of the License at 93f085823Sopenharmony_ci# 103f085823Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 113f085823Sopenharmony_ci# 123f085823Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 133f085823Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 143f085823Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153f085823Sopenharmony_ci# See the License for the specific language governing permissions and 163f085823Sopenharmony_ci# limitations under the License. 173f085823Sopenharmony_ci# 183f085823Sopenharmony_ci 193f085823Sopenharmony_ciimport os 203f085823Sopenharmony_ciimport json 213f085823Sopenharmony_ciimport stat 223f085823Sopenharmony_ciimport subprocess 233f085823Sopenharmony_ciimport time 243f085823Sopenharmony_cifrom subprocess import Popen, PIPE, STDOUT, TimeoutExpired 253f085823Sopenharmony_ci 263f085823Sopenharmony_ci 273f085823Sopenharmony_cidef logger(content, level): 283f085823Sopenharmony_ci """ 293f085823Sopenharmony_ci 日志打印 303f085823Sopenharmony_ci :param content:日志内容 313f085823Sopenharmony_ci :param level: 日志等级 323f085823Sopenharmony_ci :return: 333f085823Sopenharmony_ci """ 343f085823Sopenharmony_ci create_time = "{}".format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) 353f085823Sopenharmony_ci print("[{}] [{}] [{}]".format(create_time, level, content)) 363f085823Sopenharmony_ci 373f085823Sopenharmony_ci 383f085823Sopenharmony_cidef json_parse(json_file): 393f085823Sopenharmony_ci """ 403f085823Sopenharmony_ci json文件解析为json对象 413f085823Sopenharmony_ci :param json_file:json文件 423f085823Sopenharmony_ci :return:json对象 433f085823Sopenharmony_ci """ 443f085823Sopenharmony_ci if os.path.exists(json_file): 453f085823Sopenharmony_ci with open(json_file, "r") as jf: 463f085823Sopenharmony_ci return json.load(jf) 473f085823Sopenharmony_ci 483f085823Sopenharmony_ci logger("{} not exist.".format(json_file), "ERROR") 493f085823Sopenharmony_ci return {} 503f085823Sopenharmony_ci 513f085823Sopenharmony_ci 523f085823Sopenharmony_cidef get_product_name(root_path): 533f085823Sopenharmony_ci """ 543f085823Sopenharmony_ci 从ohos_config.json中获取编译产物路径 553f085823Sopenharmony_ci :param root_path: ohos_config.json所在的目录 563f085823Sopenharmony_ci :return: 编译产量生成的路径 573f085823Sopenharmony_ci """ 583f085823Sopenharmony_ci ohos_config = os.path.join(root_path, "out", "ohos_config.json") 593f085823Sopenharmony_ci json_obj = json_parse(ohos_config) 603f085823Sopenharmony_ci if json_obj: 613f085823Sopenharmony_ci product_name = json_obj["out_path"].split("out")[1].strip("/") 623f085823Sopenharmony_ci return product_name 633f085823Sopenharmony_ci 643f085823Sopenharmony_ci logger("{} not exist.".format(ohos_config), "ERROR") 653f085823Sopenharmony_ci return "" 663f085823Sopenharmony_ci 673f085823Sopenharmony_ci 683f085823Sopenharmony_cidef get_target_cpu(root_path): 693f085823Sopenharmony_ci """ 703f085823Sopenharmony_ci 从ohos_config.json中获取编译cpu 713f085823Sopenharmony_ci :param root_path: ohos_config.json所在的目录 723f085823Sopenharmony_ci :return: 编译产量生成的路径 733f085823Sopenharmony_ci """ 743f085823Sopenharmony_ci ohos_config = os.path.join(root_path, "out", "ohos_config.json") 753f085823Sopenharmony_ci json_obj = json_parse(ohos_config) 763f085823Sopenharmony_ci if json_obj: 773f085823Sopenharmony_ci target_cpu = json_obj["target_cpu"] 783f085823Sopenharmony_ci return target_cpu 793f085823Sopenharmony_ci 803f085823Sopenharmony_ci logger("{} not exist.".format(ohos_config), "ERROR") 813f085823Sopenharmony_ci return "" 823f085823Sopenharmony_ci 833f085823Sopenharmony_ci 843f085823Sopenharmony_cidef shell_command(command_list: list): 853f085823Sopenharmony_ci """ 863f085823Sopenharmony_ci 命令行执行命令 873f085823Sopenharmony_ci :param command_list:命令参数列表 883f085823Sopenharmony_ci :return: 893f085823Sopenharmony_ci """ 903f085823Sopenharmony_ci process = Popen(command_list, stdout=PIPE, stderr=STDOUT) 913f085823Sopenharmony_ci try: 923f085823Sopenharmony_ci outs, errs = process.communicate(timeout=900) 933f085823Sopenharmony_ci except TimeoutExpired: 943f085823Sopenharmony_ci process.kill() 953f085823Sopenharmony_ci outs, errs = process.communicate() 963f085823Sopenharmony_ci logger(outs.decode("utf-8").strip(), "INFO") 973f085823Sopenharmony_ci 983f085823Sopenharmony_ci return errs, process.returncode 993f085823Sopenharmony_ci 1003f085823Sopenharmony_ci 1013f085823Sopenharmony_cidef hdc_command(device_ip, device_port, device_sn, command): 1023f085823Sopenharmony_ci """ 1033f085823Sopenharmony_ci hdc对远程映射的设备执行命令 1043f085823Sopenharmony_ci :param device_ip:远程映射的ip 1053f085823Sopenharmony_ci :param device_port:hdc端口 1063f085823Sopenharmony_ci :param device_sn:设备sn号 1073f085823Sopenharmony_ci :param command: 1083f085823Sopenharmony_ci :return: 1093f085823Sopenharmony_ci """ 1103f085823Sopenharmony_ci connect_cmd = "hdc -s {}:{} -t {} ".format(device_ip, device_port, device_sn) 1113f085823Sopenharmony_ci cmd = connect_cmd + command 1123f085823Sopenharmony_ci cmd_list = cmd.split(" ") 1133f085823Sopenharmony_ci logger(cmd_list, "INFO") 1143f085823Sopenharmony_ci _, exitcode = shell_command(cmd_list) 1153f085823Sopenharmony_ci return exitcode 1163f085823Sopenharmony_ci 1173f085823Sopenharmony_ci 1183f085823Sopenharmony_cidef coverage_command(command): 1193f085823Sopenharmony_ci """ 1203f085823Sopenharmony_ci coverage_command 1213f085823Sopenharmony_ci :param command: 1223f085823Sopenharmony_ci :return: 1233f085823Sopenharmony_ci """ 1243f085823Sopenharmony_ci proc = subprocess.Popen(command, shell=True) 1253f085823Sopenharmony_ci try: 1263f085823Sopenharmony_ci proc.communicate() 1273f085823Sopenharmony_ci except subprocess.TimeoutExpired: 1283f085823Sopenharmony_ci proc.kill() 1293f085823Sopenharmony_ci proc.terminate() 1303f085823Sopenharmony_ci 1313f085823Sopenharmony_ci 1323f085823Sopenharmony_cidef tree_find_file_endswith(path, suffix, file_list=None): 1333f085823Sopenharmony_ci """ 1343f085823Sopenharmony_ci 获取目录下所有以指定字符串结尾的文件 1353f085823Sopenharmony_ci :param path: 需要遍历的目录 1363f085823Sopenharmony_ci :param suffix: 后缀 1373f085823Sopenharmony_ci :param file_list: 1383f085823Sopenharmony_ci :return: 1393f085823Sopenharmony_ci """ 1403f085823Sopenharmony_ci for f in os.listdir(path): 1413f085823Sopenharmony_ci full_path = os.path.join(path, f) 1423f085823Sopenharmony_ci if os.path.isfile(full_path) and full_path.endswith(suffix): 1433f085823Sopenharmony_ci file_list.append(full_path) 1443f085823Sopenharmony_ci if os.path.isdir(full_path): 1453f085823Sopenharmony_ci tree_find_file_endswith(full_path, suffix, file_list) 1463f085823Sopenharmony_ci return file_list 1473f085823Sopenharmony_ci 1483f085823Sopenharmony_ci 1493f085823Sopenharmony_ciclass FoundationServer: 1503f085823Sopenharmony_ci """ 1513f085823Sopenharmony_ci foundation拆分的进程和其对应的so之间的对应关系 1523f085823Sopenharmony_ci """ 1533f085823Sopenharmony_ci lib_dict = { 1543f085823Sopenharmony_ci "ams": ["libabilityms.z.so", "libdataobsms.z.so", "libupms.z.so", "libappms.z.so"], 1553f085823Sopenharmony_ci "bms": ["libbms.z.so"], 1563f085823Sopenharmony_ci "call": ["libtel_call_manager.z.so"], 1573f085823Sopenharmony_ci "dms": ["libdistributed_ability_manager_svr.z.so"], 1583f085823Sopenharmony_ci "fms": ["libfms.z.so"], 1593f085823Sopenharmony_ci "notification": ["libcesfwk_services.z.so", "libans.z.so"], 1603f085823Sopenharmony_ci "power": ["libbatteryservice.z.so", "libdisplaymgrservice.z.so", "libpowermgrservice.z.so", 1613f085823Sopenharmony_ci "libthermalservice.z.so", "libbatterystats_service.z.so"], 1623f085823Sopenharmony_ci "state": ["libtel_state_registry.z.so"], 1633f085823Sopenharmony_ci "wms": ["libwms.z.so"], 1643f085823Sopenharmony_ci "theme": ["libscreenlock_server.z.so"] 1653f085823Sopenharmony_ci } 1663f085823Sopenharmony_ci 1673f085823Sopenharmony_ci 1683f085823Sopenharmony_cidef is_elffile(filepath: str) -> bool: 1693f085823Sopenharmony_ci """ 1703f085823Sopenharmony_ci 判断文件是否二进制文件 1713f085823Sopenharmony_ci :param filepath: 1723f085823Sopenharmony_ci :return: bool 1733f085823Sopenharmony_ci """ 1743f085823Sopenharmony_ci if not os.path.exists(filepath): 1753f085823Sopenharmony_ci logger("{} not exists.".format(filepath), "ERROR") 1763f085823Sopenharmony_ci return False 1773f085823Sopenharmony_ci 1783f085823Sopenharmony_ci try: 1793f085823Sopenharmony_ci file_states = os.stat(filepath) 1803f085823Sopenharmony_ci file_mode = file_states[stat.ST_MODE] 1813f085823Sopenharmony_ci if not stat.S_ISREG(file_mode): 1823f085823Sopenharmony_ci return False 1833f085823Sopenharmony_ci with open(filepath, "rb") as f: 1843f085823Sopenharmony_ci header = (bytearray(f.read(4)[1:4])).decode(encoding="utf-8") 1853f085823Sopenharmony_ci if header in ["ELF"]: 1863f085823Sopenharmony_ci return True 1873f085823Sopenharmony_ci except UnicodeDecodeError as e: 1883f085823Sopenharmony_ci logger(e, "ERROR") 1893f085823Sopenharmony_ci 1903f085823Sopenharmony_ci return False 191