#!/usr/bin/python2.4 -E import os import re import sys def PrintUsage(): print "Usage:" + sys.argv[0] + " [-s serial_number] [-r] dir" print " serial_number: the device being profiled" print " -r : reuse the directory if it already exists" print " dir: directory on the host to store profile results" if (len(sys.argv) <= 1 or len(sys.argv) > 5): PrintUsage() sys.exit(1) # find binaries try: oprofile_bin_dir = os.environ['OPROFILE_BIN_DIR'] except: try: android_host_out = os.environ['ANDROID_HOST_OUT'] except: print "Either OPROFILE_BIN_DIR or ANDROID_HOST_OUT must be set. Run \". envsetup.sh\" first" sys.exit(1) oprofile_bin_dir = android_host_out + '/bin' argv_next = 1 if sys.argv[1] == "-s": if len(sys.argv) < 4: PrintUsage() sys.exit(1) device = " -s %s" % sys.argv[2] argv_next = argv_next + 2 else: device = "" if sys.argv[argv_next] == "-r" : replace_dir = 1 output_dir = sys.argv[argv_next+1] else: replace_dir = 0 output_dir = sys.argv[argv_next] if (os.path.exists(output_dir) and (replace_dir == 1)): os.system("rm -fr " + output_dir) try: os.makedirs(output_dir) except: if os.path.exists(output_dir): print "Directory already exists:", output_dir print "Try \"" + sys.argv[0] + " -r " + output_dir + "\"" else: print "Cannot create", output_dir sys.exit(1) # get the samples off the phone result = os.system("adb%s pull /data/oprofile/samples %s/raw_samples " "> /dev/null 2>&1" % (device, output_dir)) if result != 0: print "adb%s pull failure, exiting" % device sys.exit(1) # get the ABI information off the phone result = os.system("adb%s pull /data/oprofile/abi %s/abi " "> /dev/null 2>&1" % (device, output_dir)) if result != 0: print "adb%s pull failure, exiting" % device sys.exit(1) # enter the destination directory os.chdir(output_dir) # We need to replace the " (deleted)" part in the directory names if # the region is allocated through ashmem. The post-processing tool doesn't like # space and parentheses. # Rename each individual directory from the longest first # For example, first rename # raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache (deleted) # to # raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache # then to # raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache deleted_pattern = re.compile(" \(deleted\)$"); stream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r") for line in stream: line = line.rstrip() new_dir = deleted_pattern.sub("", line) cmd = "mv " + "\"" + line + "\" \"" + new_dir + "\"" os.system(cmd) # now all the sample files are on the host, we need to invoke opimport one at a # time to convert the content from the ARM abi to x86 ABI # break the full filename into: # 1: leading dir: "raw_samples" # 2: intermediate dirs: "/blah/blah/blah" # 3: filename: e.g. "CPU_CYCLES.150000.0.all.all.all" pattern = re.compile("(^raw_samples)(.*)/(.*)$") stream = os.popen("find raw_samples -type f -name \*all") for line in stream: match = pattern.search(line) leading_dir = match.group(1) middle_part = match.group(2) file_name = match.group(3) dir = "samples" + middle_part # if multiple events are collected the directory could have been setup if not os.path.exists(dir): os.makedirs(dir) cmd = oprofile_bin_dir + "/opimport -a abi " \ + " -o samples" + middle_part + "/" + file_name + " " + line os.system(cmd) stream.close() # short summary of profiling results os.system(oprofile_bin_dir + "/opreport --session-dir=.")