Home | History | Annotate | Download | only in inferno
      1 import subprocess
      2 import abc
      3 import os
      4 
      5 BIN_PATH = "../scripts/bin/android/%s/simpleperf"
      6 
      7 class Abi:
      8     ARM    = 1
      9     ARM_64 = 2
     10     X86    = 3
     11     X86_64 = 4
     12 
     13     def __init__(self):
     14         pass
     15 
     16 class Adb:
     17 
     18     def __init__(self):
     19         pass
     20 
     21 
     22     def delete_previous_data(self):
     23         err = subprocess.call(["adb", "shell", "rm", "-f", "/data/local/tmp/perf.data"])
     24 
     25 
     26     def get_process_pid(self, process_name):
     27         piof_output = subprocess.check_output(["adb", "shell", "pidof", process_name])
     28         try:
     29             process_id = int(piof_output)
     30         except ValueError:
     31             process_id = 0
     32         return process_id
     33 
     34 
     35     def pull_data(self):
     36         err = subprocess.call(["adb", "pull", "/data/local/tmp/perf.data", "."])
     37         return err
     38 
     39 
     40     @abc.abstractmethod
     41     def collect_data(self, simpleperf_command):
     42         raise NotImplementedError("%s.collect_data(str) is not implemented!" % self.__class__.__name__)
     43 
     44 
     45     def get_props(self):
     46         props = {}
     47         output = subprocess.check_output(["adb", "shell", "getprop"])
     48         lines = output.split("\n")
     49         for line in lines:
     50             tokens = line.split(": ")
     51             if len(tokens) < 2:
     52                 continue
     53             key = tokens[0].replace("[", "").replace("]", "")
     54             value = tokens[1].replace("[", "").replace("]", "")
     55             props[key] = value
     56         return props
     57 
     58     def parse_abi(self, str):
     59         if str.find("arm64") != -1:
     60             return Abi.ARM_64
     61         if str.find("arm") != -1:
     62             return Abi.ARM
     63         if str.find("x86_64") != -1:
     64             return Abi.X86_64
     65         if str.find("x86") != -1:
     66             return Abi.X86
     67         return Abi.ARM_64
     68 
     69     def get_exec_path(self, abi):
     70         folder_name = "arm64"
     71         if abi == Abi.ARM:
     72             folder_name = "arm"
     73         if abi == Abi.X86:
     74             folder_name = "x86"
     75         if abi == Abi.X86_64:
     76             folder_name = "x86_64"
     77         return os.path.join(os.path.dirname(__file__), BIN_PATH % folder_name)
     78 
     79     def push_simpleperf_binary(self):
     80         # Detect the ABI of the device
     81         props = self.get_props()
     82         abi_raw = props["ro.product.cpu.abi"]
     83         abi = self.parse_abi(abi_raw)
     84         exec_path = self.get_exec_path(abi)
     85 
     86         # Push simpleperf to the device
     87         print "Pushing local '%s' to device." % exec_path
     88         subprocess.call(["adb", "push", exec_path, "/data/local/tmp/simpleperf"])
     89