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