1. Propósito y contexto
Dumpsys es una herramienta de línea de comandos que permite extraer información detallada de los servicios del sistema Android. Su comprensión es clave para depurar problemas, analizar el estado del sistema y diseñar nuevas funcionalidaeds. Este artículo explica su funcionamiento interno, basado en Android 12 sobre plataforma SL8541E SPRD.
2. Conceptos fundamentales
- Dumpsys: Ejecutable que se invoca mediante
adb shell dumpsysy que muestra diagnósticos de todos los servicios del sistema o de uno en particular. - Binder: Mecanismo de comunicación entre procesos (IPC) en Android. Permite enviar mensajes, sincronizar y compartir memoria entre aplicaciones y servicios.
- Pipe (tubería): Método de IPC que utiliza un buffer en el kernel. Se accede mediante descriptores de archivo. Puede ser anónimo (solo entre procesos padre-hijo) o con nombre (sin relación previa). En dumpsys se usan pipes para transferir datos desde el servicio hacia el proceso dumpsys.
3. Uso básico de dumpsys
La sintaxis general es:
adb shell dumpsys [-t timeout] [--help | -l | --skip servicios | servicio [argumentos] | -c | -h]
Ejemplos:
- Listar todos los servicios:
adb shell dumpsys -l - Obtener estado de la batería:
adb shell dumpsys battery - Especificar timeout:
adb shell dumpsys -t 5 activity
4. Flujo interno de dumpsys
El proceso se puede dividir en las siguientes etapas:
- Inicialización: El binario
dumpsysobtiene elIServiceManagermediantedefaultServiceManager(). - Análisis de argumentos: Se procesan opciones como
-l(listar),--skip(omitir servicios),--proto, etc. - Obtención de lista de servicios: Se llama a
sm_->listServices()y se ordena. - Impresión de lista (si se solictia): Se muestran los nombres de los servicios activos, omitiendo los indicados en
--skip. - Volcado de cada servicio:
- Se crea un pipe.
- Se lanza un hilo que invoca
service->dump(remote_end, args). - El hilo principal lee del pipe mediante
poll()y escribe en la salida estándar. - Si se supera el timeout, se interrumpe.
- Al terminar, se liberan los recursos.
5. Ejemplo detallado: Servicio de batería
Cuando se ejecuta adb shell dumpsys battery, el servicio BatteryService responde con su volcado. El método dump() en el binder verifica permisos y llama al método interno dumpInternal() que imprime información como:
- Estado AC, USB, carga inalámbrica
- Corriente máxima de carga, voltaje
- Nivel de batería, temperatura, tecnología
Fragmento representativo del código (reescrito):
private void volcarEstado(FileDescriptor fd, PrintWriter pw, String[] args) {
synchronized (monitor) {
if (args == null || args.length == 0 || "-a".equals(args[0])) {
pw.println("Estado actual del servicio de batería:");
if (actualizacionesDetenidas) {
pw.println(" (ACTUALIZACIONES DETENIDAS)");
}
pw.println(" Alimentación AC: " + infoSalud.enchufadoAC);
pw.println(" Alimentación USB: " + infoSalud.enchufadoUSB);
pw.println(" Nivel: " + infoSalud.nivelBateria);
// ... otros campos
}
}
}
6. Comandos dumpsys de uso frecuente
| Servicio | Comando | Información |
|---|---|---|
| activity | adb shell dumpsys activity |
Estado del gestor de actividades (AMS) |
| package | adb shell dumpsys package |
Información del gestor de paquetes (PMS) |
| window | adb shell dumpsys window |
Ventanas y pantalla (WMS) |
| input | adb shell dumpsys input |
Dispositivos de entrada (IMS) |
| power | adb shell dumpsys power |
Estado de energía (PowerManager) |
| batterystats | adb shell dumpsys batterystats |
Estadísticas de batería |
| battery | adb shell dumpsys battery |
Estado actual de la batería |
| procstats | adb shell dumpsys procstats |
Estadísticas de procesos |
| meminfo | adb shell dumpsys meminfo |
Uso de memoria |