Descubra el ID del proceso en ejecución por nombre del paquete

Estoy trabajando en un script en el que necesito proporcionar el PID de mi aplicación. Puedo enumerar todos los procesos con sus PID siguiendo el comando y podría ver la entrada de mi aplicación.

adb shell ps

Esto me da una gran lista de procesos. Y necesito una sola entrada (que además puedo suministrar a otro comando), así que quiero filtrar estos resultados con un nombre de paquete. El comando grep no funciona en mi máquina de Windows. También intenté seguir el comando pero no ayudó.

adb shell ps nombre: my_app_package

Desde Android 7.0, la forma más sencilla de averiguar el ID del proceso por nombre del paquete es usar el comando pidof :

 usage: pidof [-s] [-o omitpid[,omitpid...]] [NAME]... Print the PIDs of all processes with the given names. -s single shot, only return one pid. -o omit PID(s) 

Simplemente ejecútelo así:

 adb shell pidof my.app.package 

En Android, antes de las 7.0, las personas usaban el comando ps y luego analizaban su salida usando el filtro incorporado por valor de comm (que para las aplicaciones de Android son los últimos 15 caracteres del nombre del paquete) o grep . El filtro de comm no funcionó si los últimos 15 caracteres del nombre comenzaron con un dígito y el grep no se incluyó de manera predeterminada hasta Android 4.2. Pero incluso después de encontrar la línea de proceso adecuada, el valor de PID aún tenía que ser extraído.

Hubo múltiples formas de hacer eso. Aquí es cómo encontrar el proceso y extraer el PID podría hacerse con un solo comando sed :

 adb shell "ps | sed -n 's/^[^ ]* *\([0-9]*\).* my\.app\.package$/\1/p'" 

Una vez más, el problema es que sed no estaba incluido por defecto hasta Android 6.0.

Pero si debe usar un dispositivo anterior, siempre puede usar la siguiente solución independiente de la versión de Android. No usa comandos externos, solo complementos de shell Android:

 adb shell "for p in /proc/[0-9]*; do [[ $(< $p/cmdline) = my.app.package ]] && echo ${p##*/}; done" 

La razón más popular para buscar un PID es usarlo en algún otro comando como kill . Digamos que tenemos varias instancias de logcat de logcat y queremos finalizarlas todas de forma elegante a la vez. Simplemente reemplace el echo con kill -2 en el último comando:

 adb shell "for p in /proc/[0-9]*; do [[ $(< $p/cmdline) = logcat ]] && kill -2 ${p##*/}; done" 

Reemplazar " con ' si ejecuta los comandos desde el shell de Linux / OSX.

En lugar de usar adb shell ps , primero ingrese adb shell y luego use ps .

Paso a paso:

  1. Ingrese el comando adb shell mientras un dispositivo (o emulador) está conectado.
    (El prefijo de la línea de comando será shell@android:/ $ después de ejecutar este comando).

  2. Ingrese ps | grep ps | grep (es decir, ps | grep com.google ).

 C:> adb shell shell@android:/ $ ps | grep com.google u0_a64 3353 2467 903744 52904 ffffffff 00000000 S com.google.process.location u0_a64 3426 2467 893964 49452 ffffffff 00000000 S com.google.process.gapps 

Los procesos mostrados por ps pueden limitarse a aquellos que pertenecen a cualquier usuario dado al canalizar la salida a través de grep, un filtro que se usa para buscar texto. Por ejemplo, los procesos que pertenecen a un usuario con un nombre de usuario adam pueden mostrarse con lo siguiente:

 ps -ef | grep adam 

La opción -e genera una lista de información sobre cada proceso que se ejecuta actualmente. La opción -f genera una lista que contiene menos elementos de información para cada proceso que la opción -l.