Path: blob/master/AndroidRunner/Plugins/garbagecollection/Garbagecollection.py
907 views
import os.path as op1import os2import time3import csv45from AndroidRunner.Plugins.Profiler import Profiler678class ConfigError(Exception):9pass101112class Garbagecollection(Profiler):13def __init__(self, config, paths):14super(Garbagecollection, self).__init__(config, paths)15self.output_dir = ''16self.logcat_output = ''17self.profile = False1819def start_profiling(self, device, **kwargs):20self.profile = True21self.logcat_output = '{}logcat_{}_{}.txt'.format(self.output_dir, device.id, time.strftime('%Y.%m.%d_%H%M%S'))2223def stop_profiling(self, device, **kwargs):24self.profile = False2526def collect_results(self, device, path=None):27device.shell('logcat -f /mnt/sdcard/logcat.txt -d')2829if 'error' in device.pull('/mnt/sdcard/logcat.txt', self.logcat_output).decode():30self.logger.critical('Failed to pull logcat log file from the device which makes it impossible to gather GC calls.')31return3233device.shell('rm -f /mnt/sdcard/logcat.txt')3435collections_filename = 'collections_{}_{}.csv'.format(device.id, time.strftime('%Y.%m.%d_%H%M%S'))36total_filename = 'total_{}_{}.csv'.format(device.id, time.strftime('%Y.%m.%d_%H%M%S'))37collections_count = 03839with open(self.logcat_output) as logcat:40with open(op.join(self.output_dir, collections_filename), 'w+') as output:41lines = logcat.readlines()42for i, line in enumerate(lines):43if 'GC freed' in line and 'AllocSpace objects,' in line:44output.write(line)45collections_count += 146with open(op.join(self.output_dir, total_filename), 'a') as output:47writer = csv.writer(output)48writer.writerow(['garbage_collection_count'])49writer.writerow([collections_count])50os.remove(self.logcat_output)5152def set_output(self, output_dir):53self.output_dir = output_dir5455def dependencies(self):56return []5758def load(self, device):59return6061def unload(self, device):62return6364def aggregate_subject(self):65with open(op.join(self.output_dir, 'all_garbage_collection_counts.csv'), 'w+') as output:66writer = csv.writer(output)67writer.writerow(['delayed_frames'])68for output_file in os.listdir(self.output_dir):69if output_file.startswith("total"):70writer.writerow([int(open(op.join(self.output_dir, output_file)).readlines()[1])])7172def aggregate_end(self, data_dir, output_file):73return7475def aggregate_final(self, data_dir):76return777879