diff options
Diffstat (limited to 'simpleperf/scripts/utils.py')
-rw-r--r-- | simpleperf/scripts/utils.py | 90 |
1 files changed, 86 insertions, 4 deletions
diff --git a/simpleperf/scripts/utils.py b/simpleperf/scripts/utils.py index a0b3b3ba..2e2c69ad 100644 --- a/simpleperf/scripts/utils.py +++ b/simpleperf/scripts/utils.py @@ -20,6 +20,7 @@ from __future__ import print_function import logging +import os import os.path import subprocess import sys @@ -31,6 +32,9 @@ def get_script_dir(): def is_windows(): return sys.platform == 'win32' or sys.platform == 'cygwin' +def is_darwin(): + return sys.platform == 'darwin' + def is_python3(): return sys.version_info >= (3, 0) @@ -50,6 +54,9 @@ def log_warning(msg): def log_fatal(msg): raise Exception(msg) +def log_exit(msg): + sys.exit(msg) + def str_to_bytes(str): if not is_python3(): return str @@ -95,8 +102,75 @@ def get_host_binary_path(binary_name): return binary_path +def is_executable_available(executable, option='--help'): + """ Run an executable to see if it exists. """ + try: + subproc = subprocess.Popen([executable, option], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + subproc.communicate() + return subproc.returncode == 0 + except: + return False + +expected_tool_paths = { + 'adb': { + 'test_option': 'version', + 'darwin': [(True, 'Library/Android/sdk/platform-tools/adb'), + (False, '../../platform-tools/adb')], + 'linux': [(True, 'Android/Sdk/platform-tools/adb'), + (False, '../../platform-tools/adb')], + 'windows': [(True, 'AppData/Local/Android/sdk/platform-tools/adb'), + (False, '../../platform-tools/adb')], + }, + 'readelf': { + 'test_option': '--help', + 'darwin': [(True, 'Library/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-readelf'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-readelf')], + 'linux': [(True, 'Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf')], + 'windows': [(True, 'AppData/Local/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-readelf'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-readelf')], + }, + 'addr2line': { + 'test_option': '--help', + 'darwin': [(True, 'Library/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line')], + 'linux': [(True, 'Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line')], + 'windows': [(True, 'AppData/Local/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-addr2line'), + (False, '../toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-addr2line')], + }, +} + +def find_tool_path(toolname): + if toolname not in expected_tool_paths: + return None + test_option = expected_tool_paths[toolname]['test_option'] + if is_executable_available(toolname, test_option): + return toolname + platform = 'linux' + if is_windows(): + platform = 'windows' + elif is_darwin(): + platform = 'darwin' + paths = expected_tool_paths[toolname][platform] + home = os.environ.get('HOMEPATH') if is_windows() else os.environ.get('HOME') + for (relative_to_home, path) in paths: + path = path.replace('/', os.sep) + if relative_to_home: + path = os.path.join(home, path) + else: + path = os.path.join(get_script_dir(), path) + if is_executable_available(path, test_option): + return path + return None + + class AdbHelper(object): - def __init__(self, adb_path): + def __init__(self): + adb_path = find_tool_path('adb') + if not adb_path: + log_exit("Can't find adb in PATH environment.") self.adb_path = adb_path @@ -116,7 +190,7 @@ class AdbHelper(object): (stdoutdata, _) = subproc.communicate() returncode = subproc.returncode result = (returncode == 0) - if stdoutdata: + if stdoutdata and adb_args[1] != 'push' and adb_args[1] != 'pull': stdoutdata = bytes_to_str(stdoutdata) log_debug(stdoutdata) log_debug('run adb cmd: %s [result %s]' % (adb_args, result)) @@ -129,7 +203,7 @@ class AdbHelper(object): def check_run_and_return_output(self, adb_args, stdout_file=None): result, stdoutdata = self.run_and_return_output(adb_args, stdout_file) if not result: - log_fatal('run "adb %s" failed' % adb_args) + log_exit('run "adb %s" failed' % adb_args) return stdoutdata @@ -161,7 +235,7 @@ class AdbHelper(object): def load_config(config_file): if not os.path.exists(config_file): - log_fatal("can't find config_file: %s" % config_file) + log_exit("can't find config_file: %s" % config_file) config = {} if is_python3(): with open(config_file, 'r') as fh: @@ -172,4 +246,12 @@ def load_config(config_file): return config +def flatten_arg_list(arg_list): + res = [] + if arg_list: + for items in arg_list: + res += items + return res + + logging.getLogger().setLevel(logging.DEBUG) |