• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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