Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
S2-group
GitHub Repository: S2-group/android-runner
Path: blob/master/AndroidRunner/Plugins/garbagecollection/Garbagecollection.py
907 views
1
import os.path as op
2
import os
3
import time
4
import csv
5
6
from AndroidRunner.Plugins.Profiler import Profiler
7
8
9
class ConfigError(Exception):
10
pass
11
12
13
class Garbagecollection(Profiler):
14
def __init__(self, config, paths):
15
super(Garbagecollection, self).__init__(config, paths)
16
self.output_dir = ''
17
self.logcat_output = ''
18
self.profile = False
19
20
def start_profiling(self, device, **kwargs):
21
self.profile = True
22
self.logcat_output = '{}logcat_{}_{}.txt'.format(self.output_dir, device.id, time.strftime('%Y.%m.%d_%H%M%S'))
23
24
def stop_profiling(self, device, **kwargs):
25
self.profile = False
26
27
def collect_results(self, device, path=None):
28
device.shell('logcat -f /mnt/sdcard/logcat.txt -d')
29
30
if 'error' in device.pull('/mnt/sdcard/logcat.txt', self.logcat_output).decode():
31
self.logger.critical('Failed to pull logcat log file from the device which makes it impossible to gather GC calls.')
32
return
33
34
device.shell('rm -f /mnt/sdcard/logcat.txt')
35
36
collections_filename = 'collections_{}_{}.csv'.format(device.id, time.strftime('%Y.%m.%d_%H%M%S'))
37
total_filename = 'total_{}_{}.csv'.format(device.id, time.strftime('%Y.%m.%d_%H%M%S'))
38
collections_count = 0
39
40
with open(self.logcat_output) as logcat:
41
with open(op.join(self.output_dir, collections_filename), 'w+') as output:
42
lines = logcat.readlines()
43
for i, line in enumerate(lines):
44
if 'GC freed' in line and 'AllocSpace objects,' in line:
45
output.write(line)
46
collections_count += 1
47
with open(op.join(self.output_dir, total_filename), 'a') as output:
48
writer = csv.writer(output)
49
writer.writerow(['garbage_collection_count'])
50
writer.writerow([collections_count])
51
os.remove(self.logcat_output)
52
53
def set_output(self, output_dir):
54
self.output_dir = output_dir
55
56
def dependencies(self):
57
return []
58
59
def load(self, device):
60
return
61
62
def unload(self, device):
63
return
64
65
def aggregate_subject(self):
66
with open(op.join(self.output_dir, 'all_garbage_collection_counts.csv'), 'w+') as output:
67
writer = csv.writer(output)
68
writer.writerow(['delayed_frames'])
69
for output_file in os.listdir(self.output_dir):
70
if output_file.startswith("total"):
71
writer.writerow([int(open(op.join(self.output_dir, output_file)).readlines()[1])])
72
73
def aggregate_end(self, data_dir, output_file):
74
return
75
76
def aggregate_final(self, data_dir):
77
return
78
79