110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#!/usr/bin/python2.4 -E 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectimport os 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectimport re 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectimport sys 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectdef PrintUsage(): 8df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu print "Usage:" + sys.argv[0] + " [-s serial_number] [-r] dir" 9df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu print " serial_number: the device being profiled" 10d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng print " -r : reuse the directory if it already exists" 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print " dir: directory on the host to store profile results" 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 13b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brownif (len(sys.argv) <= 1 or len(sys.argv) > 5): 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project PrintUsage() 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sys.exit(1) 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown# find binaries 18b415faba7482dd7ee3335f0f1518333554e3da0dJeff Browntry: 19b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown oprofile_bin_dir = os.environ['OPROFILE_BIN_DIR'] 20b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brownexcept: 21c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown try: 22c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown android_host_out = os.environ['ANDROID_HOST_OUT'] 23c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown except: 24c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown print "Either OPROFILE_BIN_DIR or ANDROID_HOST_OUT must be set. Run \". envsetup.sh\" first" 25c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown sys.exit(1) 26c3efb236108cf27a97d4cf7f05ee4a9a02f8e5faJeff Brown oprofile_bin_dir = android_host_out + '/bin' 27b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown 28df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yuargv_next = 1 29df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yuif sys.argv[1] == "-s": 30df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu if len(sys.argv) < 4: 31df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu PrintUsage() 32df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu sys.exit(1) 33df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu device = " -s %s" % sys.argv[2] 34df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu argv_next = argv_next + 2 35df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yuelse: 36df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu device = "" 37df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu 38df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yuif sys.argv[argv_next] == "-r" : 39d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng replace_dir = 1 40df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu output_dir = sys.argv[argv_next+1] 41d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Chengelse: 42d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng replace_dir = 0 43df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu output_dir = sys.argv[argv_next] 44d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng 45d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Chengif (os.path.exists(output_dir) and (replace_dir == 1)): 46d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng os.system("rm -fr " + output_dir) 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projecttry: 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project os.makedirs(output_dir) 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectexcept: 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if os.path.exists(output_dir): 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print "Directory already exists:", output_dir 53d6eeae3f5dd027a2d4e6b702cc07db4a605848c0Ben Cheng print "Try \"" + sys.argv[0] + " -r " + output_dir + "\"" 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project else: 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print "Cannot create", output_dir 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sys.exit(1) 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# get the samples off the phone 59df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yuresult = os.system("adb%s pull /data/oprofile/samples %s/raw_samples " 60df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu "> /dev/null 2>&1" % (device, output_dir)) 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectif result != 0: 62df3ced8cb815de064d86c11b55a2150ac8839a00Jing Yu print "adb%s pull failure, exiting" % device 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project sys.exit(1) 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 65b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown# get the ABI information off the phone 66b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brownresult = os.system("adb%s pull /data/oprofile/abi %s/abi " 67b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown "> /dev/null 2>&1" % (device, output_dir)) 68b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brownif result != 0: 69b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown print "adb%s pull failure, exiting" % device 70b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown sys.exit(1) 71b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# enter the destination directory 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectos.chdir(output_dir) 74afec5b915f91a233f37047c29de9531be001778aBen Cheng 75afec5b915f91a233f37047c29de9531be001778aBen Cheng# We need to replace the " (deleted)" part in the directory names if 76afec5b915f91a233f37047c29de9531be001778aBen Cheng# the region is allocated through ashmem. The post-processing tool doesn't like 77afec5b915f91a233f37047c29de9531be001778aBen Cheng# space and parentheses. 78afec5b915f91a233f37047c29de9531be001778aBen Cheng# Rename each individual directory from the longest first 79afec5b915f91a233f37047c29de9531be001778aBen Cheng# For example, first rename 80afec5b915f91a233f37047c29de9531be001778aBen Cheng# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache (deleted) 81afec5b915f91a233f37047c29de9531be001778aBen Cheng# to 82afec5b915f91a233f37047c29de9531be001778aBen Cheng# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 83afec5b915f91a233f37047c29de9531be001778aBen Cheng# then to 84afec5b915f91a233f37047c29de9531be001778aBen Cheng# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 85afec5b915f91a233f37047c29de9531be001778aBen Chengdeleted_pattern = re.compile(" \(deleted\)$"); 86afec5b915f91a233f37047c29de9531be001778aBen Chengstream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r") 87afec5b915f91a233f37047c29de9531be001778aBen Chengfor line in stream: 88afec5b915f91a233f37047c29de9531be001778aBen Cheng line = line.rstrip() 89afec5b915f91a233f37047c29de9531be001778aBen Cheng new_dir = deleted_pattern.sub("", line) 90afec5b915f91a233f37047c29de9531be001778aBen Cheng cmd = "mv " + "\"" + line + "\" \"" + new_dir + "\"" 91afec5b915f91a233f37047c29de9531be001778aBen Cheng os.system(cmd) 9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# now all the sample files are on the host, we need to invoke opimport one at a 9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# time to convert the content from the ARM abi to x86 ABI 9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# break the full filename into: 9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# 1: leading dir: "raw_samples" 9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# 2: intermediate dirs: "/blah/blah/blah" 9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# 3: filename: e.g. "CPU_CYCLES.150000.0.all.all.all" 10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectpattern = re.compile("(^raw_samples)(.*)/(.*)$") 101afec5b915f91a233f37047c29de9531be001778aBen Cheng 102afec5b915f91a233f37047c29de9531be001778aBen Chengstream = os.popen("find raw_samples -type f -name \*all") 10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectfor line in stream: 10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project match = pattern.search(line) 10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project leading_dir = match.group(1) 10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project middle_part = match.group(2) 10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project file_name = match.group(3) 10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dir = "samples" + middle_part 11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project # if multiple events are collected the directory could have been setup 11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if not os.path.exists(dir): 11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project os.makedirs(dir) 11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 115b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown cmd = oprofile_bin_dir + "/opimport -a abi " \ 116b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brown + " -o samples" + middle_part + "/" + file_name + " " + line 11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project os.system(cmd) 11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstream.close() 12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project# short summary of profiling results 122b415faba7482dd7ee3335f0f1518333554e3da0dJeff Brownos.system(oprofile_bin_dir + "/opreport --session-dir=.") 123