• 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 
26 BEGIN {
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 
71 END {
72     print PID
73 }
74