1 #!/usr/bin/python2.4 -E 2 3 import os 4 import re 5 import sys 6 7 def 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 13 if (len(sys.argv) <= 1 or len(sys.argv) > 5): 14 PrintUsage() 15 sys.exit(1) 16 17 # find binaries 18 try: 19 oprofile_bin_dir = os.environ['OPROFILE_BIN_DIR'] 20 except: 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 28 argv_next = 1 29 if 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 35 else: 36 device = "" 37 38 if sys.argv[argv_next] == "-r" : 39 replace_dir = 1 40 output_dir = sys.argv[argv_next+1] 41 else: 42 replace_dir = 0 43 output_dir = sys.argv[argv_next] 44 45 if (os.path.exists(output_dir) and (replace_dir == 1)): 46 os.system("rm -fr " + output_dir) 47 48 try: 49 os.makedirs(output_dir) 50 except: 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 59 result = os.system("adb%s pull /data/oprofile/samples %s/raw_samples " 60 "> /dev/null 2>&1" % (device, output_dir)) 61 if result != 0: 62 print "adb%s pull failure, exiting" % device 63 sys.exit(1) 64 65 # get the ABI information off the phone 66 result = os.system("adb%s pull /data/oprofile/abi %s/abi " 67 "> /dev/null 2>&1" % (device, output_dir)) 68 if result != 0: 69 print "adb%s pull failure, exiting" % device 70 sys.exit(1) 71 72 # enter the destination directory 73 os.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 85 deleted_pattern = re.compile(" \(deleted\)$"); 86 stream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r") 87 for 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" 100 pattern = re.compile("(^raw_samples)(.*)/(.*)$") 101 102 stream = os.popen("find raw_samples -type f -name \*all") 103 for 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 119 stream.close() 120 121 # short summary of profiling results 122 os.system(oprofile_bin_dir + "/opreport --session-dir=.") 123