123 lines
3.8 KiB
Python
Executable File
123 lines
3.8 KiB
Python
Executable File
#!/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=.")
|