aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/metrics/sql/android/process_metadata.sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_processor/metrics/sql/android/process_metadata.sql')
-rw-r--r--src/trace_processor/metrics/sql/android/process_metadata.sql86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/trace_processor/metrics/sql/android/process_metadata.sql b/src/trace_processor/metrics/sql/android/process_metadata.sql
new file mode 100644
index 000000000..7167e1282
--- /dev/null
+++ b/src/trace_processor/metrics/sql/android/process_metadata.sql
@@ -0,0 +1,86 @@
+--
+-- Copyright 2019 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 TABLE IF EXISTS uid_package_count;
+
+CREATE TABLE uid_package_count AS
+SELECT uid, COUNT(1) AS cnt
+FROM package_list
+GROUP BY 1;
+
+DROP TABLE IF EXISTS process_metadata_table;
+
+CREATE TABLE process_metadata_table AS
+SELECT
+ process.upid,
+ -- workaround for b/169226092: the bug has been fixed it Android T, but
+ -- we support ingesting traces from older Android versions.
+ CASE
+ -- cmdline gets rewritten after fork, if these are still there we must
+ -- have seen a racy capture.
+ WHEN length(process.name) = 15 AND (
+ process.cmdline in ('zygote', 'zygote64', '<pre-initialized>')
+ OR process.cmdline GLOB '*' || process.name)
+ THEN process.cmdline
+ ELSE process.name
+ END AS process_name,
+ process.android_appid AS uid,
+ CASE WHEN uid_package_count.cnt > 1 THEN TRUE ELSE NULL END AS shared_uid,
+ plist.package_name,
+ plist.version_code,
+ plist.debuggable
+FROM process
+LEFT JOIN uid_package_count ON process.android_appid = uid_package_count.uid
+LEFT JOIN package_list plist
+ON (
+ process.android_appid = plist.uid
+ AND uid_package_count.uid = plist.uid
+ AND (
+ -- unique match
+ uid_package_count.cnt = 1
+ -- or process name starts with the package name
+ OR process.name GLOB plist.package_name || '*')
+ );
+
+DROP VIEW IF EXISTS process_metadata;
+
+CREATE VIEW process_metadata AS
+WITH upid_packages AS (
+ SELECT
+ upid,
+ RepeatedField(AndroidProcessMetadata_Package(
+ 'package_name', package_list.package_name,
+ 'apk_version_code', package_list.version_code,
+ 'debuggable', package_list.debuggable
+ )) packages_for_uid
+ FROM process
+ JOIN package_list ON process.android_appid = package_list.uid
+ GROUP BY upid
+)
+SELECT
+ upid,
+ NULL_IF_EMPTY(AndroidProcessMetadata(
+ 'name', process_name,
+ 'uid', uid,
+ 'package', NULL_IF_EMPTY(AndroidProcessMetadata_Package(
+ 'package_name', package_name,
+ 'apk_version_code', version_code,
+ 'debuggable', debuggable
+ )),
+ 'packages_for_uid', packages_for_uid
+ )) AS metadata
+FROM process_metadata_table
+LEFT JOIN upid_packages USING (upid);