android - adb shell Logcat con nombre del paquete
(3)
¿Es posible mostrar también el Nombre del paquete de registro en cada línea?
Utilizando
logcat -v largo
deja exactamente el campo del nombre del paquete (después del PID) vacío.
Quiero filtrar los registros de una aplicación específica con diferentes etiquetas, preguntándome si es posible.
Este es mi guión. Un poco oxidado pero sigue funcionando.
PID=`adb shell ps | grep -i <your package name> | cut -c10-15`;
adb logcat | grep $PID
En realidad, tengo un script de Python para agregar más colores y un ciclo while para seguir monitoreando ese proceso cuando se reinicia, pero creo que entenderás el punto.
logcat
registro
logcat
no tiene un "campo de nombre de paquete".
Por lo tanto, no hay una forma estándar / integrada de filtrar por él.
Aunque desde Android 7.0 puede usar la opción
logcat --pid
combinada con el comando
pidof -s
para filtrar la salida por nombre binario / paquete:
adb shell "logcat --pid=$(pidof -s <package_name>)"
Reemplace
"
con
''
para Linux / MacOS
Opción 1
Ingrese estos línea por línea:
adb shell
su
bash
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d '':'' -f 2 | sed ''s/^/(.*/)$/echo /"/$/(echo /1/) /$/(pidof /1/)/";/''))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE/n$PROC_PID_LIST_CACHE")
function pid2pkg() { pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d '' '' -f1 | head -1); if [ "$pkgName" != "" ] ; then echo $pkgName; else echo "*NOT RUNNING*"; fi }
eval "$(logcat -d | sed -r -e ''s/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)//2 /$/(pid2pkg /3/) /5/g'' | sed -r -e ''s/(.+)/echo -e /"/1/"/g'')"
La salida de logcat tendrá el siguiente formato:
[Time] [Name] [Type] [Message]
Ejemplo:
14:34:59.386 wpa_supplicant E wpa_supplicant: nl80211: Failed to set IPv4 unicast in multicast filter
14:35:02.231 com.android.phone D TelephonyProvider: subIdString = 1 subId = 1
14:35:03.469 [email protected] E WifiHAL : wifi_get_logger_supported_feature_set: Error -3 happened.
14:35:03.518 system_server I WifiService: getWifiApEnabledState uid=10086
14:35:03.519 dev.ukanth.ufirewall D AFWall : isWifiApEnabled is false
14:35:03.520 system_server I GnssLocationProvider: WakeLock released by handleMessage(UPDATE_NETWORK_STATE, 0, 123)
14:35:03.522 dev.ukanth.ufirewall I AFWall : Now assuming wifi connection
Algunos procesos del sistema no tienen paquetes.
system_server
y
wpa_supplicant
por ejemplo.
Si no se puede encontrar el nombre de un paquete, se mostrará el nombre del proceso.
Advertencias :
Si el proceso detrás de cierto PID ya no se ejecuta, ya no puede obtener el nombre del paquete / proceso.
Después de que un proceso salga o que su dispositivo se reinicie, los PID pueden asignarse a procesos completamente diferentes.
Por lo tanto, es posible que desee comprobar durante cuánto tiempo se ha estado ejecutando el proceso:
ps -e -o pid -o stime -o name
opcion 2
Si desea que el formato sea un poco más legible, puede copiar mi script de registro en su dispositivo y ejecutarlo:
better_logging.sh
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d '':'' -f 2 | sed ''s/^/(.*/)$/echo /"/$/(echo /1/) /$/(pidof /1/)/";/''))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE/n$PROC_PID_LIST_CACHE")
MAX_LEN=$(echo "$PID_LIST_CACHE" | cut -d '' '' -f1 | awk ''{ if ( length > L ) { L=length} }END{ print L}'')
function pid2pkg() {
pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d '' '' -f1 | head -1);
if [ "$pkgName" != "" ] ; then
printf "%-${MAX_LEN}s" "$pkgName";
else
printf "%-${MAX_LEN}s" "<UNKNOWN (NOT RUNNING)>";
fi
}
eval "$(/
logcat -d | /
sed -r -e ''s/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)//2/ $/(pid2pkg /3/) /5/g'' | /
sed -r -e ''s/(.+)/echo -e /"/1/"/g'' /
)" | /
awk ''
function color(c,s) {
printf("/033[%dm%s/033[0m/n",90+c,s)
}
/ E / {color(1,$0);next}
/ D / {color(2,$0);next}
/ W / {color(3,$0);next}
/ I / {color(4,$0);next}
{print}
''
Para copiarlo y ejecutarlo, puede usar:
adb push better_logging.sh /sdcard/better_logging.sh
adb shell "bash /sdcard/better_logging.sh"
La salida se verá así: