| # Copyright (C) 2010 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 |
| # |
| # http://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. |
| # |
| |
| # Extract the pid of a given package name. This assumes that the |
| # input is the product of 'adb shell ps' with all \r\n line endings |
| # converted to \n, and that the PACKAGE variable has been initialized |
| # to the package's name. In other words, this should be used as: |
| # |
| # adb shell ps | awk -f <this-script> -v PACKAGE=<name> |
| # |
| # The printed value will be 0 if the package is not found. |
| # |
| |
| BEGIN { |
| FS=" " |
| |
| # A default package name, used _only_ for unit-testing |
| # com.google.android.apps.maps is interesting because |
| # in our unit test input files, 'ps' lists several sub-processes |
| # that implement services (e.g. com.google.android.apps.maps:<something>) |
| # and we explicitely don't want to match them. |
| # |
| if (PACKAGE == "") { |
| PACKAGE="com.google.android.apps.maps" |
| } |
| |
| PID=0 |
| |
| # The default column where we expect the PID to appear, this |
| # matches the default Android toolbox 'ps', but some devices seem |
| # to have a different version installed (e.g. Busybox) that place |
| # it somewhere else. We will probe the output to detect this, but |
| # this is a good fallback value. |
| PID_COLUMN=2 |
| } |
| |
| { |
| # First, remove any trailing \r from the input line. This is important |
| # because the output of "adb shell <cmd>" seems to use \r\n line ending. |
| gsub("\r","",$NF) |
| |
| if (NR == 1) { |
| # The first line of the 'ps' output should list the columns, so we're going |
| # to parse it to try to update PID_COLUMN |
| for (n = 1; n <= NF; n++) { |
| if ($n == "PID") { |
| PID_COLUMN=n; |
| } |
| } |
| } else { |
| # Not the first line, compare the package name, which shall always |
| # be the last field. |
| if ($NF == PACKAGE) { |
| PID=$PID_COLUMN |
| } |
| } |
| } |
| |
| END { |
| print PID |
| } |