You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.4 KiB
88 lines
2.4 KiB
import subprocess |
|
import abc |
|
import os |
|
|
|
BIN_PATH = "../scripts/bin/android/%s/simpleperf" |
|
|
|
class Abi: |
|
ARM = 1 |
|
ARM_64 = 2 |
|
X86 = 3 |
|
X86_64 = 4 |
|
|
|
def __init__(self): |
|
pass |
|
|
|
class Adb: |
|
|
|
def __init__(self): |
|
pass |
|
|
|
|
|
def delete_previous_data(self): |
|
err = subprocess.call(["adb", "shell", "rm", "-f", "/data/local/tmp/perf.data"]) |
|
|
|
|
|
def get_process_pid(self, process_name): |
|
piof_output = subprocess.check_output(["adb", "shell", "pidof", process_name]) |
|
try: |
|
process_id = int(piof_output) |
|
except ValueError: |
|
process_id = 0 |
|
return process_id |
|
|
|
|
|
def pull_data(self): |
|
err = subprocess.call(["adb", "pull", "/data/local/tmp/perf.data", "."]) |
|
return err |
|
|
|
|
|
@abc.abstractmethod |
|
def collect_data(self, simpleperf_command): |
|
raise NotImplementedError("%s.collect_data(str) is not implemented!" % self.__class__.__name__) |
|
|
|
|
|
def get_props(self): |
|
props = {} |
|
output = subprocess.check_output(["adb", "shell", "getprop"]) |
|
lines = output.split("\n") |
|
for line in lines: |
|
tokens = line.split(": ") |
|
if len(tokens) < 2: |
|
continue |
|
key = tokens[0].replace("[", "").replace("]", "") |
|
value = tokens[1].replace("[", "").replace("]", "") |
|
props[key] = value |
|
return props |
|
|
|
def parse_abi(self, str): |
|
if str.find("arm64") != -1: |
|
return Abi.ARM_64 |
|
if str.find("arm") != -1: |
|
return Abi.ARM |
|
if str.find("x86_64") != -1: |
|
return Abi.X86_64 |
|
if str.find("x86") != -1: |
|
return Abi.X86 |
|
return Abi.ARM_64 |
|
|
|
def get_exec_path(self, abi): |
|
folder_name = "arm64" |
|
if abi == Abi.ARM: |
|
folder_name = "arm" |
|
if abi == Abi.X86: |
|
folder_name = "x86" |
|
if abi == Abi.X86_64: |
|
folder_name = "x86_64" |
|
return os.path.join(os.path.dirname(__file__), BIN_PATH % folder_name) |
|
|
|
def push_simpleperf_binary(self): |
|
# Detect the ABI of the device |
|
props = self.get_props() |
|
abi_raw = props["ro.product.cpu.abi"] |
|
abi = self.parse_abi(abi_raw) |
|
exec_path = self.get_exec_path(abi) |
|
|
|
# Push simpleperf to the device |
|
print "Pushing local '%s' to device." % exec_path |
|
subprocess.call(["adb", "push", exec_path, "/data/local/tmp/simpleperf"])
|
|
|