summaryrefslogtreecommitdiff
path: root/boottime_tools/bootanalyze/bootanalyze.py
diff options
context:
space:
mode:
Diffstat (limited to 'boottime_tools/bootanalyze/bootanalyze.py')
-rwxr-xr-xboottime_tools/bootanalyze/bootanalyze.py289
1 files changed, 147 insertions, 142 deletions
diff --git a/boottime_tools/bootanalyze/bootanalyze.py b/boottime_tools/bootanalyze/bootanalyze.py
index 7eea05b9..ef5c5273 100755
--- a/boottime_tools/bootanalyze/bootanalyze.py
+++ b/boottime_tools/bootanalyze/bootanalyze.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/python
# Copyright (C) 2016 The Android Open Source Project
#
@@ -36,8 +36,8 @@ import yaml
from datetime import datetime, date
-TIME_DMESG = r"\[\s*(\d+\.\d+)\]"
-TIME_LOGCAT = r"[0-9]+\.?[0-9]*"
+TIME_DMESG = "\[\s*(\d+\.\d+)\]"
+TIME_LOGCAT = "[0-9]+\.?[0-9]*"
KERNEL_TIME_KEY = "kernel"
BOOT_ANIM_END_TIME_KEY = "BootAnimEnd"
KERNEL_BOOT_COMPLETE = "BootComplete_kernel"
@@ -48,8 +48,8 @@ MAX_RETRIES = 5
DEBUG = False
ADB_CMD = "adb"
TIMING_THRESHOLD = 5.0
-BOOT_PROP = r"\[ro\.boottime\.([^\]]+)\]:\s+\[(\d+)\]"
-BOOTLOADER_TIME_PROP = r"\[ro\.boot\.boottime\]:\s+\[([^\]]+)\]"
+BOOT_PROP = "\[ro\.boottime\.([^\]]+)\]:\s+\[(\d+)\]"
+BOOTLOADER_TIME_PROP = "\[ro\.boot\.boottime\]:\s+\[([^\]]+)\]"
max_wait_time = BOOT_TIME_TOO_BIG
@@ -59,10 +59,10 @@ def main():
args = init_arguments()
if args.iterate < 1:
- raise Exception('Number of iteration must be >=1')
+ raise Exception('Number of iteration must be >=1');
if args.iterate > 1 and not args.reboot:
- print("Forcing reboot flag")
+ print "Forcing reboot flag"
args.reboot = True
if args.serial:
@@ -84,21 +84,21 @@ def main():
value = float(kv[1])
components_to_monitor[key] = value
- cfg = yaml.load(args.config, Loader=yaml.FullLoader)
+ cfg = yaml.load(args.config)
if args.stressfs:
if run_adb_cmd('install -r -g ' + args.stressfs) != 0:
- raise Exception('StressFS APK not installed')
+ raise Exception('StressFS APK not installed');
if args.iterate > 1 and args.bootchart:
run_adb_shell_cmd_as_root('touch /data/bootchart/enabled')
search_events_pattern = {key: re.compile(pattern)
- for key, pattern in cfg['events'].items()}
+ for key, pattern in cfg['events'].iteritems()}
timing_events_pattern = {key: re.compile(pattern)
- for key, pattern in cfg['timings'].items()}
+ for key, pattern in cfg['timings'].iteritems()}
shutdown_events_pattern = {key: re.compile(pattern)
- for key, pattern in cfg['shutdown_events'].items()}
+ for key, pattern in cfg['shutdown_events'].iteritems()}
data_points = {}
kernel_timing_points = collections.OrderedDict()
@@ -110,7 +110,7 @@ def main():
shutdown_timing_event_all = collections.OrderedDict()
for it in range(0, args.iterate):
if args.iterate > 1:
- print("Run: {0}".format(it))
+ print "Run: {0}".format(it)
attempt = 1
processing_data = None
timings = None
@@ -122,14 +122,14 @@ def main():
args, search_events_pattern, timing_events_pattern, shutdown_events_pattern, cfg,\
error_time, components_to_monitor)
if shutdown_events:
- for k, v in shutdown_events.items():
+ for k, v in shutdown_events.iteritems():
events = shutdown_event_all.get(k)
if not events:
events = []
shutdown_event_all[k] = events
events.append(v)
if shutdown_timing_events:
- for k, v in shutdown_timing_events.items():
+ for k, v in shutdown_timing_events.iteritems():
events = shutdown_timing_event_all.get(k)
if not events:
events = []
@@ -137,31 +137,31 @@ def main():
events.append(v)
if not processing_data or not boottime_events:
# Processing error
- print("Failed to collect valid samples for run {0}".format(it))
+ print "Failed to collect valid samples for run {0}".format(it)
continue
if args.bootchart:
grab_bootchart(boot_chart_file_name_prefix + "_run_" + str(it))
if args.systrace:
grab_systrace(systrace_file_name_prefix + "_run_" + str(it))
- for k, v in processing_data.items():
+ for k, v in processing_data.iteritems():
if k not in data_points:
data_points[k] = []
data_points[k].append(v['value'])
if kernel_timings is not None:
- for k, v in kernel_timings.items():
+ for k, v in kernel_timings.iteritems():
if k not in kernel_timing_points:
kernel_timing_points[k] = []
kernel_timing_points[k].append(v)
if logcat_timings is not None:
- for k, v in logcat_timings.items():
+ for k, v in logcat_timings.iteritems():
if k not in logcat_timing_points:
logcat_timing_points[k] = []
logcat_timing_points[k].append(v)
- for k, v in boottime_events.items():
- if k not in boottime_points:
+ for k, v in boottime_events.iteritems():
+ if not k in boottime_points:
boottime_points[k] = []
boottime_points[k].append(v)
@@ -170,90 +170,90 @@ def main():
run_adb_shell_cmd('"rm -rf /storage/emulated/0/stressfs_data*"')
if args.iterate > 1:
- print("-----------------")
- print("\nshutdown events after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
- for item in list(shutdown_event_all.items()):
+ print "-----------------"
+ print "\nshutdown events after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
+ for item in shutdown_event_all.items():
num_runs = len(item[1])
- print('{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
+ print '{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
item[0], sum(item[1])/num_runs, stddev(item[1]),\
"*time taken" if item[0].startswith("init.") else "",\
- num_runs if num_runs != args.iterate else ""))
- print("\nshutdown timing events after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
- for item in list(shutdown_timing_event_all.items()):
+ num_runs if num_runs != args.iterate else "")
+ print "\nshutdown timing events after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
+ for item in shutdown_timing_event_all.items():
num_runs = len(item[1])
- print('{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
+ print '{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
item[0], sum(item[1])/num_runs, stddev(item[1]),\
"*time taken" if item[0].startswith("init.") else "",\
- num_runs if num_runs != args.iterate else ""))
+ num_runs if num_runs != args.iterate else "")
- print("-----------------")
- print("ro.boottime.* after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
- for item in list(boottime_points.items()):
+ print "-----------------"
+ print "ro.boottime.* after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
+ for item in boottime_points.items():
num_runs = len(item[1])
- print('{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
+ print '{0:30}: {1:<7.5} {2:<7.5} {3} {4}'.format(
item[0], sum(item[1])/num_runs, stddev(item[1]),\
"*time taken" if item[0].startswith("init.") else "",\
- num_runs if num_runs != args.iterate else ""))
+ num_runs if num_runs != args.iterate else "")
if args.timings:
dump_timings_points_summary("Kernel", kernel_timing_points, args)
dump_timings_points_summary("Logcat", logcat_timing_points, args)
- print("-----------------")
- print("Avg values after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
+ print "-----------------"
+ print "Avg values after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
average_with_stddev = []
- for item in list(data_points.items()):
+ for item in data_points.items():
average_with_stddev.append((item[0], sum(item[1])/len(item[1]), stddev(item[1]),\
len(item[1])))
for item in sorted(average_with_stddev, key=lambda entry: entry[1]):
- print('{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
- item[0], item[1], item[2], item[3] if item[3] != args.iterate else ""))
+ print '{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
+ item[0], item[1], item[2], item[3] if item[3] != args.iterate else "")
run_adb_shell_cmd_as_root('rm /data/bootchart/enabled')
def dump_timings_points_summary(msg_header, timing_points, args):
averaged_timing_points = []
- for item in list(timing_points.items()):
+ for item in timing_points.items():
average = sum(item[1])/len(item[1])
std_dev = stddev(item[1])
averaged_timing_points.append((item[0], average, std_dev, len(item[1])))
- print("-----------------")
- print(msg_header + " timing in order, Avg time values after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
+ print "-----------------"
+ print msg_header + " timing in order, Avg time values after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
for item in averaged_timing_points:
- print('{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
- item[0], item[1], item[2], item[3] if item[3] != args.iterate else ""))
+ print '{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
+ item[0], item[1], item[2], item[3] if item[3] != args.iterate else "")
- print("-----------------")
- print(msg_header + " timing top items, Avg time values after {0} runs".format(args.iterate))
- print('{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs"))
+ print "-----------------"
+ print msg_header + " timing top items, Avg time values after {0} runs".format(args.iterate)
+ print '{0:30}: {1:<7} {2:<7} {3}'.format("Event", "Mean", "stddev", "#runs")
for item in sorted(averaged_timing_points, key=lambda entry: entry[1], reverse=True):
if item[1] < TIMING_THRESHOLD:
break
- print('{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
- item[0], item[1], item[2], item[3] if item[3] != args.iterate else ""))
+ print '{0:30}: {1:<7.5} {2:<7.5} {3}'.format(
+ item[0], item[1], item[2], item[3] if item[3] != args.iterate else "")
def capture_bugreport(bugreport_hint, boot_complete_time):
now = datetime.now()
bugreport_file = ("bugreport-%s-" + bugreport_hint + "-%s.zip") \
% (now.strftime("%Y-%m-%d-%H-%M-%S"), str(boot_complete_time))
- print("Boot up time too big, will capture bugreport %s" % (bugreport_file))
+ print "Boot up time too big, will capture bugreport %s" % (bugreport_file)
os.system(ADB_CMD + " bugreport " + bugreport_file)
def generate_timing_points(timing_events, timings):
timing_points = collections.OrderedDict()
monitor_contention_points = collections.OrderedDict()
- for k, l in timing_events.items():
+ for k, l in timing_events.iteritems():
for v in l:
- name, time_v = extract_timing(v, timings)
+ name, time_v, dict = extract_timing(v, timings)
if name and time_v:
if v.find("SystemServerTimingAsync") > 0:
name = "(" + name + ")"
@@ -271,34 +271,34 @@ def generate_timing_points(timing_events, timings):
return timing_points, monitor_contention_points
def dump_timing_points(msg_header, timing_points):
- print(msg_header + " event timing in time order, key: time")
- for item in list(timing_points.items()):
- print('{0:30}: {1:<7.5}'.format(item[0], item[1]))
- print("-----------------")
- print(msg_header + " event timing top items")
- for item in sorted(list(timing_points.items()), key=operator.itemgetter(1), reverse=True):
+ print msg_header + " event timing in time order, key: time"
+ for item in timing_points.items():
+ print '{0:30}: {1:<7.5}'.format(item[0], item[1])
+ print "-----------------"
+ print msg_header + " event timing top items"
+ for item in sorted(timing_points.items(), key=operator.itemgetter(1), reverse = True):
if item[1] < TIMING_THRESHOLD:
break
- print('{0:30}: {1:<7.5}'.format(
- item[0], item[1]))
- print("-----------------")
+ print '{0:30}: {1:<7.5}'.format(
+ item[0], item[1])
+ print "-----------------"
def dump_monitor_contentions(logcat_monitor_contentions):
- print("Monitor contentions over 100ms:")
- for item in list(logcat_monitor_contentions.items()):
+ print "Monitor contentions over 100ms:"
+ for item in logcat_monitor_contentions.items():
if item[1] > 100:
- print('{0:<7.5}ms: {1}'.format(item[1], item[0]))
- print("-----------------")
+ print '{0:<7.5}ms: {1}'.format(item[1], item[0])
+ print "-----------------"
def handle_reboot_log(capture_log_on_error, shutdown_events_pattern, components_to_monitor):
shutdown_events, shutdown_timing_events = collect_logcat_for_shutdown(capture_log_on_error,\
shutdown_events_pattern, components_to_monitor)
- print("\nshutdown events: time")
- for item in list(shutdown_events.items()):
- print('{0:30}: {1:<7.5}'.format(item[0], item[1]))
- print("\nshutdown timing events: time")
- for item in list(shutdown_timing_events.items()):
- print('{0:30}: {1:<7.5}'.format(item[0], item[1]))
+ print "\nshutdown events: time"
+ for item in shutdown_events.items():
+ print '{0:30}: {1:<7.5}'.format(item[0], item[1])
+ print "\nshutdown timing events: time"
+ for item in shutdown_timing_events.items():
+ print '{0:30}: {1:<7.5}'.format(item[0], item[1])
return shutdown_events, shutdown_timing_events
def iterate(args, search_events_pattern, timings_pattern, shutdown_events_pattern, cfg, error_time,\
@@ -308,7 +308,7 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
if args.reboot:
# sleep to make sure that logcat reader is reading before adb is gone by reboot. ugly but make
# impl simple.
- t = threading.Thread(target=lambda: (time.sleep(2), reboot(args.serial, args.stressfs != '',\
+ t = threading.Thread(target = lambda : (time.sleep(2), reboot(args.serial, args.stressfs != '',\
args.permissive, args.adb_reboot, args.buffersize)))
t.start()
shutdown_events, shutdown_timing_events = handle_reboot_log(True, shutdown_events_pattern,\
@@ -317,19 +317,24 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
dmesg_events, kernel_timing_events = collect_events(search_events_pattern, ADB_CMD +\
' shell su root dmesg -w', timings_pattern,\
- [KERNEL_BOOT_COMPLETE], True)
+ [ KERNEL_BOOT_COMPLETE ], True)
- logcat_stop_events = [LOGCAT_BOOT_COMPLETE, KERNEL_BOOT_COMPLETE, LAUNCHER_START]
+ logcat_stop_events = [ LOGCAT_BOOT_COMPLETE, KERNEL_BOOT_COMPLETE, LAUNCHER_START]
if args.fs_check:
logcat_stop_events.append("FsStat")
logcat_events, logcat_timing_events = collect_events(
search_events_pattern, ADB_CMD + ' logcat -b all -v epoch', timings_pattern,\
logcat_stop_events, False)
- logcat_event_time = extract_time(logcat_events, TIME_LOGCAT, float)
- logcat_original_time = extract_time(logcat_events, TIME_LOGCAT, str);
- dmesg_event_time = extract_time(dmesg_events, TIME_DMESG, float);
+ logcat_event_time = extract_time(
+ logcat_events, TIME_LOGCAT, float);
+ logcat_original_time = extract_time(
+ logcat_events, TIME_LOGCAT, str);
+ dmesg_event_time = extract_time(
+ dmesg_events, TIME_DMESG, float);
boottime_events = fetch_boottime_property()
events = {}
+ diff_time = 0
+ max_time = 0
events_to_correct = []
replaced_from_dmesg = set()
@@ -337,7 +342,7 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
time_correction_time = 0
if ('time_correction_key' in cfg
and cfg['time_correction_key'] in logcat_events):
- match = search_events_pattern[cfg['time_correction_key']].search(
+ match = search_events[cfg['time_correction_key']].search(
logcat_events[cfg['time_correction_key']])
if match and logcat_event_time[cfg['time_correction_key']]:
time_correction_delta = float(match.group(1))
@@ -346,14 +351,14 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
debug("time_correction_delta = {0}, time_correction_time = {1}".format(
time_correction_delta, time_correction_time))
- for k, v in logcat_event_time.items():
+ for k, v in logcat_event_time.iteritems():
if v <= time_correction_time:
logcat_event_time[k] += time_correction_delta
v = v + time_correction_delta
debug("correcting event to event[{0}, {1}]".format(k, v))
if logcat_event_time.get(KERNEL_TIME_KEY) is None:
- print("kernel time not captured in logcat, cannot get time diff")
+ print "kernel time not captured in logcat, cannot get time diff"
return None, None, None, None, None, None
diffs = []
diffs.append((logcat_event_time[KERNEL_TIME_KEY], logcat_event_time[KERNEL_TIME_KEY]))
@@ -362,13 +367,13 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
logcat_event_time[BOOT_ANIM_END_TIME_KEY] -\
dmesg_event_time[BOOT_ANIM_END_TIME_KEY]))
if not dmesg_event_time.get(KERNEL_BOOT_COMPLETE):
- print("BootAnimEnd time or BootComplete-kernel not captured in both log" +\
- ", cannot get time diff")
+ print "BootAnimEnd time or BootComplete-kernel not captured in both log" +\
+ ", cannot get time diff"
return None, None, None, None, None, None
diffs.append((logcat_event_time[LOGCAT_BOOT_COMPLETE],\
logcat_event_time[LOGCAT_BOOT_COMPLETE] - dmesg_event_time[KERNEL_BOOT_COMPLETE]))
- for k, v in logcat_event_time.items():
+ for k, v in logcat_event_time.iteritems():
debug("event[{0}, {1}]".format(k, v))
events[k] = v
if k in dmesg_event_time:
@@ -394,12 +399,12 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
data_points = collections.OrderedDict()
- print("-----------------")
- print("ro.boottime.*: time")
- for item in list(boottime_events.items()):
- print('{0:30}: {1:<7.5} {2}'.format(item[0], item[1],\
- "*time taken" if item[0].startswith("init.") else ""))
- print("-----------------")
+ print "-----------------"
+ print "ro.boottime.*: time"
+ for item in boottime_events.items():
+ print '{0:30}: {1:<7.5} {2}'.format(item[0], item[1],\
+ "*time taken" if item[0].startswith("init.") else "")
+ print "-----------------"
if args.timings:
kernel_timing_points, _ = generate_timing_points(kernel_timing_events, timings_pattern)
@@ -409,7 +414,7 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
dump_timing_points("Logcat", logcat_timing_points)
dump_monitor_contentions(logcat_monitor_contentions)
- for item in sorted(list(events.items()), key=operator.itemgetter(1)):
+ for item in sorted(events.items(), key=operator.itemgetter(1)):
data_points[item[0]] = {
'value': item[1],
'from_dmesg': item[0] in replaced_from_dmesg,
@@ -430,16 +435,16 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
'from_dmesg': False,
'logcat_value': 0.0
}
- for k, v in data_points.items():
- print('{0:30}: {1:<7.5} {2:1} ({3})'.format(
- k, v['value'], '*' if v['from_dmesg'] else '', v['logcat_value']))
+ for k, v in data_points.iteritems():
+ print '{0:30}: {1:<7.5} {2:1} ({3})'.format(
+ k, v['value'], '*' if v['from_dmesg'] else '', v['logcat_value'])
- print('\n* - event time was obtained from dmesg log\n')
+ print '\n* - event time was obtained from dmesg log\n'
if events[LOGCAT_BOOT_COMPLETE] > error_time and not args.ignore:
capture_bugreport("bootuptoolong", events[LOGCAT_BOOT_COMPLETE])
- for k, v in components_to_monitor.items():
+ for k, v in components_to_monitor.iteritems():
logcat_value_measured = logcat_timing_points.get(k)
kernel_value_measured = kernel_timing_points.get(k)
data_from_data_points = data_points.get(k)
@@ -460,7 +465,7 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
m = re.search(fs_stat_pattern, logcat_events.get("FsStat"))
if m:
fs_stat = m.group(1)
- print('fs_stat:', fs_stat)
+ print 'fs_stat:', fs_stat
if fs_stat:
fs_stat_val = int(fs_stat, 0)
@@ -472,14 +477,14 @@ def iterate(args, search_events_pattern, timings_pattern, shutdown_events_patter
def debug(string):
if DEBUG:
- print(string)
+ print string
def extract_timing(s, patterns):
- for _, p in patterns.items():
+ for k, p in patterns.iteritems():
m = p.search(s)
if m:
- timing_dict = m.groupdict()
- return timing_dict['name'], float(timing_dict['time'])
+ dict = m.groupdict()
+ return dict['name'], float(dict['time']), dict
return None, None
def init_arguments():
@@ -547,14 +552,14 @@ def handle_zygote_event(zygote_pids, events, event, line):
zygote_pids.append(secondary_pid)
if pid == primary_pid: # old one was secondary:
move_to_secondary = []
- for k, l in events.items():
+ for k, l in events.iteritems():
if k.startswith("zygote"):
move_to_secondary.append((k, l))
for item in move_to_secondary:
del events[item[0]]
if item[0].endswith("-secondary"):
- print("Secondary already exists for event %s while found new pid %d, primary %d "\
- % (item[0], secondary_pid, primary_pid))
+ print "Secondary already exists for event %s while found new pid %d, primary %d "\
+ % (item[0], secondary_pid, primary_pid)
else:
events[item[0] + "-secondary"] = item[1]
else:
@@ -579,22 +584,21 @@ def collect_logcat_for_shutdown(capture_log_on_error, shutdown_events_pattern,\
# shutdown does not have timing_events but calculated from checking Xyz - XyzDone / XyzTimeout
timing_events = collections.OrderedDict()
process = subprocess.Popen(ADB_CMD + ' logcat -b all -v epoch', shell=True,
- stdout=subprocess.PIPE)
+ stdout=subprocess.PIPE);
lines = []
capture_log = False
shutdown_start_time = 0
- while True:
- line = process.stdout.readline()
+ while (True):
+ line = process.stdout.readline().lstrip().rstrip()
if not line:
break
- line = line.decode('utf-8', 'ignore').lstrip().rstrip()
lines.append(line)
- event = get_boot_event(line, shutdown_events_pattern)
+ event = get_boot_event(line, shutdown_events_pattern);
if not event:
continue
time = extract_a_time(line, TIME_LOGCAT, float)
if time is None:
- print("cannot get time from: " + line)
+ print "cannot get time from: " + line
continue
if shutdown_start_time == 0:
shutdown_start_time = time
@@ -605,7 +609,7 @@ def collect_logcat_for_shutdown(capture_log_on_error, shutdown_events_pattern,\
capture_log = True
pair_event = None
if event.endswith('Done'):
- pair_event = event[:-4]
+ pair_event = event[:-4]
elif event.endswith('Timeout'):
pair_event = event[:-7]
if capture_log_on_error:
@@ -614,7 +618,7 @@ def collect_logcat_for_shutdown(capture_log_on_error, shutdown_events_pattern,\
continue
start_time = events.get(pair_event)
if not start_time:
- print("No start event for " + event)
+ print "No start event for " + event
continue
time_spent = time - start_time
timing_event_name = pair_event + "Duration"
@@ -626,7 +630,7 @@ def collect_logcat_for_shutdown(capture_log_on_error, shutdown_events_pattern,\
if capture_log:
now = datetime.now()
log_file = ("shutdownlog-error-%s.txt") % (now.strftime("%Y-%m-%d-%H-%M-%S"))
- print("Shutdown error, capture log to %s" % (log_file))
+ print "Shutdown error, capture log to %s" % (log_file)
with open(log_file, 'w') as f:
f.write('\n'.join(lines))
return events, timing_events
@@ -635,7 +639,8 @@ def collect_logcat_for_shutdown(capture_log_on_error, shutdown_events_pattern,\
def collect_events(search_events, command, timings, stop_events, disable_timing_after_zygote):
events = collections.OrderedDict()
timing_events = {}
- process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
+ process = subprocess.Popen(command, shell=True,
+ stdout=subprocess.PIPE);
data_available = stop_events is None
zygote_pids = []
start_time = time.time()
@@ -647,18 +652,18 @@ def collect_events(search_events, command, timings, stop_events, disable_timing_
while True:
time_left = start_time + max_wait_time - time.time()
if time_left <= 0:
- print("timeout waiting for event, continue", time_left)
+ print "timeout waiting for event, continue", time_left
break
read_r = read_poll.poll(time_left * 1000.0)
if len(read_r) > 0 and read_r[0][1] == select.POLLIN:
- line = process.stdout.readline().decode('utf-8', 'ignore')
+ line = process.stdout.readline()
else:
- print("poll timeout waiting for event, continue", time_left)
+ print "poll timeout waiting for event, continue", time_left
break
if not data_available:
- print("Collecting data samples from '%s'. Please wait...\n" % command)
+ print "Collecting data samples from '%s'. Please wait...\n" % command
data_available = True
- event = get_boot_event(line, search_events)
+ event = get_boot_event(line, search_events);
if event:
debug("event[{0}] captured: {1}".format(event, line))
if event == "starting_zygote":
@@ -671,11 +676,11 @@ def collect_events(search_events, command, timings, stop_events, disable_timing_
events[new_event] = line
if event in stop_events:
stop_events.remove(event)
- print("remaining stop_events:", stop_events)
+ print "remaining stop_events:", stop_events
if len(stop_events) == 0:
- break
+ break;
- timing_event = get_boot_event(line, timings)
+ timing_event = get_boot_event(line, timings);
if timing_event and (not disable_timing_after_zygote or not zygote_found):
if timing_event not in timing_events:
timing_events[timing_event] = []
@@ -688,13 +693,13 @@ def collect_events(search_events, command, timings, stop_events, disable_timing_
def fetch_boottime_property():
cmd = ADB_CMD + ' shell su root getprop'
events = {}
- process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+ process = subprocess.Popen(cmd, shell=True,
+ stdout=subprocess.PIPE);
out = process.stdout
pattern = re.compile(BOOT_PROP)
pattern_bootloader = re.compile(BOOTLOADER_TIME_PROP)
bootloader_time = 0.0
for line in out:
- line = line.decode('utf-8', 'ignore')
match = pattern.match(line)
if match:
if match.group(1).startswith("init."):
@@ -712,14 +717,14 @@ def fetch_boottime_property():
bootloader_time = bootloader_time + time_spent
ordered_event = collections.OrderedDict()
if bootloader_time != 0.0:
- ordered_event["bootloader"] = bootloader_time
- for item in sorted(list(events.items()), key=operator.itemgetter(1)):
+ ordered_event["bootloader"] = bootloader_time;
+ for item in sorted(events.items(), key=operator.itemgetter(1)):
ordered_event[item[0]] = item[1]
return ordered_event
def get_boot_event(line, events):
- for event_key, event_pattern in events.items():
+ for event_key, event_pattern in events.iteritems():
if event_pattern.search(line):
return event_key
return None
@@ -733,27 +738,27 @@ def extract_a_time(line, pattern, date_transform_function):
def extract_time(events, pattern, date_transform_function):
result = collections.OrderedDict()
- for event, data in events.items():
+ for event, data in events.iteritems():
time = extract_a_time(data, pattern, date_transform_function)
if time is not None:
result[event] = time
else:
- print("Failed to find time for event: ", event, data)
+ print "Failed to find time for event: ", event, data
return result
def do_reboot(serial, use_adb_reboot):
original_devices = subprocess.check_output("adb devices", shell=True)
if use_adb_reboot:
- print('Rebooting the device using adb reboot')
+ print 'Rebooting the device using adb reboot'
run_adb_cmd('reboot')
else:
- print('Rebooting the device using svc power reboot')
+ print 'Rebooting the device using svc power reboot'
run_adb_shell_cmd_as_root('svc power reboot')
# Wait for the device to go away
retry = 0
while retry < 20:
- current_devices = subprocess.check_output("adb devices", shell=True).decode('utf-8', 'ignore')
+ current_devices = subprocess.check_output("adb devices", shell=True)
if original_devices != current_devices:
if not serial or (serial and current_devices.find(serial) < 0):
return True
@@ -763,7 +768,7 @@ def do_reboot(serial, use_adb_reboot):
def reboot(serial, use_stressfs, permissive, use_adb_reboot, adb_buffersize=None):
if use_stressfs:
- print('Starting write to data partition')
+ print 'Starting write to data partition'
run_adb_shell_cmd('am start' +\
' -n com.android.car.test.stressfs/.WritingActivity' +\
' -a com.android.car.test.stressfs.START')
@@ -778,7 +783,7 @@ def reboot(serial, use_stressfs, permissive, use_adb_reboot, adb_buffersize=None
break
retry += 1
- print('Waiting the device')
+ print 'Waiting the device'
run_adb_cmd('wait-for-device')
if adb_buffersize is not None:
@@ -813,8 +818,8 @@ def stddev(data):
return math.sqrt(variance)
def grab_bootchart(boot_chart_file_name):
- subprocess.call("$ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh", shell=True)
- print("Saving boot chart as " + boot_chart_file_name + ".tgz")
+ subprocess.call("./system/core/init/grab-bootchart.sh", shell=True)
+ print "Saving boot chart as " + boot_chart_file_name + ".tgz"
subprocess.call('cp /tmp/android-bootchart/bootchart.tgz ./' + boot_chart_file_name + '.tgz',\
shell=True)
subprocess.call('cp ./bootchart.png ./' + boot_chart_file_name + '.png', shell=True)
@@ -825,7 +830,7 @@ def grab_systrace(systrace_file_name):
f.write("TRACE:\n")
run_adb_shell_cmd_as_root("cat /d/tracing/trace >> " + trace_file)
html_file = systrace_file_name + ".html"
- subprocess.call("$ANDROID_BUILD_TOP/external/chromium-trace/systrace.py --from-file=" + trace_file + " -o " +\
+ subprocess.call("./external/chromium-trace/systrace.py --from-file=" + trace_file + " -o " +\
html_file, shell=True)
if __name__ == '__main__':