• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1--
2-- Copyright 2019 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--     https://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--
16
17DROP TABLE IF EXISTS uid_package_count;
18
19CREATE TABLE uid_package_count AS
20SELECT uid, COUNT(1) AS cnt
21FROM package_list
22GROUP BY 1;
23
24DROP TABLE IF EXISTS process_metadata_table;
25
26CREATE TABLE process_metadata_table AS
27SELECT
28  process.upid,
29  -- workaround for b/169226092: the bug has been fixed it Android T, but
30  -- we support ingesting traces from older Android versions.
31  CASE
32      -- cmdline gets rewritten after fork, if these are still there we must
33      -- have seen a racy capture.
34    WHEN length(process.name) = 15 AND (
35      process.cmdline in ('zygote', 'zygote64', '<pre-initialized>')
36      OR process.cmdline GLOB '*' || process.name)
37    THEN process.cmdline
38    ELSE process.name
39  END AS process_name,
40  process.android_appid AS uid,
41  CASE WHEN uid_package_count.cnt > 1 THEN TRUE ELSE NULL END AS shared_uid,
42  plist.package_name,
43  plist.version_code,
44  plist.debuggable
45FROM process
46LEFT JOIN uid_package_count ON process.android_appid = uid_package_count.uid
47LEFT JOIN package_list plist
48ON (
49  process.android_appid = plist.uid
50  AND uid_package_count.uid = plist.uid
51  AND (
52    -- unique match
53    uid_package_count.cnt = 1
54    -- or process name starts with the package name
55    OR process.name GLOB plist.package_name || '*')
56  );
57
58DROP VIEW IF EXISTS process_metadata;
59
60CREATE VIEW process_metadata AS
61WITH upid_packages AS (
62  SELECT
63  upid,
64  RepeatedField(AndroidProcessMetadata_Package(
65    'package_name', package_list.package_name,
66    'apk_version_code', package_list.version_code,
67    'debuggable', package_list.debuggable
68  )) packages_for_uid
69  FROM process
70  JOIN package_list ON process.android_appid = package_list.uid
71  GROUP BY upid
72)
73SELECT
74  upid,
75  NULL_IF_EMPTY(AndroidProcessMetadata(
76    'name', process_name,
77    'uid', uid,
78    'package', NULL_IF_EMPTY(AndroidProcessMetadata_Package(
79      'package_name', package_name,
80      'apk_version_code', version_code,
81      'debuggable', debuggable
82    )),
83    'packages_for_uid', packages_for_uid
84  )) AS metadata
85FROM process_metadata_table
86LEFT JOIN upid_packages USING (upid);
87