1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker# 4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker# 8*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker# 10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker 16*6dbdd20aSAndroid Build Coastguard Workerimport argparse 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard Workerfrom collections import namedtuple 19*6dbdd20aSAndroid Build Coastguard Workerfrom google.protobuf import descriptor_pb2, message_factory, descriptor_pool 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard WorkerCLONE_THREAD = 0x00010000 22*6dbdd20aSAndroid Build Coastguard WorkerCLONE_VFORK = 0x00004000 23*6dbdd20aSAndroid Build Coastguard WorkerCLONE_VM = 0x00000100 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker# For compatibility with older pb module versions. 27*6dbdd20aSAndroid Build Coastguard Workerdef get_message_class(pool, msg): 28*6dbdd20aSAndroid Build Coastguard Worker if hasattr(message_factory, "GetMessageClass"): 29*6dbdd20aSAndroid Build Coastguard Worker return message_factory.GetMessageClass(msg) 30*6dbdd20aSAndroid Build Coastguard Worker else: 31*6dbdd20aSAndroid Build Coastguard Worker return message_factory.MessageFactory(pool).GetPrototype(msg) 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Workerdef ms_to_ns(time_in_ms): 35*6dbdd20aSAndroid Build Coastguard Worker return int(time_in_ms * 1000000) 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker 38*6dbdd20aSAndroid Build Coastguard Workerdef s_to_ns(time_in_s): 39*6dbdd20aSAndroid Build Coastguard Worker return int(time_in_s * 1000000000) 40*6dbdd20aSAndroid Build Coastguard Worker 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Workerclass Trace(object): 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard Worker def __init__(self, trace, prototypes): 45*6dbdd20aSAndroid Build Coastguard Worker self.trace = trace 46*6dbdd20aSAndroid Build Coastguard Worker self.prototypes = prototypes 47*6dbdd20aSAndroid Build Coastguard Worker self.proc_map = {} 48*6dbdd20aSAndroid Build Coastguard Worker self.proc_map[0] = 'idle_thread' 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard Worker def add_system_info(self, arch="", fingerprint=""): 51*6dbdd20aSAndroid Build Coastguard Worker self.packet = self.trace.packet.add() 52*6dbdd20aSAndroid Build Coastguard Worker self.packet.system_info.utsname.machine = arch 53*6dbdd20aSAndroid Build Coastguard Worker self.packet.system_info.android_build_fingerprint = fingerprint 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker def add_ftrace_packet(self, cpu): 56*6dbdd20aSAndroid Build Coastguard Worker self.packet = self.trace.packet.add() 57*6dbdd20aSAndroid Build Coastguard Worker self.packet.ftrace_events.cpu = cpu 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker def add_packet(self, ts=None): 60*6dbdd20aSAndroid Build Coastguard Worker self.packet = self.trace.packet.add() 61*6dbdd20aSAndroid Build Coastguard Worker if ts is not None: 62*6dbdd20aSAndroid Build Coastguard Worker self.packet.timestamp = ts 63*6dbdd20aSAndroid Build Coastguard Worker return self.packet 64*6dbdd20aSAndroid Build Coastguard Worker 65*6dbdd20aSAndroid Build Coastguard Worker def __add_ftrace_event(self, ts, tid): 66*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.packet.ftrace_events.event.add() 67*6dbdd20aSAndroid Build Coastguard Worker ftrace.timestamp = ts 68*6dbdd20aSAndroid Build Coastguard Worker ftrace.pid = tid 69*6dbdd20aSAndroid Build Coastguard Worker return ftrace 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker def add_rss_stat(self, ts, tid, member, size, mm_id=None, curr=None): 72*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 73*6dbdd20aSAndroid Build Coastguard Worker rss_stat = ftrace.rss_stat 74*6dbdd20aSAndroid Build Coastguard Worker rss_stat.member = member 75*6dbdd20aSAndroid Build Coastguard Worker rss_stat.size = size 76*6dbdd20aSAndroid Build Coastguard Worker if mm_id is not None: 77*6dbdd20aSAndroid Build Coastguard Worker rss_stat.mm_id = mm_id 78*6dbdd20aSAndroid Build Coastguard Worker if curr is not None: 79*6dbdd20aSAndroid Build Coastguard Worker rss_stat.curr = curr 80*6dbdd20aSAndroid Build Coastguard Worker 81*6dbdd20aSAndroid Build Coastguard Worker def add_ion_event(self, ts, tid, heap_name, len, size=0): 82*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 83*6dbdd20aSAndroid Build Coastguard Worker ion = ftrace.ion_heap_grow 84*6dbdd20aSAndroid Build Coastguard Worker ion.heap_name = heap_name 85*6dbdd20aSAndroid Build Coastguard Worker ion.len = len 86*6dbdd20aSAndroid Build Coastguard Worker ion.total_allocated = size 87*6dbdd20aSAndroid Build Coastguard Worker 88*6dbdd20aSAndroid Build Coastguard Worker def add_oom_score_update(self, ts, oom_score_adj, pid): 89*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, pid) 90*6dbdd20aSAndroid Build Coastguard Worker oom_score = ftrace.oom_score_adj_update 91*6dbdd20aSAndroid Build Coastguard Worker oom_score.comm = self.proc_map[pid] 92*6dbdd20aSAndroid Build Coastguard Worker oom_score.oom_score_adj = oom_score_adj 93*6dbdd20aSAndroid Build Coastguard Worker oom_score.pid = pid 94*6dbdd20aSAndroid Build Coastguard Worker 95*6dbdd20aSAndroid Build Coastguard Worker def add_sched(self, 96*6dbdd20aSAndroid Build Coastguard Worker ts, 97*6dbdd20aSAndroid Build Coastguard Worker prev_pid, 98*6dbdd20aSAndroid Build Coastguard Worker next_pid, 99*6dbdd20aSAndroid Build Coastguard Worker prev_comm=None, 100*6dbdd20aSAndroid Build Coastguard Worker next_comm=None, 101*6dbdd20aSAndroid Build Coastguard Worker prev_state=None): 102*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, 0) 103*6dbdd20aSAndroid Build Coastguard Worker ss = ftrace.sched_switch 104*6dbdd20aSAndroid Build Coastguard Worker ss.prev_comm = prev_comm or self.proc_map[prev_pid] 105*6dbdd20aSAndroid Build Coastguard Worker ss.prev_pid = prev_pid 106*6dbdd20aSAndroid Build Coastguard Worker ss.next_pid = next_pid 107*6dbdd20aSAndroid Build Coastguard Worker ss.next_comm = next_comm or self.proc_map[next_pid] 108*6dbdd20aSAndroid Build Coastguard Worker if prev_state: 109*6dbdd20aSAndroid Build Coastguard Worker if prev_state == 'R': 110*6dbdd20aSAndroid Build Coastguard Worker ss.prev_state = 0 111*6dbdd20aSAndroid Build Coastguard Worker elif prev_state == 'S': 112*6dbdd20aSAndroid Build Coastguard Worker ss.prev_state = 1 113*6dbdd20aSAndroid Build Coastguard Worker elif prev_state == 'U' or prev_state == 'D': 114*6dbdd20aSAndroid Build Coastguard Worker ss.prev_state = 2 115*6dbdd20aSAndroid Build Coastguard Worker else: 116*6dbdd20aSAndroid Build Coastguard Worker raise Exception('Invalid prev state {}'.format(prev_state)) 117*6dbdd20aSAndroid Build Coastguard Worker 118*6dbdd20aSAndroid Build Coastguard Worker def add_cpufreq(self, ts, freq, cpu): 119*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, 0) 120*6dbdd20aSAndroid Build Coastguard Worker cpufreq = ftrace.cpu_frequency 121*6dbdd20aSAndroid Build Coastguard Worker cpufreq.state = freq 122*6dbdd20aSAndroid Build Coastguard Worker cpufreq.cpu_id = cpu 123*6dbdd20aSAndroid Build Coastguard Worker 124*6dbdd20aSAndroid Build Coastguard Worker def add_kernel_lmk(self, ts, tid): 125*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 126*6dbdd20aSAndroid Build Coastguard Worker lowmemory_kill = ftrace.lowmemory_kill 127*6dbdd20aSAndroid Build Coastguard Worker lowmemory_kill.pid = tid 128*6dbdd20aSAndroid Build Coastguard Worker 129*6dbdd20aSAndroid Build Coastguard Worker def add_sys_enter(self, ts, tid, id): 130*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 131*6dbdd20aSAndroid Build Coastguard Worker sys_enter = ftrace.sys_enter 132*6dbdd20aSAndroid Build Coastguard Worker sys_enter.id = id 133*6dbdd20aSAndroid Build Coastguard Worker 134*6dbdd20aSAndroid Build Coastguard Worker def add_sys_exit(self, ts, tid, id, ret): 135*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 136*6dbdd20aSAndroid Build Coastguard Worker sys_exit = ftrace.sys_exit 137*6dbdd20aSAndroid Build Coastguard Worker sys_exit.id = id 138*6dbdd20aSAndroid Build Coastguard Worker sys_exit.ret = ret 139*6dbdd20aSAndroid Build Coastguard Worker 140*6dbdd20aSAndroid Build Coastguard Worker def add_newtask(self, ts, tid, new_tid, new_comm, flags): 141*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 142*6dbdd20aSAndroid Build Coastguard Worker newtask = ftrace.task_newtask 143*6dbdd20aSAndroid Build Coastguard Worker newtask.pid = new_tid 144*6dbdd20aSAndroid Build Coastguard Worker newtask.comm = new_comm 145*6dbdd20aSAndroid Build Coastguard Worker newtask.clone_flags = flags 146*6dbdd20aSAndroid Build Coastguard Worker 147*6dbdd20aSAndroid Build Coastguard Worker def add_process_free(self, ts, tid, comm, prio): 148*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 149*6dbdd20aSAndroid Build Coastguard Worker sched_process_free = ftrace.sched_process_free 150*6dbdd20aSAndroid Build Coastguard Worker sched_process_free.pid = tid 151*6dbdd20aSAndroid Build Coastguard Worker sched_process_free.comm = comm 152*6dbdd20aSAndroid Build Coastguard Worker sched_process_free.prio = prio 153*6dbdd20aSAndroid Build Coastguard Worker 154*6dbdd20aSAndroid Build Coastguard Worker def add_rename(self, ts, tid, old_comm, new_comm, oom_score_adj): 155*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 156*6dbdd20aSAndroid Build Coastguard Worker task_rename = ftrace.task_rename 157*6dbdd20aSAndroid Build Coastguard Worker task_rename.pid = tid 158*6dbdd20aSAndroid Build Coastguard Worker task_rename.oldcomm = old_comm 159*6dbdd20aSAndroid Build Coastguard Worker task_rename.newcomm = new_comm 160*6dbdd20aSAndroid Build Coastguard Worker task_rename.oom_score_adj = oom_score_adj 161*6dbdd20aSAndroid Build Coastguard Worker 162*6dbdd20aSAndroid Build Coastguard Worker def add_print(self, ts, tid, buf): 163*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 164*6dbdd20aSAndroid Build Coastguard Worker print_event = getattr(ftrace, 'print') 165*6dbdd20aSAndroid Build Coastguard Worker print_event.buf = buf 166*6dbdd20aSAndroid Build Coastguard Worker 167*6dbdd20aSAndroid Build Coastguard Worker def add_kmalloc(self, ts, tid, bytes_alloc, bytes_req, call_site, gfp_flags, 168*6dbdd20aSAndroid Build Coastguard Worker ptr): 169*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 170*6dbdd20aSAndroid Build Coastguard Worker kmalloc = ftrace.kmalloc 171*6dbdd20aSAndroid Build Coastguard Worker kmalloc.bytes_alloc = bytes_alloc 172*6dbdd20aSAndroid Build Coastguard Worker kmalloc.bytes_req = bytes_req 173*6dbdd20aSAndroid Build Coastguard Worker kmalloc.call_site = call_site 174*6dbdd20aSAndroid Build Coastguard Worker kmalloc.gfp_flags = gfp_flags 175*6dbdd20aSAndroid Build Coastguard Worker kmalloc.ptr = ptr 176*6dbdd20aSAndroid Build Coastguard Worker 177*6dbdd20aSAndroid Build Coastguard Worker def add_kfree(self, ts, tid, call_site, ptr): 178*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, tid) 179*6dbdd20aSAndroid Build Coastguard Worker kfree = ftrace.kfree 180*6dbdd20aSAndroid Build Coastguard Worker kfree.call_site = call_site 181*6dbdd20aSAndroid Build Coastguard Worker kfree.ptr = ptr 182*6dbdd20aSAndroid Build Coastguard Worker 183*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_counter(self, ts, pid, tid, buf, cnt): 184*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'C|{}|{}|{}'.format(pid, buf, cnt)) 185*6dbdd20aSAndroid Build Coastguard Worker 186*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_begin(self, ts, tid, pid, buf): 187*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'B|{}|{}'.format(pid, buf)) 188*6dbdd20aSAndroid Build Coastguard Worker 189*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_end(self, ts, tid, pid): 190*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'E|{}'.format(pid)) 191*6dbdd20aSAndroid Build Coastguard Worker 192*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_async_begin(self, ts, tid, pid, buf): 193*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'S|{}|{}|0'.format(pid, buf)) 194*6dbdd20aSAndroid Build Coastguard Worker 195*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_async_end(self, ts, tid, pid, buf): 196*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'F|{}|{}|0'.format(pid, buf)) 197*6dbdd20aSAndroid Build Coastguard Worker 198*6dbdd20aSAndroid Build Coastguard Worker def add_atrace_instant(self, ts, tid, pid, buf): 199*6dbdd20aSAndroid Build Coastguard Worker self.add_print(ts, tid, 'I|{}|{}'.format(pid, buf)) 200*6dbdd20aSAndroid Build Coastguard Worker 201*6dbdd20aSAndroid Build Coastguard Worker def add_process(self, pid, ppid, cmdline, uid=None): 202*6dbdd20aSAndroid Build Coastguard Worker process = self.packet.process_tree.processes.add() 203*6dbdd20aSAndroid Build Coastguard Worker process.pid = pid 204*6dbdd20aSAndroid Build Coastguard Worker process.ppid = ppid 205*6dbdd20aSAndroid Build Coastguard Worker process.cmdline.append(cmdline) 206*6dbdd20aSAndroid Build Coastguard Worker if uid is not None: 207*6dbdd20aSAndroid Build Coastguard Worker process.uid = uid 208*6dbdd20aSAndroid Build Coastguard Worker self.proc_map[pid] = cmdline 209*6dbdd20aSAndroid Build Coastguard Worker 210*6dbdd20aSAndroid Build Coastguard Worker def add_thread(self, tid, tgid, cmdline, name=None): 211*6dbdd20aSAndroid Build Coastguard Worker thread = self.packet.process_tree.threads.add() 212*6dbdd20aSAndroid Build Coastguard Worker thread.tid = tid 213*6dbdd20aSAndroid Build Coastguard Worker thread.tgid = tgid 214*6dbdd20aSAndroid Build Coastguard Worker if name is not None: 215*6dbdd20aSAndroid Build Coastguard Worker thread.name = name 216*6dbdd20aSAndroid Build Coastguard Worker self.proc_map[tid] = cmdline 217*6dbdd20aSAndroid Build Coastguard Worker 218*6dbdd20aSAndroid Build Coastguard Worker def add_battery_counters(self, ts, charge_uah, cap_prct, curr_ua, curr_avg_ua, 219*6dbdd20aSAndroid Build Coastguard Worker voltage_uv): 220*6dbdd20aSAndroid Build Coastguard Worker self.packet = self.trace.packet.add() 221*6dbdd20aSAndroid Build Coastguard Worker self.packet.timestamp = ts 222*6dbdd20aSAndroid Build Coastguard Worker battery_count = self.packet.battery 223*6dbdd20aSAndroid Build Coastguard Worker battery_count.charge_counter_uah = charge_uah 224*6dbdd20aSAndroid Build Coastguard Worker battery_count.capacity_percent = cap_prct 225*6dbdd20aSAndroid Build Coastguard Worker battery_count.current_ua = curr_ua 226*6dbdd20aSAndroid Build Coastguard Worker battery_count.current_avg_ua = curr_avg_ua 227*6dbdd20aSAndroid Build Coastguard Worker battery_count.voltage_uv = voltage_uv 228*6dbdd20aSAndroid Build Coastguard Worker 229*6dbdd20aSAndroid Build Coastguard Worker def add_binder_transaction(self, transaction_id, ts_start, ts_end, tid, pid, 230*6dbdd20aSAndroid Build Coastguard Worker reply_id, reply_ts_start, reply_ts_end, reply_tid, 231*6dbdd20aSAndroid Build Coastguard Worker reply_pid): 232*6dbdd20aSAndroid Build Coastguard Worker # Binder transaction start. 233*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts_start, tid) 234*6dbdd20aSAndroid Build Coastguard Worker binder_transaction = ftrace.binder_transaction 235*6dbdd20aSAndroid Build Coastguard Worker binder_transaction.debug_id = transaction_id 236*6dbdd20aSAndroid Build Coastguard Worker binder_transaction.to_proc = reply_pid 237*6dbdd20aSAndroid Build Coastguard Worker binder_transaction.to_thread = reply_tid 238*6dbdd20aSAndroid Build Coastguard Worker binder_transaction.reply = False 239*6dbdd20aSAndroid Build Coastguard Worker 240*6dbdd20aSAndroid Build Coastguard Worker # Binder reply start 241*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(reply_ts_start, reply_tid) 242*6dbdd20aSAndroid Build Coastguard Worker binder_transaction_received = ftrace.binder_transaction_received 243*6dbdd20aSAndroid Build Coastguard Worker binder_transaction_received.debug_id = transaction_id 244*6dbdd20aSAndroid Build Coastguard Worker 245*6dbdd20aSAndroid Build Coastguard Worker # Binder reply finish 246*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(reply_ts_end, reply_tid) 247*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction = ftrace.binder_transaction 248*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction.debug_id = reply_id 249*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction.to_proc = pid 250*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction.to_thread = tid 251*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction.reply = True 252*6dbdd20aSAndroid Build Coastguard Worker 253*6dbdd20aSAndroid Build Coastguard Worker # Binder transaction finish 254*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts_end, tid) 255*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction_received = ftrace.binder_transaction_received 256*6dbdd20aSAndroid Build Coastguard Worker reply_binder_transaction_received.debug_id = reply_id 257*6dbdd20aSAndroid Build Coastguard Worker 258*6dbdd20aSAndroid Build Coastguard Worker def add_battery_counters_no_curr_ua(self, ts, charge_uah, cap_prct, 259*6dbdd20aSAndroid Build Coastguard Worker curr_avg_ua, voltage_uv): 260*6dbdd20aSAndroid Build Coastguard Worker self.packet = self.trace.packet.add() 261*6dbdd20aSAndroid Build Coastguard Worker self.packet.timestamp = ts 262*6dbdd20aSAndroid Build Coastguard Worker battery_count = self.packet.battery 263*6dbdd20aSAndroid Build Coastguard Worker battery_count.charge_counter_uah = charge_uah 264*6dbdd20aSAndroid Build Coastguard Worker battery_count.capacity_percent = cap_prct 265*6dbdd20aSAndroid Build Coastguard Worker battery_count.current_avg_ua = curr_avg_ua 266*6dbdd20aSAndroid Build Coastguard Worker battery_count.voltage_uv = voltage_uv 267*6dbdd20aSAndroid Build Coastguard Worker 268*6dbdd20aSAndroid Build Coastguard Worker def add_power_rails_desc(self, index_val, name): 269*6dbdd20aSAndroid Build Coastguard Worker power_rails = self.packet.power_rails 270*6dbdd20aSAndroid Build Coastguard Worker descriptor = power_rails.rail_descriptor.add() 271*6dbdd20aSAndroid Build Coastguard Worker descriptor.index = index_val 272*6dbdd20aSAndroid Build Coastguard Worker descriptor.rail_name = name 273*6dbdd20aSAndroid Build Coastguard Worker 274*6dbdd20aSAndroid Build Coastguard Worker def add_power_rails_data(self, ts, index_val, value): 275*6dbdd20aSAndroid Build Coastguard Worker power_rails = self.packet.power_rails 276*6dbdd20aSAndroid Build Coastguard Worker energy_data = power_rails.energy_data.add() 277*6dbdd20aSAndroid Build Coastguard Worker energy_data.index = index_val 278*6dbdd20aSAndroid Build Coastguard Worker energy_data.timestamp_ms = ts 279*6dbdd20aSAndroid Build Coastguard Worker energy_data.energy = value 280*6dbdd20aSAndroid Build Coastguard Worker 281*6dbdd20aSAndroid Build Coastguard Worker def add_package_list(self, ts, name, uid, version_code): 282*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 283*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 284*6dbdd20aSAndroid Build Coastguard Worker plist = packet.packages_list 285*6dbdd20aSAndroid Build Coastguard Worker pinfo = plist.packages.add() 286*6dbdd20aSAndroid Build Coastguard Worker pinfo.name = name 287*6dbdd20aSAndroid Build Coastguard Worker pinfo.uid = uid 288*6dbdd20aSAndroid Build Coastguard Worker pinfo.version_code = version_code 289*6dbdd20aSAndroid Build Coastguard Worker 290*6dbdd20aSAndroid Build Coastguard Worker def add_debuggable_package_list(self, ts, name, uid, version_code): 291*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 292*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 293*6dbdd20aSAndroid Build Coastguard Worker plist = packet.packages_list 294*6dbdd20aSAndroid Build Coastguard Worker pinfo = plist.packages.add() 295*6dbdd20aSAndroid Build Coastguard Worker pinfo.name = name 296*6dbdd20aSAndroid Build Coastguard Worker pinfo.uid = uid 297*6dbdd20aSAndroid Build Coastguard Worker pinfo.version_code = version_code 298*6dbdd20aSAndroid Build Coastguard Worker pinfo.debuggable = True 299*6dbdd20aSAndroid Build Coastguard Worker 300*6dbdd20aSAndroid Build Coastguard Worker def add_profile_packet(self, ts): 301*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 302*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 303*6dbdd20aSAndroid Build Coastguard Worker return packet.profile_packet 304*6dbdd20aSAndroid Build Coastguard Worker 305*6dbdd20aSAndroid Build Coastguard Worker def add_clock_snapshot(self, clocks, seq_id=None): 306*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 307*6dbdd20aSAndroid Build Coastguard Worker if seq_id is not None: 308*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = seq_id 309*6dbdd20aSAndroid Build Coastguard Worker snap = self.packet.clock_snapshot 310*6dbdd20aSAndroid Build Coastguard Worker for k, v in clocks.items(): 311*6dbdd20aSAndroid Build Coastguard Worker clock = snap.clocks.add() 312*6dbdd20aSAndroid Build Coastguard Worker clock.clock_id = k 313*6dbdd20aSAndroid Build Coastguard Worker clock.timestamp = v 314*6dbdd20aSAndroid Build Coastguard Worker 315*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_counter_spec(self, 316*6dbdd20aSAndroid Build Coastguard Worker ts, 317*6dbdd20aSAndroid Build Coastguard Worker counter_id, 318*6dbdd20aSAndroid Build Coastguard Worker name, 319*6dbdd20aSAndroid Build Coastguard Worker description=None, 320*6dbdd20aSAndroid Build Coastguard Worker unit_numerators=[], 321*6dbdd20aSAndroid Build Coastguard Worker unit_denominators=[]): 322*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 323*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 324*6dbdd20aSAndroid Build Coastguard Worker gpu_counters = packet.gpu_counter_event 325*6dbdd20aSAndroid Build Coastguard Worker counter_desc = gpu_counters.counter_descriptor 326*6dbdd20aSAndroid Build Coastguard Worker spec = counter_desc.specs.add() 327*6dbdd20aSAndroid Build Coastguard Worker spec.counter_id = counter_id 328*6dbdd20aSAndroid Build Coastguard Worker spec.name = name 329*6dbdd20aSAndroid Build Coastguard Worker if description is not None: 330*6dbdd20aSAndroid Build Coastguard Worker spec.description = description 331*6dbdd20aSAndroid Build Coastguard Worker spec.numerator_units.extend(unit_numerators) 332*6dbdd20aSAndroid Build Coastguard Worker spec.denominator_units.extend(unit_denominators) 333*6dbdd20aSAndroid Build Coastguard Worker 334*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_counter(self, ts, counter_id, value, clock_id=None, seq_id=None): 335*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 336*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 337*6dbdd20aSAndroid Build Coastguard Worker if clock_id is not None: 338*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp_clock_id = clock_id 339*6dbdd20aSAndroid Build Coastguard Worker if seq_id is not None: 340*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = seq_id 341*6dbdd20aSAndroid Build Coastguard Worker gpu_counters = self.packet.gpu_counter_event 342*6dbdd20aSAndroid Build Coastguard Worker gpu_counter = gpu_counters.counters.add() 343*6dbdd20aSAndroid Build Coastguard Worker gpu_counter.counter_id = counter_id 344*6dbdd20aSAndroid Build Coastguard Worker gpu_counter.int_value = value 345*6dbdd20aSAndroid Build Coastguard Worker 346*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_render_stages_hw_queue_spec(self, specs=[]): 347*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 348*6dbdd20aSAndroid Build Coastguard Worker spec = self.packet.gpu_render_stage_event.specifications 349*6dbdd20aSAndroid Build Coastguard Worker for s in specs: 350*6dbdd20aSAndroid Build Coastguard Worker hw_queue = spec.hw_queue.add() 351*6dbdd20aSAndroid Build Coastguard Worker hw_queue.name = s.get('name', '') 352*6dbdd20aSAndroid Build Coastguard Worker if 'description' in s: 353*6dbdd20aSAndroid Build Coastguard Worker hw_queue.description = s['description'] 354*6dbdd20aSAndroid Build Coastguard Worker 355*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_render_stages_stage_spec(self, specs=[]): 356*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 357*6dbdd20aSAndroid Build Coastguard Worker spec = self.packet.gpu_render_stage_event.specifications 358*6dbdd20aSAndroid Build Coastguard Worker for s in specs: 359*6dbdd20aSAndroid Build Coastguard Worker stage = spec.stage.add() 360*6dbdd20aSAndroid Build Coastguard Worker stage.name = s.get('name', '') 361*6dbdd20aSAndroid Build Coastguard Worker if 'description' in s: 362*6dbdd20aSAndroid Build Coastguard Worker stage.description = s['description'] 363*6dbdd20aSAndroid Build Coastguard Worker 364*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_render_stages(self, 365*6dbdd20aSAndroid Build Coastguard Worker ts, 366*6dbdd20aSAndroid Build Coastguard Worker event_id, 367*6dbdd20aSAndroid Build Coastguard Worker duration, 368*6dbdd20aSAndroid Build Coastguard Worker hw_queue_id, 369*6dbdd20aSAndroid Build Coastguard Worker stage_id, 370*6dbdd20aSAndroid Build Coastguard Worker context, 371*6dbdd20aSAndroid Build Coastguard Worker render_target_handle=None, 372*6dbdd20aSAndroid Build Coastguard Worker render_pass_handle=None, 373*6dbdd20aSAndroid Build Coastguard Worker render_subpass_index_mask=None, 374*6dbdd20aSAndroid Build Coastguard Worker command_buffer_handle=None, 375*6dbdd20aSAndroid Build Coastguard Worker submission_id=None, 376*6dbdd20aSAndroid Build Coastguard Worker extra_data={}): 377*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 378*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 379*6dbdd20aSAndroid Build Coastguard Worker render_stage = self.packet.gpu_render_stage_event 380*6dbdd20aSAndroid Build Coastguard Worker render_stage.event_id = event_id 381*6dbdd20aSAndroid Build Coastguard Worker render_stage.duration = duration 382*6dbdd20aSAndroid Build Coastguard Worker render_stage.hw_queue_id = hw_queue_id 383*6dbdd20aSAndroid Build Coastguard Worker render_stage.stage_id = stage_id 384*6dbdd20aSAndroid Build Coastguard Worker render_stage.context = context 385*6dbdd20aSAndroid Build Coastguard Worker if render_target_handle is not None: 386*6dbdd20aSAndroid Build Coastguard Worker render_stage.render_target_handle = render_target_handle 387*6dbdd20aSAndroid Build Coastguard Worker if render_pass_handle is not None: 388*6dbdd20aSAndroid Build Coastguard Worker render_stage.render_pass_handle = render_pass_handle 389*6dbdd20aSAndroid Build Coastguard Worker if render_subpass_index_mask is not None: 390*6dbdd20aSAndroid Build Coastguard Worker for mask in render_subpass_index_mask: 391*6dbdd20aSAndroid Build Coastguard Worker render_stage.render_subpass_index_mask.append(mask) 392*6dbdd20aSAndroid Build Coastguard Worker if command_buffer_handle is not None: 393*6dbdd20aSAndroid Build Coastguard Worker render_stage.command_buffer_handle = command_buffer_handle 394*6dbdd20aSAndroid Build Coastguard Worker if submission_id is not None: 395*6dbdd20aSAndroid Build Coastguard Worker render_stage.submission_id = submission_id 396*6dbdd20aSAndroid Build Coastguard Worker for key, value in extra_data.items(): 397*6dbdd20aSAndroid Build Coastguard Worker data = render_stage.extra_data.add() 398*6dbdd20aSAndroid Build Coastguard Worker data.name = key 399*6dbdd20aSAndroid Build Coastguard Worker if value is not None: 400*6dbdd20aSAndroid Build Coastguard Worker data.value = value 401*6dbdd20aSAndroid Build Coastguard Worker 402*6dbdd20aSAndroid Build Coastguard Worker def add_vk_debug_marker(self, ts, pid, vk_device, obj_type, obj, obj_name): 403*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 404*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 405*6dbdd20aSAndroid Build Coastguard Worker debug_marker = (self.packet.vulkan_api_event.vk_debug_utils_object_name) 406*6dbdd20aSAndroid Build Coastguard Worker debug_marker.pid = pid 407*6dbdd20aSAndroid Build Coastguard Worker debug_marker.vk_device = vk_device 408*6dbdd20aSAndroid Build Coastguard Worker debug_marker.object_type = obj_type 409*6dbdd20aSAndroid Build Coastguard Worker debug_marker.object = obj 410*6dbdd20aSAndroid Build Coastguard Worker debug_marker.object_name = obj_name 411*6dbdd20aSAndroid Build Coastguard Worker 412*6dbdd20aSAndroid Build Coastguard Worker def add_vk_queue_submit(self, ts, dur, pid, tid, vk_queue, vk_command_buffers, 413*6dbdd20aSAndroid Build Coastguard Worker submission_id): 414*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 415*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 416*6dbdd20aSAndroid Build Coastguard Worker submit = (self.packet.vulkan_api_event.vk_queue_submit) 417*6dbdd20aSAndroid Build Coastguard Worker submit.duration_ns = dur 418*6dbdd20aSAndroid Build Coastguard Worker submit.pid = pid 419*6dbdd20aSAndroid Build Coastguard Worker submit.tid = tid 420*6dbdd20aSAndroid Build Coastguard Worker for cmd in vk_command_buffers: 421*6dbdd20aSAndroid Build Coastguard Worker submit.vk_command_buffers.append(cmd) 422*6dbdd20aSAndroid Build Coastguard Worker submit.submission_id = submission_id 423*6dbdd20aSAndroid Build Coastguard Worker 424*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_log(self, ts, severity, tag, message): 425*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 426*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 427*6dbdd20aSAndroid Build Coastguard Worker gpu_log = self.packet.gpu_log 428*6dbdd20aSAndroid Build Coastguard Worker gpu_log.severity = severity 429*6dbdd20aSAndroid Build Coastguard Worker gpu_log.tag = tag 430*6dbdd20aSAndroid Build Coastguard Worker gpu_log.log_message = message 431*6dbdd20aSAndroid Build Coastguard Worker 432*6dbdd20aSAndroid Build Coastguard Worker def add_buffer_event_packet(self, ts, buffer_id, layer_name, frame_number, 433*6dbdd20aSAndroid Build Coastguard Worker event_type, duration): 434*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 435*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 436*6dbdd20aSAndroid Build Coastguard Worker buffer_event = packet.graphics_frame_event.buffer_event 437*6dbdd20aSAndroid Build Coastguard Worker if buffer_id >= 0: 438*6dbdd20aSAndroid Build Coastguard Worker buffer_event.buffer_id = buffer_id 439*6dbdd20aSAndroid Build Coastguard Worker buffer_event.layer_name = layer_name 440*6dbdd20aSAndroid Build Coastguard Worker buffer_event.frame_number = frame_number 441*6dbdd20aSAndroid Build Coastguard Worker if event_type >= 0: 442*6dbdd20aSAndroid Build Coastguard Worker buffer_event.type = event_type 443*6dbdd20aSAndroid Build Coastguard Worker buffer_event.duration_ns = duration 444*6dbdd20aSAndroid Build Coastguard Worker 445*6dbdd20aSAndroid Build Coastguard Worker def add_cpu(self, freqs): 446*6dbdd20aSAndroid Build Coastguard Worker cpu = self.packet.cpu_info.cpus.add() 447*6dbdd20aSAndroid Build Coastguard Worker for freq in freqs: 448*6dbdd20aSAndroid Build Coastguard Worker cpu.frequencies.append(freq) 449*6dbdd20aSAndroid Build Coastguard Worker 450*6dbdd20aSAndroid Build Coastguard Worker def add_process_stats(self, pid, freqs): 451*6dbdd20aSAndroid Build Coastguard Worker process = self.packet.process_stats.processes.add() 452*6dbdd20aSAndroid Build Coastguard Worker process.pid = pid 453*6dbdd20aSAndroid Build Coastguard Worker thread = process.threads.add() 454*6dbdd20aSAndroid Build Coastguard Worker thread.tid = pid * 10 455*6dbdd20aSAndroid Build Coastguard Worker for index in freqs: 456*6dbdd20aSAndroid Build Coastguard Worker thread.cpu_freq_indices.append(index) 457*6dbdd20aSAndroid Build Coastguard Worker thread.cpu_freq_ticks.append(freqs[index]) 458*6dbdd20aSAndroid Build Coastguard Worker 459*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_mem_total_ftrace_event(self, ftrace_pid, pid, ts, size): 460*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, ftrace_pid) 461*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_ftrace_event = ftrace.gpu_mem_total 462*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_ftrace_event.pid = pid 463*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_ftrace_event.size = size 464*6dbdd20aSAndroid Build Coastguard Worker 465*6dbdd20aSAndroid Build Coastguard Worker def add_gpu_mem_total_event(self, pid, ts, size): 466*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 467*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 468*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_event = packet.gpu_mem_total_event 469*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_event.pid = pid 470*6dbdd20aSAndroid Build Coastguard Worker gpu_mem_total_event.size = size 471*6dbdd20aSAndroid Build Coastguard Worker 472*6dbdd20aSAndroid Build Coastguard Worker def add_sched_blocked_reason(self, ts, pid, io_wait, unblock_pid): 473*6dbdd20aSAndroid Build Coastguard Worker ftrace = self.__add_ftrace_event(ts, unblock_pid) 474*6dbdd20aSAndroid Build Coastguard Worker sched_blocked_reason = ftrace.sched_blocked_reason 475*6dbdd20aSAndroid Build Coastguard Worker sched_blocked_reason.pid = pid 476*6dbdd20aSAndroid Build Coastguard Worker sched_blocked_reason.io_wait = io_wait 477*6dbdd20aSAndroid Build Coastguard Worker 478*6dbdd20aSAndroid Build Coastguard Worker def add_track_event(self, 479*6dbdd20aSAndroid Build Coastguard Worker name=None, 480*6dbdd20aSAndroid Build Coastguard Worker ts=None, 481*6dbdd20aSAndroid Build Coastguard Worker track=None, 482*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=0, 483*6dbdd20aSAndroid Build Coastguard Worker cpu_time=None): 484*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet(ts=ts) 485*6dbdd20aSAndroid Build Coastguard Worker if name is not None: 486*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.name = name 487*6dbdd20aSAndroid Build Coastguard Worker if track is not None: 488*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.track_uuid = track 489*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = trusted_sequence_id 490*6dbdd20aSAndroid Build Coastguard Worker if cpu_time is not None: 491*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.extra_counter_values.append(cpu_time) 492*6dbdd20aSAndroid Build Coastguard Worker return packet 493*6dbdd20aSAndroid Build Coastguard Worker 494*6dbdd20aSAndroid Build Coastguard Worker def add_track_descriptor(self, uuid, parent=None): 495*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 496*6dbdd20aSAndroid Build Coastguard Worker track_descriptor = packet.track_descriptor 497*6dbdd20aSAndroid Build Coastguard Worker if uuid is not None: 498*6dbdd20aSAndroid Build Coastguard Worker track_descriptor.uuid = uuid 499*6dbdd20aSAndroid Build Coastguard Worker if parent is not None: 500*6dbdd20aSAndroid Build Coastguard Worker track_descriptor.parent_uuid = parent 501*6dbdd20aSAndroid Build Coastguard Worker return packet 502*6dbdd20aSAndroid Build Coastguard Worker 503*6dbdd20aSAndroid Build Coastguard Worker def add_process_track_descriptor(self, 504*6dbdd20aSAndroid Build Coastguard Worker process_track, 505*6dbdd20aSAndroid Build Coastguard Worker pid=None, 506*6dbdd20aSAndroid Build Coastguard Worker process_name=None): 507*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_descriptor(process_track) 508*6dbdd20aSAndroid Build Coastguard Worker if pid is not None: 509*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.process.pid = pid 510*6dbdd20aSAndroid Build Coastguard Worker if process_name is not None: 511*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.process.process_name = process_name 512*6dbdd20aSAndroid Build Coastguard Worker return packet 513*6dbdd20aSAndroid Build Coastguard Worker 514*6dbdd20aSAndroid Build Coastguard Worker def add_chrome_process_track_descriptor( 515*6dbdd20aSAndroid Build Coastguard Worker self, 516*6dbdd20aSAndroid Build Coastguard Worker process_track, 517*6dbdd20aSAndroid Build Coastguard Worker pid=None, 518*6dbdd20aSAndroid Build Coastguard Worker process_type=None, 519*6dbdd20aSAndroid Build Coastguard Worker host_app_package_name="org.chromium.chrome"): 520*6dbdd20aSAndroid Build Coastguard Worker if process_type is None: 521*6dbdd20aSAndroid Build Coastguard Worker process_type = self.prototypes.ChromeProcessDescriptor \ 522*6dbdd20aSAndroid Build Coastguard Worker .ProcessType \ 523*6dbdd20aSAndroid Build Coastguard Worker .PROCESS_RENDERER 524*6dbdd20aSAndroid Build Coastguard Worker 525*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_process_track_descriptor(process_track, pid=pid) 526*6dbdd20aSAndroid Build Coastguard Worker chrome_process = packet.track_descriptor.chrome_process 527*6dbdd20aSAndroid Build Coastguard Worker chrome_process.process_type = process_type 528*6dbdd20aSAndroid Build Coastguard Worker chrome_process.host_app_package_name = host_app_package_name 529*6dbdd20aSAndroid Build Coastguard Worker return packet 530*6dbdd20aSAndroid Build Coastguard Worker 531*6dbdd20aSAndroid Build Coastguard Worker def add_thread_track_descriptor(self, 532*6dbdd20aSAndroid Build Coastguard Worker process_track, 533*6dbdd20aSAndroid Build Coastguard Worker thread_track, 534*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=None, 535*6dbdd20aSAndroid Build Coastguard Worker pid=None, 536*6dbdd20aSAndroid Build Coastguard Worker tid=None, 537*6dbdd20aSAndroid Build Coastguard Worker thread_name=None): 538*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_descriptor(thread_track, parent=process_track) 539*6dbdd20aSAndroid Build Coastguard Worker if trusted_packet_sequence_id is not None: 540*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = trusted_packet_sequence_id 541*6dbdd20aSAndroid Build Coastguard Worker if pid is not None: 542*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.thread.pid = pid 543*6dbdd20aSAndroid Build Coastguard Worker if tid is not None: 544*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.thread.tid = tid 545*6dbdd20aSAndroid Build Coastguard Worker if thread_name is not None: 546*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.thread.thread_name = thread_name 547*6dbdd20aSAndroid Build Coastguard Worker return packet 548*6dbdd20aSAndroid Build Coastguard Worker 549*6dbdd20aSAndroid Build Coastguard Worker def add_chrome_thread_track_descriptor(self, 550*6dbdd20aSAndroid Build Coastguard Worker process_track, 551*6dbdd20aSAndroid Build Coastguard Worker thread_track, 552*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=None, 553*6dbdd20aSAndroid Build Coastguard Worker pid=None, 554*6dbdd20aSAndroid Build Coastguard Worker tid=None, 555*6dbdd20aSAndroid Build Coastguard Worker thread_type=None): 556*6dbdd20aSAndroid Build Coastguard Worker if thread_type is None: 557*6dbdd20aSAndroid Build Coastguard Worker thread_type = self.prototypes.ThreadDescriptor \ 558*6dbdd20aSAndroid Build Coastguard Worker .ChromeThreadType \ 559*6dbdd20aSAndroid Build Coastguard Worker .CHROME_THREAD_TYPE_UNSPECIFIED 560*6dbdd20aSAndroid Build Coastguard Worker 561*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_thread_track_descriptor( 562*6dbdd20aSAndroid Build Coastguard Worker process_track, 563*6dbdd20aSAndroid Build Coastguard Worker thread_track, 564*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=trusted_packet_sequence_id, 565*6dbdd20aSAndroid Build Coastguard Worker pid=pid, 566*6dbdd20aSAndroid Build Coastguard Worker tid=tid) 567*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.thread.chrome_thread_type = thread_type 568*6dbdd20aSAndroid Build Coastguard Worker return packet 569*6dbdd20aSAndroid Build Coastguard Worker 570*6dbdd20aSAndroid Build Coastguard Worker def add_trace_packet_defaults(self, 571*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=None, 572*6dbdd20aSAndroid Build Coastguard Worker thread_track=None, 573*6dbdd20aSAndroid Build Coastguard Worker counter_track=None): 574*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_descriptor(None) 575*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = trusted_packet_sequence_id 576*6dbdd20aSAndroid Build Coastguard Worker track_event_defaults = packet.trace_packet_defaults.track_event_defaults 577*6dbdd20aSAndroid Build Coastguard Worker track_event_defaults.track_uuid = thread_track 578*6dbdd20aSAndroid Build Coastguard Worker track_event_defaults.extra_counter_track_uuids.append(counter_track) 579*6dbdd20aSAndroid Build Coastguard Worker return packet 580*6dbdd20aSAndroid Build Coastguard Worker 581*6dbdd20aSAndroid Build Coastguard Worker def add_counter_track_descriptor(self, 582*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=None, 583*6dbdd20aSAndroid Build Coastguard Worker thread_track=None, 584*6dbdd20aSAndroid Build Coastguard Worker counter_track=None): 585*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_descriptor(counter_track, parent=thread_track) 586*6dbdd20aSAndroid Build Coastguard Worker packet.trusted_packet_sequence_id = trusted_packet_sequence_id 587*6dbdd20aSAndroid Build Coastguard Worker packet.track_descriptor.counter.type = self.prototypes.CounterDescriptor \ 588*6dbdd20aSAndroid Build Coastguard Worker .BuiltinCounterType \ 589*6dbdd20aSAndroid Build Coastguard Worker .COUNTER_THREAD_TIME_NS 590*6dbdd20aSAndroid Build Coastguard Worker return packet 591*6dbdd20aSAndroid Build Coastguard Worker 592*6dbdd20aSAndroid Build Coastguard Worker def add_chrome_thread_with_cpu_counter(self, 593*6dbdd20aSAndroid Build Coastguard Worker process_track, 594*6dbdd20aSAndroid Build Coastguard Worker thread_track, 595*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=None, 596*6dbdd20aSAndroid Build Coastguard Worker counter_track=None, 597*6dbdd20aSAndroid Build Coastguard Worker pid=None, 598*6dbdd20aSAndroid Build Coastguard Worker tid=None, 599*6dbdd20aSAndroid Build Coastguard Worker thread_type=None): 600*6dbdd20aSAndroid Build Coastguard Worker self.add_chrome_thread_track_descriptor( 601*6dbdd20aSAndroid Build Coastguard Worker process_track, 602*6dbdd20aSAndroid Build Coastguard Worker thread_track, 603*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=trusted_packet_sequence_id, 604*6dbdd20aSAndroid Build Coastguard Worker pid=pid, 605*6dbdd20aSAndroid Build Coastguard Worker tid=tid, 606*6dbdd20aSAndroid Build Coastguard Worker thread_type=thread_type) 607*6dbdd20aSAndroid Build Coastguard Worker self.add_trace_packet_defaults( 608*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=trusted_packet_sequence_id, 609*6dbdd20aSAndroid Build Coastguard Worker counter_track=counter_track, 610*6dbdd20aSAndroid Build Coastguard Worker thread_track=thread_track) 611*6dbdd20aSAndroid Build Coastguard Worker 612*6dbdd20aSAndroid Build Coastguard Worker self.add_counter_track_descriptor( 613*6dbdd20aSAndroid Build Coastguard Worker trusted_packet_sequence_id=trusted_packet_sequence_id, 614*6dbdd20aSAndroid Build Coastguard Worker counter_track=counter_track, 615*6dbdd20aSAndroid Build Coastguard Worker thread_track=thread_track) 616*6dbdd20aSAndroid Build Coastguard Worker 617*6dbdd20aSAndroid Build Coastguard Worker def add_track_event_slice_begin(self, 618*6dbdd20aSAndroid Build Coastguard Worker name, 619*6dbdd20aSAndroid Build Coastguard Worker ts, 620*6dbdd20aSAndroid Build Coastguard Worker track=None, 621*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=0, 622*6dbdd20aSAndroid Build Coastguard Worker cpu_time=None): 623*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event( 624*6dbdd20aSAndroid Build Coastguard Worker name, 625*6dbdd20aSAndroid Build Coastguard Worker ts=ts, 626*6dbdd20aSAndroid Build Coastguard Worker track=track, 627*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=trusted_sequence_id, 628*6dbdd20aSAndroid Build Coastguard Worker cpu_time=cpu_time) 629*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.type = self.prototypes.TrackEvent.Type.TYPE_SLICE_BEGIN 630*6dbdd20aSAndroid Build Coastguard Worker return packet 631*6dbdd20aSAndroid Build Coastguard Worker 632*6dbdd20aSAndroid Build Coastguard Worker def add_track_event_slice_end(self, 633*6dbdd20aSAndroid Build Coastguard Worker ts, 634*6dbdd20aSAndroid Build Coastguard Worker track=None, 635*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=0, 636*6dbdd20aSAndroid Build Coastguard Worker cpu_time=None): 637*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event( 638*6dbdd20aSAndroid Build Coastguard Worker ts=ts, 639*6dbdd20aSAndroid Build Coastguard Worker track=track, 640*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=trusted_sequence_id, 641*6dbdd20aSAndroid Build Coastguard Worker cpu_time=cpu_time) 642*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.type = self.prototypes.TrackEvent.Type.TYPE_SLICE_END 643*6dbdd20aSAndroid Build Coastguard Worker return packet 644*6dbdd20aSAndroid Build Coastguard Worker 645*6dbdd20aSAndroid Build Coastguard Worker # Returns the start slice packet. 646*6dbdd20aSAndroid Build Coastguard Worker def add_track_event_slice(self, 647*6dbdd20aSAndroid Build Coastguard Worker name, 648*6dbdd20aSAndroid Build Coastguard Worker ts, 649*6dbdd20aSAndroid Build Coastguard Worker dur, 650*6dbdd20aSAndroid Build Coastguard Worker track=None, 651*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=0, 652*6dbdd20aSAndroid Build Coastguard Worker cpu_start=None, 653*6dbdd20aSAndroid Build Coastguard Worker cpu_delta=None): 654*6dbdd20aSAndroid Build Coastguard Worker 655*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event_slice_begin( 656*6dbdd20aSAndroid Build Coastguard Worker name, 657*6dbdd20aSAndroid Build Coastguard Worker ts, 658*6dbdd20aSAndroid Build Coastguard Worker track=track, 659*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=trusted_sequence_id, 660*6dbdd20aSAndroid Build Coastguard Worker cpu_time=cpu_start) 661*6dbdd20aSAndroid Build Coastguard Worker 662*6dbdd20aSAndroid Build Coastguard Worker if dur >= 0: 663*6dbdd20aSAndroid Build Coastguard Worker cpu_end = cpu_start + cpu_delta if cpu_start is not None else None 664*6dbdd20aSAndroid Build Coastguard Worker self.add_track_event_slice_end( 665*6dbdd20aSAndroid Build Coastguard Worker ts + dur, 666*6dbdd20aSAndroid Build Coastguard Worker track=track, 667*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=trusted_sequence_id, 668*6dbdd20aSAndroid Build Coastguard Worker cpu_time=cpu_end) 669*6dbdd20aSAndroid Build Coastguard Worker 670*6dbdd20aSAndroid Build Coastguard Worker return packet 671*6dbdd20aSAndroid Build Coastguard Worker 672*6dbdd20aSAndroid Build Coastguard Worker def add_rail_mode_slice(self, ts, dur, track, mode): 673*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event_slice( 674*6dbdd20aSAndroid Build Coastguard Worker "Scheduler.RAILMode", ts=ts, dur=dur, track=track) 675*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.chrome_renderer_scheduler_state.rail_mode = mode 676*6dbdd20aSAndroid Build Coastguard Worker 677*6dbdd20aSAndroid Build Coastguard Worker def add_latency_info_flow(self, 678*6dbdd20aSAndroid Build Coastguard Worker ts, 679*6dbdd20aSAndroid Build Coastguard Worker dur, 680*6dbdd20aSAndroid Build Coastguard Worker track=None, 681*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=None, 682*6dbdd20aSAndroid Build Coastguard Worker trace_id=None, 683*6dbdd20aSAndroid Build Coastguard Worker step=None, 684*6dbdd20aSAndroid Build Coastguard Worker flow_ids=[], 685*6dbdd20aSAndroid Build Coastguard Worker terminating_flow_ids=[]): 686*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event_slice( 687*6dbdd20aSAndroid Build Coastguard Worker "LatencyInfo.Flow", 688*6dbdd20aSAndroid Build Coastguard Worker ts, 689*6dbdd20aSAndroid Build Coastguard Worker dur, 690*6dbdd20aSAndroid Build Coastguard Worker track=track, 691*6dbdd20aSAndroid Build Coastguard Worker trusted_sequence_id=trusted_sequence_id) 692*6dbdd20aSAndroid Build Coastguard Worker if trace_id is not None: 693*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.chrome_latency_info.trace_id = trace_id 694*6dbdd20aSAndroid Build Coastguard Worker if step is not None: 695*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.chrome_latency_info.step = step 696*6dbdd20aSAndroid Build Coastguard Worker for flow_id in flow_ids: 697*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.flow_ids.append(flow_id) 698*6dbdd20aSAndroid Build Coastguard Worker for flow_id in terminating_flow_ids: 699*6dbdd20aSAndroid Build Coastguard Worker packet.track_event.terminating_flow_ids.append(flow_id) 700*6dbdd20aSAndroid Build Coastguard Worker return packet 701*6dbdd20aSAndroid Build Coastguard Worker 702*6dbdd20aSAndroid Build Coastguard Worker def add_input_latency_event_slice(self, 703*6dbdd20aSAndroid Build Coastguard Worker name, 704*6dbdd20aSAndroid Build Coastguard Worker ts, 705*6dbdd20aSAndroid Build Coastguard Worker dur, 706*6dbdd20aSAndroid Build Coastguard Worker track=None, 707*6dbdd20aSAndroid Build Coastguard Worker trace_id=None, 708*6dbdd20aSAndroid Build Coastguard Worker gesture_scroll_id=None, 709*6dbdd20aSAndroid Build Coastguard Worker touch_id=None, 710*6dbdd20aSAndroid Build Coastguard Worker is_coalesced=None, 711*6dbdd20aSAndroid Build Coastguard Worker gets_to_gpu=True): 712*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_track_event_slice( 713*6dbdd20aSAndroid Build Coastguard Worker "InputLatency::" + name, ts=ts, dur=dur, track=track) 714*6dbdd20aSAndroid Build Coastguard Worker latency_info = packet.track_event.chrome_latency_info 715*6dbdd20aSAndroid Build Coastguard Worker latency_info.trace_id = trace_id 716*6dbdd20aSAndroid Build Coastguard Worker if gesture_scroll_id is not None: 717*6dbdd20aSAndroid Build Coastguard Worker latency_info.gesture_scroll_id = gesture_scroll_id 718*6dbdd20aSAndroid Build Coastguard Worker if touch_id is not None: 719*6dbdd20aSAndroid Build Coastguard Worker latency_info.touch_id = touch_id 720*6dbdd20aSAndroid Build Coastguard Worker if gets_to_gpu: 721*6dbdd20aSAndroid Build Coastguard Worker component = latency_info.component_info.add() 722*6dbdd20aSAndroid Build Coastguard Worker component.component_type = self.prototypes \ 723*6dbdd20aSAndroid Build Coastguard Worker .ChromeLatencyInfo.ComponentType \ 724*6dbdd20aSAndroid Build Coastguard Worker .COMPONENT_INPUT_EVENT_GPU_SWAP_BUFFER 725*6dbdd20aSAndroid Build Coastguard Worker if is_coalesced is not None: 726*6dbdd20aSAndroid Build Coastguard Worker latency_info.is_coalesced = is_coalesced 727*6dbdd20aSAndroid Build Coastguard Worker return packet 728*6dbdd20aSAndroid Build Coastguard Worker 729*6dbdd20aSAndroid Build Coastguard Worker def add_chrome_metadata(self, os_name=None): 730*6dbdd20aSAndroid Build Coastguard Worker metadata = self.add_packet().chrome_events.metadata.add() 731*6dbdd20aSAndroid Build Coastguard Worker if os_name is not None: 732*6dbdd20aSAndroid Build Coastguard Worker metadata.name = "os-name" 733*6dbdd20aSAndroid Build Coastguard Worker metadata.string_value = os_name 734*6dbdd20aSAndroid Build Coastguard Worker 735*6dbdd20aSAndroid Build Coastguard Worker return metadata 736*6dbdd20aSAndroid Build Coastguard Worker 737*6dbdd20aSAndroid Build Coastguard Worker def add_expected_display_frame_start_event(self, ts, cookie, token, pid): 738*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 739*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 740*6dbdd20aSAndroid Build Coastguard Worker event = packet.frame_timeline_event.expected_display_frame_start 741*6dbdd20aSAndroid Build Coastguard Worker if token != -1: 742*6dbdd20aSAndroid Build Coastguard Worker event.cookie = cookie 743*6dbdd20aSAndroid Build Coastguard Worker event.token = token 744*6dbdd20aSAndroid Build Coastguard Worker event.pid = pid 745*6dbdd20aSAndroid Build Coastguard Worker 746*6dbdd20aSAndroid Build Coastguard Worker def add_actual_display_frame_start_event(self, ts, cookie, token, pid, 747*6dbdd20aSAndroid Build Coastguard Worker present_type, on_time_finish, 748*6dbdd20aSAndroid Build Coastguard Worker gpu_composition, jank_type, 749*6dbdd20aSAndroid Build Coastguard Worker prediction_type): 750*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 751*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 752*6dbdd20aSAndroid Build Coastguard Worker event = packet.frame_timeline_event.actual_display_frame_start 753*6dbdd20aSAndroid Build Coastguard Worker if token != -1: 754*6dbdd20aSAndroid Build Coastguard Worker event.cookie = cookie 755*6dbdd20aSAndroid Build Coastguard Worker event.token = token 756*6dbdd20aSAndroid Build Coastguard Worker event.pid = pid 757*6dbdd20aSAndroid Build Coastguard Worker event.present_type = present_type 758*6dbdd20aSAndroid Build Coastguard Worker event.on_time_finish = on_time_finish 759*6dbdd20aSAndroid Build Coastguard Worker event.gpu_composition = gpu_composition 760*6dbdd20aSAndroid Build Coastguard Worker event.jank_type = jank_type 761*6dbdd20aSAndroid Build Coastguard Worker event.prediction_type = prediction_type 762*6dbdd20aSAndroid Build Coastguard Worker 763*6dbdd20aSAndroid Build Coastguard Worker def add_expected_surface_frame_start_event(self, ts, cookie, token, 764*6dbdd20aSAndroid Build Coastguard Worker display_frame_token, pid, 765*6dbdd20aSAndroid Build Coastguard Worker layer_name): 766*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 767*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 768*6dbdd20aSAndroid Build Coastguard Worker event = packet.frame_timeline_event.expected_surface_frame_start 769*6dbdd20aSAndroid Build Coastguard Worker if token != -1 and display_frame_token != -1: 770*6dbdd20aSAndroid Build Coastguard Worker event.cookie = cookie 771*6dbdd20aSAndroid Build Coastguard Worker event.token = token 772*6dbdd20aSAndroid Build Coastguard Worker event.display_frame_token = display_frame_token 773*6dbdd20aSAndroid Build Coastguard Worker event.pid = pid 774*6dbdd20aSAndroid Build Coastguard Worker event.layer_name = layer_name 775*6dbdd20aSAndroid Build Coastguard Worker 776*6dbdd20aSAndroid Build Coastguard Worker def add_actual_surface_frame_start_event(self, 777*6dbdd20aSAndroid Build Coastguard Worker ts, 778*6dbdd20aSAndroid Build Coastguard Worker cookie, 779*6dbdd20aSAndroid Build Coastguard Worker token, 780*6dbdd20aSAndroid Build Coastguard Worker display_frame_token, 781*6dbdd20aSAndroid Build Coastguard Worker pid, 782*6dbdd20aSAndroid Build Coastguard Worker layer_name, 783*6dbdd20aSAndroid Build Coastguard Worker present_type, 784*6dbdd20aSAndroid Build Coastguard Worker on_time_finish, 785*6dbdd20aSAndroid Build Coastguard Worker gpu_composition, 786*6dbdd20aSAndroid Build Coastguard Worker jank_type, 787*6dbdd20aSAndroid Build Coastguard Worker prediction_type, 788*6dbdd20aSAndroid Build Coastguard Worker jank_severity_type=None): 789*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 790*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 791*6dbdd20aSAndroid Build Coastguard Worker event = packet.frame_timeline_event.actual_surface_frame_start 792*6dbdd20aSAndroid Build Coastguard Worker if token != -1 and display_frame_token != -1: 793*6dbdd20aSAndroid Build Coastguard Worker event.cookie = cookie 794*6dbdd20aSAndroid Build Coastguard Worker event.token = token 795*6dbdd20aSAndroid Build Coastguard Worker event.display_frame_token = display_frame_token 796*6dbdd20aSAndroid Build Coastguard Worker event.pid = pid 797*6dbdd20aSAndroid Build Coastguard Worker event.layer_name = layer_name 798*6dbdd20aSAndroid Build Coastguard Worker event.present_type = present_type 799*6dbdd20aSAndroid Build Coastguard Worker event.on_time_finish = on_time_finish 800*6dbdd20aSAndroid Build Coastguard Worker event.gpu_composition = gpu_composition 801*6dbdd20aSAndroid Build Coastguard Worker event.jank_type = jank_type 802*6dbdd20aSAndroid Build Coastguard Worker # jank severity type is not available on every trace. 803*6dbdd20aSAndroid Build Coastguard Worker # When not set, default to none if no jank; otherwise default to unknown 804*6dbdd20aSAndroid Build Coastguard Worker if jank_severity_type is None: 805*6dbdd20aSAndroid Build Coastguard Worker event.jank_severity_type = 1 if event.jank_type == 1 else 0 806*6dbdd20aSAndroid Build Coastguard Worker else: 807*6dbdd20aSAndroid Build Coastguard Worker event.jank_severity_type = jank_severity_type 808*6dbdd20aSAndroid Build Coastguard Worker event.prediction_type = prediction_type 809*6dbdd20aSAndroid Build Coastguard Worker 810*6dbdd20aSAndroid Build Coastguard Worker def add_frame_end_event(self, ts, cookie): 811*6dbdd20aSAndroid Build Coastguard Worker packet = self.add_packet() 812*6dbdd20aSAndroid Build Coastguard Worker packet.timestamp = ts 813*6dbdd20aSAndroid Build Coastguard Worker event = packet.frame_timeline_event.frame_end 814*6dbdd20aSAndroid Build Coastguard Worker event.cookie = cookie 815*6dbdd20aSAndroid Build Coastguard Worker 816*6dbdd20aSAndroid Build Coastguard Worker 817*6dbdd20aSAndroid Build Coastguard Workerdef read_descriptor(file_name): 818*6dbdd20aSAndroid Build Coastguard Worker with open(file_name, 'rb') as f: 819*6dbdd20aSAndroid Build Coastguard Worker contents = f.read() 820*6dbdd20aSAndroid Build Coastguard Worker 821*6dbdd20aSAndroid Build Coastguard Worker descriptor = descriptor_pb2.FileDescriptorSet() 822*6dbdd20aSAndroid Build Coastguard Worker descriptor.MergeFromString(contents) 823*6dbdd20aSAndroid Build Coastguard Worker 824*6dbdd20aSAndroid Build Coastguard Worker return descriptor 825*6dbdd20aSAndroid Build Coastguard Worker 826*6dbdd20aSAndroid Build Coastguard Worker 827*6dbdd20aSAndroid Build Coastguard Workerdef create_pool(args): 828*6dbdd20aSAndroid Build Coastguard Worker trace_descriptor = read_descriptor(args.trace_descriptor) 829*6dbdd20aSAndroid Build Coastguard Worker 830*6dbdd20aSAndroid Build Coastguard Worker pool = descriptor_pool.DescriptorPool() 831*6dbdd20aSAndroid Build Coastguard Worker for file in trace_descriptor.file: 832*6dbdd20aSAndroid Build Coastguard Worker pool.Add(file) 833*6dbdd20aSAndroid Build Coastguard Worker 834*6dbdd20aSAndroid Build Coastguard Worker return pool 835*6dbdd20aSAndroid Build Coastguard Worker 836*6dbdd20aSAndroid Build Coastguard Worker 837*6dbdd20aSAndroid Build Coastguard Workerdef create_trace(): 838*6dbdd20aSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 839*6dbdd20aSAndroid Build Coastguard Worker parser.add_argument( 840*6dbdd20aSAndroid Build Coastguard Worker 'trace_descriptor', type=str, help='location of trace descriptor') 841*6dbdd20aSAndroid Build Coastguard Worker args = parser.parse_args() 842*6dbdd20aSAndroid Build Coastguard Worker 843*6dbdd20aSAndroid Build Coastguard Worker pool = create_pool(args) 844*6dbdd20aSAndroid Build Coastguard Worker ProtoTrace = get_message_class( 845*6dbdd20aSAndroid Build Coastguard Worker pool, pool.FindMessageTypeByName('perfetto.protos.Trace')) 846*6dbdd20aSAndroid Build Coastguard Worker 847*6dbdd20aSAndroid Build Coastguard Worker class EnumPrototype(object): 848*6dbdd20aSAndroid Build Coastguard Worker 849*6dbdd20aSAndroid Build Coastguard Worker def from_descriptor(desc): 850*6dbdd20aSAndroid Build Coastguard Worker res = EnumPrototype() 851*6dbdd20aSAndroid Build Coastguard Worker for desc in desc.values: 852*6dbdd20aSAndroid Build Coastguard Worker setattr(res, desc.name, desc.number) 853*6dbdd20aSAndroid Build Coastguard Worker return res 854*6dbdd20aSAndroid Build Coastguard Worker 855*6dbdd20aSAndroid Build Coastguard Worker ChromeLatencyInfo = namedtuple('ChromeLatencyInfo', [ 856*6dbdd20aSAndroid Build Coastguard Worker 'ComponentType', 857*6dbdd20aSAndroid Build Coastguard Worker 'Step', 858*6dbdd20aSAndroid Build Coastguard Worker ]) 859*6dbdd20aSAndroid Build Coastguard Worker 860*6dbdd20aSAndroid Build Coastguard Worker Prototypes = namedtuple('Prototypes', [ 861*6dbdd20aSAndroid Build Coastguard Worker 'TrackEvent', 862*6dbdd20aSAndroid Build Coastguard Worker 'ChromeRAILMode', 863*6dbdd20aSAndroid Build Coastguard Worker 'ChromeLatencyInfo', 864*6dbdd20aSAndroid Build Coastguard Worker 'ChromeProcessDescriptor', 865*6dbdd20aSAndroid Build Coastguard Worker 'CounterDescriptor', 866*6dbdd20aSAndroid Build Coastguard Worker 'ThreadDescriptor', 867*6dbdd20aSAndroid Build Coastguard Worker ]) 868*6dbdd20aSAndroid Build Coastguard Worker 869*6dbdd20aSAndroid Build Coastguard Worker chrome_latency_info_prototypes = ChromeLatencyInfo( 870*6dbdd20aSAndroid Build Coastguard Worker ComponentType=EnumPrototype.from_descriptor( 871*6dbdd20aSAndroid Build Coastguard Worker pool.FindEnumTypeByName( 872*6dbdd20aSAndroid Build Coastguard Worker 'perfetto.protos.ChromeLatencyInfo.LatencyComponentType')), 873*6dbdd20aSAndroid Build Coastguard Worker Step=EnumPrototype.from_descriptor( 874*6dbdd20aSAndroid Build Coastguard Worker pool.FindEnumTypeByName('perfetto.protos.ChromeLatencyInfo.Step')), 875*6dbdd20aSAndroid Build Coastguard Worker ) 876*6dbdd20aSAndroid Build Coastguard Worker 877*6dbdd20aSAndroid Build Coastguard Worker prototypes = Prototypes( 878*6dbdd20aSAndroid Build Coastguard Worker TrackEvent=get_message_class( 879*6dbdd20aSAndroid Build Coastguard Worker pool, pool.FindMessageTypeByName('perfetto.protos.TrackEvent')), 880*6dbdd20aSAndroid Build Coastguard Worker ChromeRAILMode=EnumPrototype.from_descriptor( 881*6dbdd20aSAndroid Build Coastguard Worker pool.FindEnumTypeByName('perfetto.protos.ChromeRAILMode')), 882*6dbdd20aSAndroid Build Coastguard Worker ChromeLatencyInfo=chrome_latency_info_prototypes, 883*6dbdd20aSAndroid Build Coastguard Worker ChromeProcessDescriptor=get_message_class( 884*6dbdd20aSAndroid Build Coastguard Worker pool, 885*6dbdd20aSAndroid Build Coastguard Worker pool.FindMessageTypeByName( 886*6dbdd20aSAndroid Build Coastguard Worker 'perfetto.protos.ChromeProcessDescriptor')), 887*6dbdd20aSAndroid Build Coastguard Worker CounterDescriptor=get_message_class( 888*6dbdd20aSAndroid Build Coastguard Worker pool, 889*6dbdd20aSAndroid Build Coastguard Worker pool.FindMessageTypeByName('perfetto.protos.CounterDescriptor')), 890*6dbdd20aSAndroid Build Coastguard Worker ThreadDescriptor=get_message_class( 891*6dbdd20aSAndroid Build Coastguard Worker pool, pool.FindMessageTypeByName('perfetto.protos.ThreadDescriptor')), 892*6dbdd20aSAndroid Build Coastguard Worker ) 893*6dbdd20aSAndroid Build Coastguard Worker return Trace(ProtoTrace(), prototypes) 894