| #!/usr/bin/env python3 | |
| # Copyright 2021 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| """Utils for accessing Android devices.""" | |
| import json | |
| import re | |
| from typing import Sequence | |
| from .benchmark_definition import execute_cmd_and_get_stdout, DeviceInfo, PlatformType | |
| def get_android_device_model(verbose: bool = False) -> str: | |
| """Returns the Android device model.""" | |
| model = execute_cmd_and_get_stdout( | |
| ["adb", "shell", "getprop", "ro.product.model"], verbose=verbose | |
| ) | |
| model = re.sub(r"\W+", "-", model) | |
| return model | |
| def get_android_cpu_abi(verbose: bool = False) -> str: | |
| """Returns the CPU ABI for the Android device.""" | |
| return execute_cmd_and_get_stdout( | |
| ["adb", "shell", "getprop", "ro.product.cpu.abi"], verbose=verbose | |
| ) | |
| def get_android_cpu_features(verbose: bool = False) -> Sequence[str]: | |
| """Returns the CPU features for the Android device.""" | |
| cpuinfo = execute_cmd_and_get_stdout( | |
| ["adb", "shell", "cat", "/proc/cpuinfo"], verbose=verbose | |
| ) | |
| features = [] | |
| for line in cpuinfo.splitlines(): | |
| if line.startswith("Features"): | |
| _, features = line.split(":") | |
| return features.strip().split() | |
| return features | |
| def get_android_gpu_name(verbose: bool = False) -> str: | |
| """Returns the GPU name for the Android device.""" | |
| vkjson = execute_cmd_and_get_stdout( | |
| ["adb", "shell", "cmd", "gpu", "vkjson"], verbose=verbose | |
| ) | |
| vkjson = json.loads(vkjson) | |
| name = vkjson["devices"][0]["properties"]["deviceName"] | |
| # Perform some canonicalization: | |
| # - Adreno GPUs have raw names like "Adreno (TM) 650". | |
| name = name.replace("(TM)", "") | |
| # Replace all consecutive non-word characters with a single hyphen. | |
| name = re.sub(r"\W+", "-", name) | |
| return name | |
| def get_android_device_info(verbose: bool = False) -> DeviceInfo: | |
| """Returns device info for the Android device.""" | |
| return DeviceInfo( | |
| platform_type=PlatformType.ANDROID, | |
| model=get_android_device_model(verbose), | |
| cpu_abi=get_android_cpu_abi(verbose), | |
| cpu_uarch=None, | |
| cpu_features=get_android_cpu_features(verbose), | |
| gpu_name=get_android_gpu_name(verbose), | |
| ) |