Add relevant threads jank CUJ module to stdlib. (#4187)
As part of migrating the android_jank_cuj metric to stdlib, move the
dependent modules to stdlib first.
Bug: 400854991
Test: tools/diff_test_trace_processor.py --keep-input --name-filter
".*android_jank_cuj\b" out/linux_clang_debug/trace_processor_shell
diff --git a/Android.bp b/Android.bp
index df6e915..9311455 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15304,6 +15304,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/cujs/base.sql",
"src/trace_processor/perfetto_sql/stdlib/android/cujs/cuj_frame_counters.sql",
"src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/cujs/threads.sql",
"src/trace_processor/perfetto_sql/stdlib/android/desktop_mode.sql",
"src/trace_processor/perfetto_sql/stdlib/android/device.sql",
"src/trace_processor/perfetto_sql/stdlib/android/dumpsys/show_map.sql",
diff --git a/BUILD b/BUILD
index d15b4ab..d4f51cb 100644
--- a/BUILD
+++ b/BUILD
@@ -3312,6 +3312,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/cujs/base.sql",
"src/trace_processor/perfetto_sql/stdlib/android/cujs/cuj_frame_counters.sql",
"src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/cujs/threads.sql",
],
)
diff --git a/python/generators/sql_processing/stdlib_tags.py b/python/generators/sql_processing/stdlib_tags.py
index ddfda3d..d4197a6 100644
--- a/python/generators/sql_processing/stdlib_tags.py
+++ b/python/generators/sql_processing/stdlib_tags.py
@@ -116,8 +116,9 @@
'android.frame_blocking_calls.blocking_calls_aggregation': [
'android', 'ui'
],
- 'android.cujs.cujs_base': ['android', 'ui'],
+ 'android.cujs.base': ['android', 'ui'],
'android.cujs.sysui_cujs': ['android', 'ui'],
+ 'android.cujs.threads': ['android', 'ui'],
'android.input': ['android', 'ui', 'input'],
'android.screenshots': ['android', 'ui'],
'android.surfaceflinger': ['android', 'ui'],
diff --git a/src/trace_processor/metrics/sql/android/jank/android_jank_cuj_init.sql b/src/trace_processor/metrics/sql/android/jank/android_jank_cuj_init.sql
index 80d63a2..d9ce20e 100644
--- a/src/trace_processor/metrics/sql/android/jank/android_jank_cuj_init.sql
+++ b/src/trace_processor/metrics/sql/android/jank/android_jank_cuj_init.sql
@@ -23,7 +23,7 @@
-- and GPU completion threads.
-- Also stores the (not CUJ-specific) threads of SF: main, render engine,
-- and GPU completion threads.
-SELECT RUN_METRIC('android/jank/relevant_threads.sql');
+INCLUDE PERFETTO MODULE android.cujs.threads;
-- Create tables to store the main slices on each of the relevant threads
-- * `Choreographer#doFrame` on the main thread
diff --git a/src/trace_processor/metrics/sql/android/jank/relevant_slices.sql b/src/trace_processor/metrics/sql/android/jank/relevant_slices.sql
index 0434c68..d419061 100644
--- a/src/trace_processor/metrics/sql/android/jank/relevant_slices.sql
+++ b/src/trace_processor/metrics/sql/android/jank/relevant_slices.sql
@@ -13,9 +13,11 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE android.cujs.sysui_cujs;
+INCLUDE PERFETTO MODULE android.cujs.base;
INCLUDE PERFETTO MODULE android.surfaceflinger;
+SELECT RUN_METRIC('android/jank/relevant_threads.sql');
+
CREATE OR REPLACE PERFETTO FUNCTION vsync_from_name(slice_name STRING)
RETURNS STRING AS
SELECT CAST(STR_SPLIT($slice_name, " ", 1) AS INTEGER);
diff --git a/src/trace_processor/metrics/sql/android/jank/relevant_threads.sql b/src/trace_processor/metrics/sql/android/jank/relevant_threads.sql
index 1c03d9c..6b983e4 100644
--- a/src/trace_processor/metrics/sql/android/jank/relevant_threads.sql
+++ b/src/trace_processor/metrics/sql/android/jank/relevant_threads.sql
@@ -16,6 +16,7 @@
INCLUDE PERFETTO MODULE android.frames.timeline;
INCLUDE PERFETTO MODULE android.surfaceflinger;
INCLUDE PERFETTO MODULE slices.with_context;
+INCLUDE PERFETTO MODULE android.cujs.threads;
DROP TABLE IF EXISTS android_jank_cuj_main_thread;
CREATE PERFETTO TABLE android_jank_cuj_main_thread AS
@@ -28,23 +29,6 @@
-- Some CUJs use a dedicated thread for Choreographer callbacks
OR (cuj.ui_thread = thread.utid);
-CREATE OR REPLACE PERFETTO FUNCTION android_jank_cuj_app_thread(thread_name STRING)
-RETURNS TABLE(cuj_id INT, upid INT, utid INT, name STRING, track_id INT) AS
-SELECT
- cuj_id,
- cuj.upid,
- utid,
- thread.name,
- thread_track.id AS track_id
-FROM thread
-JOIN android_jank_cuj cuj USING (upid)
-JOIN thread_track USING (utid)
-WHERE thread.name = $thread_name;
-
-DROP TABLE IF EXISTS android_jank_cuj_render_thread;
-CREATE PERFETTO TABLE android_jank_cuj_render_thread AS
-SELECT * FROM ANDROID_JANK_CUJ_APP_THREAD('RenderThread');
-
DROP TABLE IF EXISTS android_jank_cuj_gpu_completion_thread;
CREATE PERFETTO TABLE android_jank_cuj_gpu_completion_thread AS
SELECT * FROM ANDROID_JANK_CUJ_APP_THREAD('GPU completion');
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/cujs/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/android/cujs/BUILD.gn
index 9fdc217..b7347b8 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/cujs/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/android/cujs/BUILD.gn
@@ -19,5 +19,6 @@
"base.sql",
"cuj_frame_counters.sql",
"sysui_cujs.sql",
+ "threads.sql",
]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/cujs/threads.sql b/src/trace_processor/perfetto_sql/stdlib/android/cujs/threads.sql
new file mode 100644
index 0000000..3e0bce5
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/android/cujs/threads.sql
@@ -0,0 +1,65 @@
+--
+-- Copyright 2025 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.
+
+INCLUDE PERFETTO MODULE android.cujs.base;
+
+-- Returns a table with all CUJs and an additional column for the track id of thread_name
+-- passed as parameter, if present in the same process of the cuj.
+CREATE PERFETTO FUNCTION android_jank_cuj_app_thread(
+ -- Name of the thread for which information needs to be extracted.
+ thread_name STRING
+)
+RETURNS TABLE (
+ -- Unique incremental ID for each CUJ.
+ cuj_id LONG,
+ -- process id.
+ upid JOINID(process.id),
+ -- thread id of the input thread.
+ utid LONG,
+ -- name of the thread.
+ name STRING,
+ -- track id associated with the thread.
+ track_id LONG
+) AS
+SELECT
+ cuj_id,
+ cuj.upid,
+ utid,
+ thread.name,
+ thread_track.id AS track_id
+FROM thread
+JOIN android_jank_cuj AS cuj
+ USING (upid)
+JOIN thread_track
+ USING (utid)
+WHERE
+ thread.name = $thread_name;
+
+-- Table captures thread information for 'RenderThread' for all CUJs.
+CREATE PERFETTO TABLE android_jank_cuj_render_thread (
+ -- Unique incremental ID for each CUJ.
+ cuj_id LONG,
+ -- process id.
+ upid JOINID(process.id),
+ -- thread id of the main/UI thread.
+ utid JOINID(thread.id),
+ -- thread name.
+ name STRING,
+ -- track_id for the thread.
+ track_id JOINID(track.id)
+) AS
+SELECT
+ *
+FROM android_jank_cuj_app_thread('RenderThread');