1#!/usr/bin/env python3 2# Copyright (C) 2018 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16from os import sys, path 17 18import synth_common 19 20APP_PID = 3 21APP_TID = APP_PID 22SECOND_APP_TID = 3 23JIT_TID = 4 24GC_TID = 5 25GC2_TID = 6 26BINDER_TID = 7 27FONTS_TID = 8 28SYSTEM_SERVER_PID = 2 29SYSTEM_SERVER_TID = 2 30LAUNCH_START_TS = 100 31LAUNCH_END_TS = 10**9 32 33trace = synth_common.create_trace() 34trace.add_packet() 35trace.add_process(1, 0, 'init') 36trace.add_process(SYSTEM_SERVER_PID, 1, 'system_server') 37trace.add_process(APP_PID, 1, 'com.some.app', uid=10001) 38trace.add_thread(tid=SECOND_APP_TID, tgid=APP_PID, cmdline='second_thread') 39trace.add_thread( 40 tid=JIT_TID, 41 tgid=APP_PID, 42 cmdline='Jit thread pool', 43 name='Jit thread pool') 44trace.add_thread( 45 tid=GC_TID, tgid=APP_PID, cmdline='HeapTaskDaemon', name='HeapTaskDaemon') 46trace.add_thread( 47 tid=GC2_TID, tgid=APP_PID, cmdline='HeapTaskDaemon', name='HeapTaskDaemon') 48trace.add_thread(tid=BINDER_TID, tgid=APP_PID, cmdline='Binder', name='Binder') 49trace.add_thread(tid=FONTS_TID, tgid=APP_PID, cmdline='fonts', name='fonts') 50 51trace.add_package_list(ts=99, name='com.some.app', uid=10001, version_code=123) 52 53trace.add_ftrace_packet(cpu=0) 54# Start intent. 55trace.add_atrace_begin( 56 ts=LAUNCH_START_TS, 57 pid=SYSTEM_SERVER_PID, 58 tid=SYSTEM_SERVER_TID, 59 buf='MetricsLogger:launchObserverNotifyIntentStarted') 60trace.add_atrace_end( 61 ts=LAUNCH_START_TS + 1, tid=SYSTEM_SERVER_TID, pid=SYSTEM_SERVER_PID) 62 63# System server launching the app. 64trace.add_atrace_async_begin( 65 ts=LAUNCH_START_TS + 2, 66 pid=SYSTEM_SERVER_PID, 67 tid=SYSTEM_SERVER_TID, 68 buf='launching: com.some.app') 69 70# Emulate a hot start (and therefore that we only see activityResume). 71trace.add_atrace_begin(ts=125, tid=APP_TID, pid=APP_PID, buf='activityResume') 72trace.add_atrace_end(ts=130, tid=APP_TID, pid=APP_PID) 73 74# OpenDex slices within the startup. 75trace.add_atrace_begin( 76 ts=150, pid=APP_PID, tid=APP_TID, buf='OpenDexFilesFromOat(something)') 77trace.add_atrace_end(ts=165, pid=APP_PID, tid=APP_TID) 78 79trace.add_atrace_begin( 80 ts=170, pid=APP_PID, tid=APP_TID, buf='OpenDexFilesFromOat(something else)') 81trace.add_atrace_end(ts=5 * 10**8, pid=APP_PID, tid=APP_TID) 82 83# OpenDex slice outside the startup. 84trace.add_atrace_begin( 85 ts=5, pid=APP_PID, tid=APP_TID, buf='OpenDexFilesFromOat(nothing)') 86trace.add_atrace_end(ts=35, pid=APP_PID, tid=APP_TID) 87 88# dlopen slices within the startup. 89trace.add_atrace_begin( 90 ts=166, pid=APP_PID, tid=APP_TID, buf='dlopen: libandroid.so') 91trace.add_atrace_end(ts=167, pid=APP_PID, tid=APP_TID) 92 93trace.add_atrace_begin( 94 ts=168, pid=APP_PID, tid=APP_TID, buf='dlopen: libandroid2.so') 95trace.add_atrace_end(ts=169, pid=APP_PID, tid=APP_TID) 96 97trace.add_atrace_async_end( 98 ts=LAUNCH_END_TS, 99 tid=SYSTEM_SERVER_TID, 100 pid=SYSTEM_SERVER_PID, 101 buf='launching: com.some.app') 102 103# VerifyClass slices within the startup. 104trace.add_atrace_begin(ts=250, pid=APP_PID, tid=APP_TID, buf='VerifyClass vr') 105trace.add_atrace_end(ts=265, pid=APP_PID, tid=APP_TID) 106 107trace.add_atrace_begin(ts=270, pid=APP_PID, tid=APP_TID, buf='VerifyClass dl') 108trace.add_atrace_end(ts=275, pid=APP_PID, tid=APP_TID) 109 110# class init slices within the startup. 111# class init slices will start with an L and end with a semicolon, 112# e.g. Lkotlin/text/MatchResult; 113trace.add_atrace_begin(ts=276, pid=APP_PID, tid=APP_TID, buf='Landroid/dummy;') 114trace.add_atrace_end(ts=277, pid=APP_PID, tid=APP_TID) 115 116trace.add_atrace_begin(ts=278, pid=APP_PID, tid=APP_TID, buf='Lcom/dummy;') 117trace.add_atrace_end(ts=279, pid=APP_PID, tid=APP_TID) 118 119# VerifyClass slice outside the startup. 120trace.add_atrace_begin(ts=55, pid=APP_PID, tid=APP_TID, buf='VerifyClass xf') 121trace.add_atrace_end(ts=65, pid=APP_PID, tid=APP_TID) 122 123# VerifyClass slice on a different thread, overlapping with the other slices. 124trace.add_atrace_begin( 125 ts=260, pid=APP_PID, tid=SECOND_APP_TID, buf='VerifyClass vp') 126trace.add_atrace_end(ts=280, pid=APP_PID, tid=SECOND_APP_TID) 127 128# JIT compilation slices 129trace.add_atrace_begin( 130 ts=150, pid=APP_PID, tid=JIT_TID, buf='JIT compiling something') 131trace.add_atrace_end(ts=160, pid=APP_PID, tid=JIT_TID) 132 133trace.add_sched(ts=155, prev_pid=0, next_pid=JIT_TID) 134trace.add_sched(ts=165, prev_pid=JIT_TID, next_pid=0) 135 136trace.add_atrace_begin( 137 ts=170, pid=APP_PID, tid=JIT_TID, buf='JIT compiling something else') 138trace.add_atrace_end(ts=190, pid=APP_PID, tid=JIT_TID) 139 140trace.add_sched(ts=170, prev_pid=0, next_pid=JIT_TID) 141trace.add_sched(ts=175, prev_pid=JIT_TID, next_pid=0, prev_state='R') 142trace.add_sched(ts=185, prev_pid=0, next_pid=JIT_TID) 143trace.add_sched(ts=190, prev_pid=JIT_TID, next_pid=0) 144 145# JIT slice, but not on JIT thread. 146trace.add_atrace_begin( 147 ts=200, pid=APP_PID, tid=SECOND_APP_TID, buf='JIT compiling nothing') 148trace.add_atrace_end(ts=210, pid=APP_PID, tid=SECOND_APP_TID) 149 150# Slice on JIT thread, but name doesn't match 151trace.add_atrace_begin( 152 ts=200, pid=APP_PID, tid=JIT_TID, buf='JIT compiled something') 153trace.add_atrace_end(ts=210, pid=APP_PID, tid=JIT_TID) 154 155# GC slices. 156trace.add_atrace_begin( 157 ts=300, pid=APP_PID, tid=GC_TID, buf='Background concurrent copying GC') 158trace.add_atrace_end(ts=330, pid=APP_PID, tid=GC_TID) 159 160trace.add_atrace_begin( 161 ts=340, pid=APP_PID, tid=GC_TID, buf='CollectorTransition mark sweep GC') 162trace.add_atrace_end(ts=390, pid=APP_PID, tid=GC_TID) 163 164trace.add_atrace_begin(ts=320, pid=APP_PID, tid=GC2_TID, buf='semispace GC') 165trace.add_atrace_end(ts=370, pid=APP_PID, tid=GC2_TID) 166 167# Start running copying slice on the first thread 168trace.add_sched(ts=310, prev_pid=0, next_pid=GC_TID) 169# Switch to the second thread to run semispace slice 170trace.add_sched(ts=325, prev_pid=GC_TID, next_pid=GC2_TID) 171# Switch back to the first thread to run mark sweep slice 172trace.add_sched(ts=350, prev_pid=GC2_TID, next_pid=GC_TID) 173# Finish running for GC. 174trace.add_sched(ts=360, prev_pid=GC_TID, next_pid=0) 175 176# Long binder transactions. 177trace.add_binder_transaction(1, 10**8, 2 * (10**8), BINDER_TID, APP_PID, 2, 178 10**8 + 1, 2 * (10**8) - 1, SYSTEM_SERVER_TID, 179 SYSTEM_SERVER_PID) 180 181trace.add_binder_transaction(3, 3 * (10**8), 5 * (10**8), FONTS_TID, APP_PID, 4, 182 3 * (10**8) + 1, 5 * (10**8) - 1, BINDER_TID, 183 APP_PID) 184 185# A short binder transaction. 186trace.add_binder_transaction(5, 10**7, 5 * (10**7), APP_TID, APP_PID, 6, 187 10**7 + 1, 5 * (10**7) - 1, SYSTEM_SERVER_TID, 188 SYSTEM_SERVER_PID) 189 190# Intent successful. 191trace.add_atrace_begin( 192 ts=LAUNCH_END_TS + 1, 193 pid=SYSTEM_SERVER_PID, 194 tid=SYSTEM_SERVER_TID, 195 buf='MetricsLogger:launchObserverNotifyActivityLaunchFinished') 196trace.add_atrace_end( 197 ts=LAUNCH_END_TS + 2, tid=SYSTEM_SERVER_TID, pid=SYSTEM_SERVER_PID) 198 199sys.stdout.buffer.write(trace.trace.SerializeToString()) 200