• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (C) 2010 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15
16# Extract the pid of a given package name. This assumes that the
17# input is the product of 'adb shell ps' with all \r\n line endings
18# converted to \n, and that the PACKAGE variable has been initialized
19# to the package's name. In other words, this should be used as:
20#
21#   adb shell ps | awk -f <this-script> -v PACKAGE=<name>
22#
23# The printed value will be 0 if the package is not found.
24#
25
26BEGIN {
27    FS=" "
28
29    # A default package name, used _only_ for unit-testing
30    # com.google.android.apps.maps is interesting because
31    # in our unit test input files, 'ps' lists several sub-processes
32    # that implement services (e.g. com.google.android.apps.maps:<something>)
33    # and we explicitely don't want to match them.
34    #
35    if (PACKAGE == "") {
36        PACKAGE="com.google.android.apps.maps"
37    }
38
39    PID=0
40
41    # The default column where we expect the PID to appear, this
42    # matches the default Android toolbox 'ps', but some devices seem
43    # to have a different version installed (e.g. Busybox) that place
44    # it somewhere else. We will probe the output to detect this, but
45    # this is a good fallback value.
46    PID_COLUMN=2
47}
48
49{
50    # First, remove any trailing \r from the input line. This is important
51    # because the output of "adb shell <cmd>" seems to use \r\n line ending.
52    gsub("\r","",$NF)
53
54    if (NR == 1) {
55        # The first line of the 'ps' output should list the columns, so we're going
56        # to parse it to try to update PID_COLUMN
57        for (n = 1; n <= NF; n++) {
58            if ($n == "PID") {
59                PID_COLUMN=n;
60            }
61        }
62    } else {
63        # Not the first line, compare the package name, which shall always
64        # be the last field.
65    if ($NF == PACKAGE) {
66        PID=$PID_COLUMN
67        }
68    }
69}
70
71END {
72    print PID
73}
74