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 -- TODO(b/169226092) remove this workaround 30 CASE 31 -- cmdline gets rewritten after fork, if these are still there we must 32 -- have seen a racy capture. 33 WHEN length(process.name) = 15 AND ( 34 process.cmdline in ('zygote', 'zygote64', '<pre-initialized>') 35 OR process.cmdline like '%' || process.name) 36 THEN process.cmdline 37 ELSE process.name 38 END AS process_name, 39 process.android_appid AS uid, 40 CASE WHEN uid_package_count.cnt > 1 THEN TRUE ELSE NULL END AS shared_uid, 41 plist.package_name, 42 plist.version_code, 43 plist.debuggable 44FROM process 45LEFT JOIN uid_package_count ON process.android_appid = uid_package_count.uid 46LEFT JOIN package_list plist 47ON ( 48 process.android_appid = plist.uid 49 AND uid_package_count.uid = plist.uid 50 AND ( 51 -- unique match 52 uid_package_count.cnt = 1 53 -- or process name starts with the package name 54 OR process.name LIKE plist.package_name || '%') 55 ); 56 57DROP VIEW IF EXISTS process_metadata; 58 59CREATE VIEW process_metadata AS 60WITH upid_packages AS ( 61 SELECT 62 upid, 63 RepeatedField(AndroidProcessMetadata_Package( 64 'package_name', package_list.package_name, 65 'apk_version_code', package_list.version_code, 66 'debuggable', package_list.debuggable 67 )) packages_for_uid 68 FROM process 69 JOIN package_list ON process.android_appid = package_list.uid 70 GROUP BY upid 71) 72SELECT 73 upid, 74 NULL_IF_EMPTY(AndroidProcessMetadata( 75 'name', process_name, 76 'uid', uid, 77 'package', NULL_IF_EMPTY(AndroidProcessMetadata_Package( 78 'package_name', package_name, 79 'apk_version_code', version_code, 80 'debuggable', debuggable 81 )), 82 'packages_for_uid', packages_for_uid 83 )) AS metadata 84FROM process_metadata_table 85LEFT JOIN upid_packages USING (upid); 86