Introducción y análisis de dumpsys en Android

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 dumpsys y 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:

  1. Inicialización: El binario dumpsys obtiene el IServiceManager mediante defaultServiceManager().
  2. Análisis de argumentos: Se procesan opciones como -l (listar), --skip (omitir servicios), --proto, etc.
  3. Obtención de lista de servicios: Se llama a sm_->listServices() y se ordena.
  4. Impresión de lista (si se solictia): Se muestran los nombres de los servicios activos, omitiendo los indicados en --skip.
  5. 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

7. Referencias

Etiquetas: Android dumpsys Binder system services debugging

Publicado el 7-7 20:29