|  | #!/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_output, DeviceInfo, | 
|  | PlatformType) | 
|  |  | 
|  |  | 
|  | def get_android_device_model(verbose: bool = False) -> str: | 
|  | """Returns the Android device model.""" | 
|  | model = execute_cmd_and_get_output( | 
|  | ["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_output( | 
|  | ["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_output(["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_output(["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 hypen. | 
|  | 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)) |