88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
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"])
|