summaryrefslogtreecommitdiff
path: root/simpleperf/scripts/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/scripts/utils.py')
-rw-r--r--simpleperf/scripts/utils.py90
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)