1#!/usr/bin/python2.4 -E 2 3import os 4import re 5import sys 6 7def PrintUsage(): 8 print "Usage:" + sys.argv[0] + " [-s serial_number] [-r] dir" 9 print " serial_number: the device being profiled" 10 print " -r : reuse the directory if it already exists" 11 print " dir: directory on the host to store profile results" 12 13if (len(sys.argv) <= 1 or len(sys.argv) > 5): 14 PrintUsage() 15 sys.exit(1) 16 17# find binaries 18try: 19 oprofile_bin_dir = os.environ['OPROFILE_BIN_DIR'] 20except: 21 try: 22 android_host_out = os.environ['ANDROID_HOST_OUT'] 23 except: 24 print "Either OPROFILE_BIN_DIR or ANDROID_HOST_OUT must be set. Run \". envsetup.sh\" first" 25 sys.exit(1) 26 oprofile_bin_dir = android_host_out + '/bin' 27 28argv_next = 1 29if sys.argv[1] == "-s": 30 if len(sys.argv) < 4: 31 PrintUsage() 32 sys.exit(1) 33 device = " -s %s" % sys.argv[2] 34 argv_next = argv_next + 2 35else: 36 device = "" 37 38if sys.argv[argv_next] == "-r" : 39 replace_dir = 1 40 output_dir = sys.argv[argv_next+1] 41else: 42 replace_dir = 0 43 output_dir = sys.argv[argv_next] 44 45if (os.path.exists(output_dir) and (replace_dir == 1)): 46 os.system("rm -fr " + output_dir) 47 48try: 49 os.makedirs(output_dir) 50except: 51 if os.path.exists(output_dir): 52 print "Directory already exists:", output_dir 53 print "Try \"" + sys.argv[0] + " -r " + output_dir + "\"" 54 else: 55 print "Cannot create", output_dir 56 sys.exit(1) 57 58# get the samples off the phone 59result = os.system("adb%s pull /data/oprofile/samples %s/raw_samples " 60 "> /dev/null 2>&1" % (device, output_dir)) 61if result != 0: 62 print "adb%s pull failure, exiting" % device 63 sys.exit(1) 64 65# get the ABI information off the phone 66result = os.system("adb%s pull /data/oprofile/abi %s/abi " 67 "> /dev/null 2>&1" % (device, output_dir)) 68if result != 0: 69 print "adb%s pull failure, exiting" % device 70 sys.exit(1) 71 72# enter the destination directory 73os.chdir(output_dir) 74 75# We need to replace the " (deleted)" part in the directory names if 76# the region is allocated through ashmem. The post-processing tool doesn't like 77# space and parentheses. 78# Rename each individual directory from the longest first 79# For example, first rename 80# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache (deleted) 81# to 82# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 83# then to 84# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 85deleted_pattern = re.compile(" \(deleted\)$"); 86stream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r") 87for line in stream: 88 line = line.rstrip() 89 new_dir = deleted_pattern.sub("", line) 90 cmd = "mv " + "\"" + line + "\" \"" + new_dir + "\"" 91 os.system(cmd) 92 93# now all the sample files are on the host, we need to invoke opimport one at a 94# time to convert the content from the ARM abi to x86 ABI 95 96# break the full filename into: 97# 1: leading dir: "raw_samples" 98# 2: intermediate dirs: "/blah/blah/blah" 99# 3: filename: e.g. "CPU_CYCLES.150000.0.all.all.all" 100pattern = re.compile("(^raw_samples)(.*)/(.*)$") 101 102stream = os.popen("find raw_samples -type f -name \*all") 103for line in stream: 104 match = pattern.search(line) 105 leading_dir = match.group(1) 106 middle_part = match.group(2) 107 file_name = match.group(3) 108 109 dir = "samples" + middle_part 110 111 # if multiple events are collected the directory could have been setup 112 if not os.path.exists(dir): 113 os.makedirs(dir) 114 115 cmd = oprofile_bin_dir + "/opimport -a abi " \ 116 + " -o samples" + middle_part + "/" + file_name + " " + line 117 os.system(cmd) 118 119stream.close() 120 121# short summary of profiling results 122os.system(oprofile_bin_dir + "/opreport --session-dir=.") 123