Merge "Support new startup tracepoint format"
diff --git a/Android.bp b/Android.bp
index fc9f86f..3c5e89b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -8398,6 +8398,7 @@
"src/trace_processor/metrics/sql/android/startup/launches.sql",
"src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql",
"src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql",
+ "src/trace_processor/metrics/sql/android/startup/launches_minsdk33.sql",
"src/trace_processor/metrics/sql/android/thread_counter_span_view.sql",
"src/trace_processor/metrics/sql/android/unsymbolized_frames.sql",
"src/trace_processor/metrics/sql/chrome/actual_power_by_category.sql",
diff --git a/BUILD b/BUILD
index 5d93094..42b652d 100644
--- a/BUILD
+++ b/BUILD
@@ -1109,6 +1109,7 @@
"src/trace_processor/metrics/sql/android/startup/launches.sql",
"src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql",
"src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql",
+ "src/trace_processor/metrics/sql/android/startup/launches_minsdk33.sql",
"src/trace_processor/metrics/sql/android/thread_counter_span_view.sql",
"src/trace_processor/metrics/sql/android/unsymbolized_frames.sql",
"src/trace_processor/metrics/sql/chrome/actual_power_by_category.sql",
diff --git a/src/trace_processor/metrics/sql/BUILD.gn b/src/trace_processor/metrics/sql/BUILD.gn
index 5c07ca1..0ec76e6 100644
--- a/src/trace_processor/metrics/sql/BUILD.gn
+++ b/src/trace_processor/metrics/sql/BUILD.gn
@@ -79,6 +79,7 @@
"android/unsymbolized_frames.sql",
"android/startup/launches_maxsdk28.sql",
"android/startup/launches_minsdk29.sql",
+ "android/startup/launches_minsdk33.sql",
"android/startup/launches.sql",
"android/startup/hsc.sql",
"chrome/actual_power_by_category.sql",
diff --git a/src/trace_processor/metrics/sql/android/startup/launches.sql b/src/trace_processor/metrics/sql/android/startup/launches.sql
index 999ba6e..60c1cab 100644
--- a/src/trace_processor/metrics/sql/android/startup/launches.sql
+++ b/src/trace_processor/metrics/sql/android/startup/launches.sql
@@ -30,25 +30,31 @@
AND (process.name IS NULL OR process.name = 'system_server');
SELECT CREATE_FUNCTION(
- 'ANDROID_SDK_LEVEL()',
- 'INT', "
- SELECT int_value
- FROM metadata
- WHERE name = 'android_sdk_version'
- ");
-
-SELECT CREATE_FUNCTION(
- 'METRICS_LOGGER_SLICE_COUNT()',
+ 'SLICE_COUNT(slice_glob STRING)',
'INT',
- "SELECT COUNT(1) FROM slice WHERE name GLOB 'MetricsLogger:*'"
+ 'SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob'
+);
+
+-- All activity launches in the trace, keyed by ID.
+-- Populated by different scripts depending on the platform version / contents.
+-- See android/startup/launches*.sql
+DROP TABLE IF EXISTS launches;
+CREATE TABLE launches(
+ id INTEGER PRIMARY KEY,
+ ts BIG INT,
+ ts_end BIG INT,
+ dur BIG INT,
+ package STRING
);
-- Note: on Q, we didn't have Android fingerprints but we *did*
-- have ActivityMetricsLogger events so we will use this approach
-- if we see any such events.
SELECT CASE
- WHEN (ANDROID_SDK_LEVEL() >= 29 OR METRICS_LOGGER_SLICE_COUNT() > 0)
- THEN RUN_METRIC('android/startup/launches_minsdk29.sql')
+ WHEN SLICE_COUNT('launchingActivity#*:*') > 0
+ THEN RUN_METRIC('android/startup/launches_minsdk33.sql')
+ WHEN SLICE_COUNT('MetricsLogger:*') > 0
+ THEN RUN_METRIC('android/startup/launches_minsdk29.sql')
ELSE RUN_METRIC('android/startup/launches_maxsdk28.sql')
END;
diff --git a/src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql b/src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql
index 8753da1..35c797e 100644
--- a/src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql
+++ b/src/trace_processor/metrics/sql/android/startup/launches_maxsdk28.sql
@@ -14,23 +14,15 @@
-- limitations under the License.
--
--- All activity launches in the trace, keyed by ID.
-DROP TABLE IF EXISTS launches;
-CREATE TABLE launches(
- id INTEGER PRIMARY KEY,
- ts BIG INT,
- ts_end BIG INT,
- dur BIG INT,
- package STRING
-);
-
-- Cold/warm starts emitted launching slices on API level 28-.
-INSERT INTO launches(ts, ts_end, dur, package)
+INSERT INTO launches(id, ts, ts_end, dur, package)
SELECT
+ ROW_NUMBER() OVER(ORDER BY ts) AS id,
launching_events.ts AS ts,
launching_events.ts_end AS ts_end,
launching_events.ts_end - launching_events.ts AS dur,
package_name AS package
-FROM launching_events;
+FROM launching_events
+ORDER BY ts;
-- TODO(lalitm): add handling of hot starts using frame timings.
diff --git a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
index 1f4c0f7..e5631bf 100644
--- a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
+++ b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
@@ -53,23 +53,14 @@
SELECT ts FROM slice
WHERE name = 'MetricsLogger:launchObserverNotifyActivityLaunchFinished';
--- All activity launches in the trace, keyed by ID.
-DROP TABLE IF EXISTS launches;
-CREATE TABLE launches(
- ts BIG INT,
- ts_end BIG INT,
- dur BIG INT,
- id INT,
- package STRING);
-
-- Use the starting event package name. The finish event package name
-- is not reliable in the case of failed launches.
-INSERT INTO launches
+INSERT INTO launches(id, ts, ts_end, dur, package)
SELECT
+ lpart.id AS id,
lpart.ts AS ts,
launching_events.ts_end AS ts_end,
launching_events.ts_end - lpart.ts AS dur,
- lpart.id AS id,
package_name AS package
FROM launch_partitions AS lpart
JOIN launching_events ON
diff --git a/src/trace_processor/metrics/sql/android/startup/launches_minsdk33.sql b/src/trace_processor/metrics/sql/android/startup/launches_minsdk33.sql
new file mode 100644
index 0000000..f3773bb
--- /dev/null
+++ b/src/trace_processor/metrics/sql/android/startup/launches_minsdk33.sql
@@ -0,0 +1,47 @@
+--
+-- Copyright 2022 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+DROP VIEW IF EXISTS launch_async_events;
+CREATE VIEW launch_async_events AS
+SELECT
+ ts,
+ dur,
+ SUBSTR(name, 19) id
+FROM slice
+WHERE
+ name GLOB 'launchingActivity#*'
+ AND dur != 0
+ AND INSTR(name, ':') = 0;
+
+DROP VIEW IF EXISTS launch_complete_events;
+CREATE VIEW launch_complete_events AS
+SELECT
+ STR_SPLIT(completed, ':completed:', 0) id,
+ STR_SPLIT(completed, ':completed:', 1) package_name
+FROM (
+ SELECT SUBSTR(name, 19) completed
+ FROM slice
+ WHERE dur = 0 AND name GLOB 'launchingActivity#*:completed:*'
+);
+
+INSERT INTO launches(id, ts, ts_end, dur, package)
+SELECT
+ id,
+ ts,
+ ts + dur ts_end,
+ dur,
+ package_name
+FROM launch_async_events JOIN launch_complete_events USING (id);
diff --git a/test/synth_common.py b/test/synth_common.py
index 92d8e3f..be52735 100644
--- a/test/synth_common.py
+++ b/test/synth_common.py
@@ -187,6 +187,9 @@
def add_atrace_async_end(self, ts, tid, pid, buf):
self.add_print(ts, tid, 'F|{}|{}|0'.format(pid, buf))
+ def add_atrace_instant(self, ts, tid, pid, buf):
+ self.add_print(ts, tid, 'I|{}|{}'.format(pid, buf))
+
def add_process(self, pid, ppid, cmdline, uid=None):
process = self.packet.process_tree.processes.add()
process.pid = pid
diff --git a/test/trace_processor/startup/android_startup_minsdk33.out b/test/trace_processor/startup/android_startup_minsdk33.out
new file mode 100644
index 0000000..e7022b5
--- /dev/null
+++ b/test/trace_processor/startup/android_startup_minsdk33.out
@@ -0,0 +1,25 @@
+android_startup {
+ startup {
+ startup_id: 1
+ package_name: "com.google.android.calendar"
+ zygote_new_process: false
+ to_first_frame {
+ dur_ns: 100
+ main_thread_by_task_state {
+ running_dur_ns: 0
+ runnable_dur_ns: 0
+ uninterruptible_sleep_dur_ns: 0
+ interruptible_sleep_dur_ns: 0
+ }
+ other_processes_spawned_count: 0
+ dur_ms: 0.0001
+ mcycles_by_core_type {
+ }
+ }
+ activity_hosting_process_count: 0
+ event_timestamps {
+ intent_received: 110
+ first_frame: 210
+ }
+ }
+}
diff --git a/test/trace_processor/startup/android_startup_minsdk33.py b/test/trace_processor/startup/android_startup_minsdk33.py
new file mode 100644
index 0000000..dddc503
--- /dev/null
+++ b/test/trace_processor/startup/android_startup_minsdk33.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from os import sys, path
+
+import synth_common
+
+trace = synth_common.create_trace()
+trace.add_packet()
+trace.add_process(1, 0, 'init')
+trace.add_process(2, 1, 'system_server')
+trace.add_process(3, 1, 'com.google.android.calendar', 10001)
+
+trace.add_package_list(
+ ts=1, name='com.google.android.calendar', uid=10001, version_code=123)
+
+trace.add_ftrace_packet(cpu=0)
+trace.add_atrace_async_begin(ts=110, tid=2, pid=2, buf='launchingActivity#1')
+trace.add_atrace_async_end(ts=210, tid=2, pid=2, buf='launchingActivity#1')
+trace.add_atrace_instant(
+ ts=211,
+ tid=2,
+ pid=2,
+ buf='launchingActivity#1:completed:com.google.android.calendar')
+
+sys.stdout.buffer.write(trace.trace.SerializeToString())
diff --git a/test/trace_processor/startup/index b/test/trace_processor/startup/index
index 1780fa8..ee6003e 100644
--- a/test/trace_processor/startup/index
+++ b/test/trace_processor/startup/index
@@ -2,6 +2,7 @@
# Startup metric tests.
android_startup.py android_startup android_startup.out
+android_startup_minsdk33.py android_startup android_startup_minsdk33.out
android_startup_breakdown.py android_startup android_startup_breakdown.out
android_startup_process_track.py android_startup android_startup_process_track.out
android_startup_attribution.py android_startup android_startup_attribution.out