dumpsys

La herramienta dumpsys se ejecuta en dispositivos Android y proporciona información sobre los servicios del sistema. Llama dumpsys desde la línea de comandos usando Android Debug Bridge (ADB) a fin de obtener un resultado de diagnóstico para todos los servicios del sistema que se ejecutan en un dispositivo conectado.

Este resultado suele ser más detallado de lo que deseas, por lo que debes usar las opciones de la línea de comandos de esta página para obtener solo los servicios del sistema que desees. En esta página, también se describe cómo usar dumpsys para realizar tareas comunes, como la inspección de diagnósticos de entradas, RAM, batería o red.

Sintaxis

La sintaxis general para usar el comando dumpsys es la siguiente:

 adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]

Para obtener un diagnóstico de todos los servicios del sistema de tu dispositivo conectado, ejecuta adb shell dumpsys. Sin embargo, obtendrás mucha más información de la que normalmente desearías. Para obtener resultados más fáciles de administrar, en el comando, especifica el servicio que deseas examinar. Por ejemplo, el siguiente comando proporciona datos del sistema para componentes de entrada, como pantallas táctiles o teclados integrados:

adb shell dumpsys input

Para obtener una lista completa de los servicios del sistema que puedes usar con dumpsys, usa el siguiente comando:

adb shell dumpsys -l

Opciones de línea de comandos

En la siguiente tabla, se incluyen las opciones que tienes disponibles cuando usas dumpsys:

Tabla 1: Lista de opciones disponibles para dumpsys

Opción Descripción
-t timeout Especifica el tiempo de espera en segundos. Si no se especifica, el valor predeterminado es 10 segundos.
--help Imprime el texto de ayuda de la herramienta dumpsys.
-l Muestra una lista completa de los servicios del sistema que puedes usar con dumpsys.
--skip services Especifica el services que no deseas incluir en el resultado.
service [arguments] Especifica el service que deseas generar. Algunos servicios pueden permitirte pasar arguments opcionales. Para obtener información sobre estos argumentos opcionales, pasa la opción -h con el servicio:
adb shell dumpsys procstats -h
    
-c Cuando especifiques ciertos servicios, agrega esta opción para obtener datos en un formato compatible con computadoras.
-h Para ciertos servicios, agrega esta opción para ver el texto de ayuda y obtener opciones adicionales.

Cómo inspeccionar diagnósticos de entradas

Cuando especificas el servicio input, como se muestra en el siguiente comando, se vuelca el estado de los dispositivos de entrada del sistema, como teclados y pantallas táctiles, y el procesamiento de eventos de entrada.

adb shell dumpsys input

El resultado varía según la versión de Android que se ejecuta en el dispositivo conectado. En las siguientes secciones, se describe el tipo de información que sueles ver.

Estado del concentrador de eventos

A continuación, se muestra lo que puedes ver cuando inspeccionas el estado del centro de eventos del diagnóstico de entrada:

INPUT MANAGER (dumpsys input)

Event Hub State:
  BuiltInKeyboardId: -2
  Devices:
    -1: Virtual
      Classes: 0x40000023
      Path: 
      Descriptor: a718a782d34bc767f4689c232d64d527998ea7fd
      Location:
      ControllerNumber: 0
      UniqueId: 
      Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: /system/usr/keylayout/Generic.kl
      KeyCharacterMapFile: /system/usr/keychars/Virtual.kcm
      ConfigurationFile:
      HaveKeyboardLayoutOverlay: false
    1: msm8974-taiko-mtp-snd-card Headset Jack
      Classes: 0x00000080
      Path: /dev/input/event5
      Descriptor: c8e3782483b4837ead6602e20483c46ff801112c
      Location: ALSA
      ControllerNumber: 0
      UniqueId:
      Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile:
      KeyCharacterMapFile:
      ConfigurationFile:
      HaveKeyboardLayoutOverlay: false
    2: msm8974-taiko-mtp-snd-card Button Jack
      Classes: 0x00000001
      Path: /dev/input/event4
      Descriptor: 96fe62b244c555351ec576b282232e787fb42bab
      Location: ALSA
      ControllerNumber: 0
      UniqueId:
      Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: /system/usr/keylayout/msm8974-taiko-mtp-snd-card_Button_Jack.kl
      KeyCharacterMapFile: /system/usr/keychars/msm8974-taiko-mtp-snd-card_Button_Jack.kcm
      ConfigurationFile:
      HaveKeyboardLayoutOverlay: false
    3: hs_detect
      Classes: 0x00000081
      Path: /dev/input/event3
      Descriptor: 485d69228e24f5e46da1598745890b214130dbc4
      Location:
      ControllerNumber: 0
      UniqueId:
      Identifier: bus=0x0000, vendor=0x0001, product=0x0001, version=0x0001
      KeyLayoutFile: /system/usr/keylayout/hs_detect.kl
      KeyCharacterMapFile: /system/usr/keychars/hs_detect.kcm
      ConfigurationFile:
      HaveKeyboardLayoutOverlay: false
...

Estado del lector de entrada

InputReader se ocupa de decodificar los eventos de entrada del kernel. Su volcado del estado muestra información sobre cómo se configura cada dispositivo de entrada y los cambios de estado que se produjeron recientemente, como presionar o tocar teclas en la pantalla táctil.

En el siguiente ejemplo, se muestra el resultado para una pantalla táctil. Ten en cuenta la información sobre la resolución del dispositivo y los parámetros de calibración que se utilizaron.

Input Reader State
...
  Device 6: Melfas MMSxxx Touchscreen
      IsExternal: false
      Sources: 0x00001002
      KeyboardType: 0
      Motion Ranges:
        X: source=0x00001002, min=0.000, max=719.001, flat=0.000, fuzz=0.999
        Y: source=0x00001002, min=0.000, max=1279.001, flat=0.000, fuzz=0.999
        PRESSURE: source=0x00001002, min=0.000, max=1.000, flat=0.000, fuzz=0.000
        SIZE: source=0x00001002, min=0.000, max=1.000, flat=0.000, fuzz=0.000
        TOUCH_MAJOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000
        TOUCH_MINOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000
        TOOL_MAJOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000
        TOOL_MINOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000
      Touch Input Mapper:
        Parameters:
          GestureMode: spots
          DeviceType: touchScreen
          AssociatedDisplay: id=0, isExternal=false
          OrientationAware: true
        Raw Touch Axes:
          X: min=0, max=720, flat=0, fuzz=0, resolution=0
          Y: min=0, max=1280, flat=0, fuzz=0, resolution=0
          Pressure: min=0, max=255, flat=0, fuzz=0, resolution=0
          TouchMajor: min=0, max=30, flat=0, fuzz=0, resolution=0
          TouchMinor: unknown range
          ToolMajor: unknown range
          ToolMinor: unknown range
          Orientation: unknown range
          Distance: unknown range
          TiltX: unknown range
          TiltY: unknown range
          TrackingId: min=0, max=65535, flat=0, fuzz=0, resolution=0
          Slot: min=0, max=9, flat=0, fuzz=0, resolution=0
        Calibration:
          touch.size.calibration: diameter
          touch.size.scale: 10.000
          touch.size.bias: 0.000
          touch.size.isSummed: false
          touch.pressure.calibration: amplitude
          touch.pressure.scale: 0.005
          touch.orientation.calibration: none
          touch.distance.calibration: none
        SurfaceWidth: 720px
        SurfaceHeight: 1280px
        SurfaceOrientation: 0
        Translation and Scaling Factors:
          XScale: 0.999
          YScale: 0.999
          XPrecision: 1.001
          YPrecision: 1.001
          GeometricScale: 0.999
          PressureScale: 0.005
          SizeScale: 0.033
          OrientationCenter: 0.000
          OrientationScale: 0.000
          DistanceScale: 0.000
          HaveTilt: false
          TiltXCenter: 0.000
          TiltXScale: 0.000
          TiltYCenter: 0.000
          TiltYScale: 0.000
        Last Button State: 0x00000000
        Last Raw Touch: pointerCount=0
        Last Cooked Touch: pointerCount=0

Al final del volcado de estado del lector de entrada, hay información sobre los parámetros de configuración global, como el intervalo de toques:

Configuration:
  ExcludedDeviceNames: []
  VirtualKeyQuietTime: 0.0ms
  PointerVelocityControlParameters: scale=1.000, lowThreshold=500.000, highThreshold=3000.000, acceleration=3.000
  WheelVelocityControlParameters: scale=1.000, lowThreshold=15.000, highThreshold=50.000, acceleration=4.000
  PointerGesture:
    Enabled: true
    QuietInterval: 100.0ms
    DragMinSwitchSpeed: 50.0px/s
    TapInterval: 150.0ms
    TapDragInterval: 300.0ms
    TapSlop: 20.0px
    MultitouchSettleInterval: 100.0ms
    MultitouchMinDistance: 15.0px
    SwipeTransitionAngleCosine: 0.3
    SwipeMaxWidthRatio: 0.2
    MovementSpeedRatio: 0.8
    ZoomSpeedRatio: 0.3

Estado del despachador de entrada

InputDispatcher se ocupa de enviar eventos de entrada a las aplicaciones. Como se muestra en el siguiente resultado de muestra, su volcado de estado muestra información sobre qué ventana se está tocando, el estado de la cola de entrada, si hay una ANR en curso y otra información sobre eventos de entrada:

Input Dispatcher State:
  DispatchEnabled: 1
  DispatchFrozen: 0
  FocusedApplication: <null>
  FocusedWindow: name='Window{3fb06dc3 u0 StatusBar}'
  TouchStates: <no displays touched>
  Windows:
    0: name='Window{357bbbfe u0 SearchPanel}', displayId=0, paused=false, hasFocus=false, hasWallpaper=false, visible=false, canReceiveKeys=false, flags=0x01820100, type=0x000007e8, layer=211000, frame=[0,0][1080,1920], scale=1.000000, touchableRegion=[0,0][1080,1920], inputFeatures=0x00000000, ownerPid=22674, ownerUid=10020, dispatchingTimeout=5000.000ms
    1: name='Window{3b14c0ca u0 NavigationBar}', displayId=0, paused=false, hasFocus=false, hasWallpaper=false, visible=false, canReceiveKeys=false, flags=0x01840068, type=0x000007e3, layer=201000, frame=[0,1776][1080,1920], scale=1.000000, touchableRegion=[0,1776][1080,1920], inputFeatures=0x00000000, ownerPid=22674, ownerUid=10020, dispatchingTimeout=5000.000ms
    2: name='Window{2c7e849c u0 com.vito.lux}', displayId=0, paused=false, hasFocus=false, hasWallpaper=false, visible=true, canReceiveKeys=false, flags=0x0089031a, type=0x000007d6, layer=191000, frame=[-495,-147][1575,1923], scale=1.000000, touchableRegion=[-495,-147][1575,1923], inputFeatures=0x00000000, ownerPid=4697, ownerUid=10084, dispatchingTimeout=5000.000ms
    ...
  MonitoringChannels:
    0: 'WindowManager (server)'
  RecentQueue: length=10
    MotionEvent(deviceId=4, source=0x00001002, action=2, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, displayId=0, pointers=[0: (335.0, 1465.0)]), policyFlags=0x62000000, age=217264.0ms
    MotionEvent(deviceId=4, source=0x00001002, action=1, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, displayId=0, pointers=[0: (335.0, 1465.0)]), policyFlags=0x62000000, age=217255.7ms
    MotionEvent(deviceId=4, source=0x00001002, action=0, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, displayId=0, pointers=[0: (330.0, 1283.0)]), policyFlags=0x62000000, age=216805.0ms
    ...
  PendingEvent: <none>
  InboundQueue: <empty>
  ReplacedKeys: <empty>
  Connections:
    0: channelName='WindowManager (server)', windowName='monitor', status=NORMAL, monitor=true, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    1: channelName='278c1d65 KeyguardScrim (server)', windowName='Window{278c1d65 u0 KeyguardScrim}', status=NORMAL, monitor=false, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    2: channelName='357bbbfe SearchPanel (server)', windowName='Window{357bbbfe u0 SearchPanel}', status=NORMAL, monitor=false, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    ...
  AppSwitch: not pending
    7: channelName='2280455f com.google.android.gm/com.google.android.gm.ConversationListActivityGmail (server)', windowName='Window{2280455f u0 com.google.android.gm/com.google.android.gm.ConversationListActivityGmail}', status=NORMAL, monitor=false, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    8: channelName='1a7be08a com.android.systemui/com.android.systemui.recents.RecentsActivity (server)', windowName='Window{1a7be08a u0 com.android.systemui/com.android.systemui.recents.RecentsActivity EXITING}', status=NORMAL, monitor=false, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    9: channelName='3b14c0ca NavigationBar (server)', windowName='Window{3b14c0ca u0 NavigationBar}', status=NORMAL, monitor=false, inputPublisherBlocked=false
      OutboundQueue: <empty>
      WaitQueue: <empty>
    ...
  Configuration:
    KeyRepeatDelay: 50.0ms
    KeyRepeatTimeout: 500.0ms

Elementos que debes comprobar

La siguiente es una lista de aspectos que se deben tener en cuenta cuando inspeccionas el resultado del servicio input:

Estado del concentrador de eventos:

  • Todos los dispositivos de entrada que esperas deben estar presentes.
  • Cada dispositivo de entrada debe tener su correspondiente archivo de diseño de clave, archivo de mapa de caracteres clave y archivo de configuración del dispositivo de entrada. Si faltan archivos o estos tienen errores de sintaxis, no se cargarán.
  • Cada dispositivo de entrada debe estar correctamente clasificado. Los bits del campo Classes corresponden a marcas en EventHub.h, como INPUT_DEVICE_CLASS_TOUCH_MT.
  • El BuiltInKeyboardId es correcto. Si el dispositivo no tiene un teclado integrado, el ID debe ser -2. De lo contrario, debería ser el ID del teclado integrado.
    • Si observas que BuiltInKeyboardId no es -2, pero debería serlo, quiere decir que te falta un archivo de mapa de caracteres clave para un teclado de funciones especiales. Los dispositivos de teclado de funciones especiales deben tener archivos de mapa de caracteres clave que contengan solo la línea type SPECIAL_FUNCTION.

Estado del lector de entrada:

  • Todos los dispositivos de entrada esperados deben estar presentes.
  • Cada dispositivo de entrada debe estar configurado correctamente. En particular, verifica que la pantalla táctil y los ejes del joystick sean correctos.

Estado del despachador de entrada:

  • Todos los eventos de entrada se deben procesar según lo esperado.
  • Después de tocar la pantalla táctil y ejecutar dumpsys al mismo tiempo, la línea TouchStates debe identificar correctamente la ventana que tocas.

Cómo probar el rendimiento de IU

Cuando se especifica el servicio gfxinfo, se obtiene información de rendimiento relacionada con los fotogramas de animación que ocurren durante la fase de grabación. El siguiente comando usa gfxinfo para recopilar datos de rendimiento de la IU de un nombre de paquete especificado:

adb shell dumpsys gfxinfo package-name

También puedes incluir la opción framestats a fin de proporcionar información de latencia aún más detallada de los fotogramas recientes. De esa forma, puedes buscar y depurar problemas con mayor precisión, como se muestra a continuación:

adb shell dumpsys gfxinfo package-name framestats

Si deseas obtener más información para usar gfxinfo y framestats a fin de integrar las mediciones de rendimiento de la IU en tus prácticas de prueba, consulta Cómo escribir una macrocomparativa.

Cómo inspeccionar diagnósticos de red

La especificación del servicio netstats proporciona estadísticas de uso de la red recopiladas desde que se inició el dispositivo anterior. Para obtener información adicional, como información detallada del ID de usuario único (UID), incluye la opción detail, como se muestra a continuación:

adb shell dumpsys netstats detail

El resultado varía según la versión de Android que se ejecuta en el dispositivo conectado. En las siguientes secciones, se describe el tipo de información que sueles ver.

Interfaces activas e interfaces UID activas

El resultado de la siguiente muestra incluye las interfaces activas y las interfaces UID activas del dispositivo conectado. En la mayoría de los casos, la información de las interfaces activas y las interfaces UID activas es la misma.

Active interfaces:
  iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}]
Active UID interfaces:
  iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}]

Estadísticas "Dev" y "Xt"

El siguiente es un resultado de muestra de la sección de estadísticas de desarrollo:

Dev stats:
  Pending bytes: 1798112
  History since boot:
  ident=[{type=WIFI, subType=COMBINED, networkId="Guest", metered=false}] uid=-1 set=ALL tag=0x0
    NetworkStatsHistory: bucketDuration=3600
      st=1497891600 rb=1220280 rp=1573 tb=309870 tp=1271 op=0
      st=1497895200 rb=29733 rp=145 tb=85354 tp=185 op=0
      st=1497898800 rb=46784 rp=162 tb=42531 tp=192 op=0
      st=1497902400 rb=27570 rp=111 tb=35990 tp=121 op=0
Xt stats:
  Pending bytes: 1771782
  History since boot:
  ident=[{type=WIFI, subType=COMBINED, networkId="Guest", metered=false}] uid=-1 set=ALL tag=0x0
    NetworkStatsHistory: bucketDuration=3600
      st=1497891600 rb=1219598 rp=1557 tb=291628 tp=1255 op=0
      st=1497895200 rb=29623 rp=142 tb=82699 tp=182 op=0
      st=1497898800 rb=46684 rp=160 tb=39756 tp=191 op=0
      st=1497902400 rb=27528 rp=110 tb=34266 tp=120 op=0

Estadísticas del UID

La siguiente es una muestra de estadísticas detalladas de cada UID:

UID stats:
  Pending bytes: 744
  Complete history:
  ident=[[type=MOBILE_SUPL, subType=COMBINED, subscriberId=311111...], [type=MOBILE, subType=COMBINED, subscriberId=311111...]] uid=10007  set=DEFAULT tag=0x0
    NetworkStatsHistory: bucketDuration=7200000
      bucketStart=1406167200000 activeTime=7200000 rxBytes=4666 rxPackets=7 txBytes=1597 txPackets=10 operations=0
  ident=[[type=WIFI, subType=COMBINED, networkId="MySSID"]] uid=10007  set=DEFAULT tag=0x0
    NetworkStatsHistory: bucketDuration=7200000
      bucketStart=1406138400000 activeTime=7200000 rxBytes=17086802 rxPackets=15387 txBytes=1214969 txPackets=8036 operations=28
      bucketStart=1406145600000 activeTime=7200000 rxBytes=2396424 rxPackets=2946 txBytes=464372 txPackets=2609 operations=70
      bucketStart=1406152800000 activeTime=7200000 rxBytes=200907 rxPackets=606 txBytes=187418 txPackets=739 operations=0
      bucketStart=1406160000000 activeTime=7200000 rxBytes=826017 rxPackets=1126 txBytes=267342 txPackets=1175 operations=35

Para encontrar el UID de tu app, ejecuta este comando: adb shell dumpsys package your-package-name. Luego, busca la línea con la etiqueta userId.

Por ejemplo, para encontrar el uso de red de la app "com.example.myapp", ejecuta el siguiente comando:

adb shell dumpsys package com.example.myapp | grep userId

El resultado debe ser similar al siguiente ejemplo:

    userId=10007 gids=[3003, 1028, 1015]

Con el volcado de muestra anterior, busca líneas que tengan uid=10007. Existen dos de estas líneas: la primera indica una conexión móvil y la segunda indica una conexión Wi-Fi. Debajo de cada línea, puedes ver la siguiente información para cada período de dos horas, que bucketDuration especifica en milisegundos:

  • set=DEFAULT indica el uso de red en primer plano, mientras que set=BACKGROUND indica el uso en segundo plano. set=ALL implica ambos.
  • tag=0x0 indica la etiqueta del socket asociada con el tráfico.
  • rxBytes y rxPackets representan los bytes recibidos y los paquetes recibidos en el intervalo correspondiente.
  • txBytes y txPackets representan los bytes enviados (transmitidos) y los paquetes enviados en el intervalo correspondiente.

Cómo inspeccionar el diagnóstico de la batería

Especificar el servicio batterystats genera datos estadísticos sobre el uso de batería de un dispositivo, organizados por ID de usuario único (UID). Si deseas aprender a usar dumpsys para probar el funcionamiento de tu app con Descanso y App Standby, consulta Pruebas con los modos Descanso y App Standby.

El comando para batterystats es el siguiente:

adb shell dumpsys batterystats options

Si quieres ver una lista de opciones adicionales disponibles para batterystats, incluye la opción -h. En el siguiente ejemplo, se muestran las estadísticas de uso de la batería para un paquete de apps específico desde la última vez que se cargó el dispositivo:

adb shell dumpsys batterystats --charged package-name

En general, el resultado incluye lo siguiente:

  • Historial de eventos relacionados con la batería
  • Estadísticas globales para el dispositivo
  • Uso de energía aproximado por UID y componente de sistema
  • Milisegundos móviles por app, por paquete
  • Estadísticas globales de UID de sistema
  • Estadísticas globales de UID de la app

Si quieres obtener más información para usar batterystats y generar una vista HTML del resultado, lo cual facilita la comprensión y el diagnóstico de problemas relacionados con la batería, consulta Genera perfiles del uso de la batería con Batterystats y Battery Historian.

Cómo inspeccionar resultados compatibles con computadoras

Puedes generar resultados de batterystats en formato CSV compatible con computadoras si usas el siguiente comando:

adb shell dumpsys batterystats --checkin

A continuación, se muestra un ejemplo del resultado:

9,0,i,vers,11,116,K,L
9,0,i,uid,1000,android
9,0,i,uid,1000,com.android.providers.settings
9,0,i,uid,1000,com.android.inputdevices
9,0,i,uid,1000,com.android.server.telecom
...
9,0,i,dsd,1820451,97,s-,p-
9,0,i,dsd,3517481,98,s-,p-
9,0,l,bt,0,8548446,1000983,8566645,1019182,1418672206045,8541652,994188
9,0,l,gn,0,0,666932,495312,0,0,2104,1444
9,0,l,m,6794,0,8548446,8548446,0,0,0,666932,495312,0,697728,0,0,0,5797,0,0
...

Las observaciones sobre uso de batería pueden ser por UID o nivel de sistema. Los datos se seleccionan para su inclusión según su utilidad para analizar el rendimiento de la batería. Cada fila representa una observación con los siguientes elementos:

  • Un marcador de posición en número entero
  • El ID de usuario asociado con la observación
  • El modo de agregación:
    • i para información no vinculada con el estado cargado/no cargado
    • l para --charged (uso desde la última carga)
    • u para --unplugged (uso desde la última vez que se desconectó; dejó de estar disponible en Android 5.1.1)
  • Identificador de sección, que determina cómo interpretar los valores posteriores en la línea

En la siguiente tabla, se describen los distintos identificadores de sección que puedes ver:

Tabla 2: Lista de identificadores de sección

Identificador de sección Descripción Campos restantes

vers

Versión

checkin version, parcel version, start platform version y end platform version

uid

UID

uid, package name

apk

APK

wakeups, APK, service, start time, starts y launches

pr

Proceso

process, user, system, foreground y starts

sr

Sensor

sensor number, time y count

vib

Vibrador

time, count

fg

Primer plano

time, count

st

Hora del estado

foreground, active y running

wl

Bloqueo de activación

wake lock, full time, f, full count, partial time, p, partial count, window time, w y window count

sy

Sincronización

sync, time y count

jb

Trabajo

job, time y count

kwl

Bloqueo de activación de kernel

kernel wake lock, time y count

wr

Motivo de activación

wakeup reason, time y count

nt

Red

mobile bytes RX, mobile bytes TX, Wi-Fi bytes RX, Wi-Fi bytes TX, mobile packets RX, mobile packets TX, Wi-Fi packets RX, Wi-Fi packets TX, mobile active time y mobile active count

ua

Actividad del usuario

other, button y touch

bt

Batería

start count, battery realtime, battery uptime, total realtime, total uptime, start clock time, battery screen off realtime y battery screen off uptime

dc

Descarga de la batería

low, high, screen on y screen off

lv

Nivel de batería

start level, current level

wfl

Wi-Fi

full Wi-Fi lock on time, Wi-Fi scan time, Wi-Fi running time, Wi-Fi scan count, Wi-Fi idle time, Wi-Fi receive time y Wi-Fi transmit time

gwfl

Wi-Fi global

Wi-Fi on time, Wi-Fi running time, Wi-Fi idle time, Wi-Fi receive time, Wi-Fi transmit time y Wi-Fi power (mAh)

gble

Bluetooth global

BT idle time, BT receive time, BT transmit time y BT power (mAh)

m

Varios

screen on time, phone on time, full wakelock time total, partial wakelock time total, mobile radio active time, mobile radio active adjusted time, interactive time, power save mode enabled time, connectivity changes, device idle mode enabled time, device idle mode enabled count, device idling time, device idling count, mobile radio active count y mobile radio active unknown time

gn

Red global

mobile RX total bytes, mobile TX total bytes, Wi-Fi RX total bytes, Wi-Fi TX total bytes, mobile RX total packets, mobile TX total packets, Wi-Fi RX total packets y Wi-Fi TX total packets

br

Brillo de pantalla

dark, dim, medium, light y bright

sst

Tiempo de búsqueda de señal

signal scanning time

sgt

Tiempo de intensidad de la señal

none, poor, moderate, good y great

sgc

Recuento de intensidad de la señal

none, poor, moderate, good y great

dct

Tiempo de conexión de datos

none, GPRS, EDGE, UMTS, CDMA, EVDO_0, EVDO_A, 1xRTT, HSDPA, HSUPA, HSPA, IDEN, EVDO_B, LTE, EHRPD y HSPAP, other

dcc

Recuento de conexión de datos

none, GPRS, EDGE, UMTS, CDMA, EVDO_0, EVDO_A, 1xRTT, HSDPA, HSUPA, HSPA, IDEN, EVDO_B, LTE, EHRPD, HSPAP y other

wst

Hora del estado de Wi-Fi

off, off scanning, on no networks, on disconnected, on connected STA, on connected P2P, on connected STA P2P y soft AP

wsc

Recuento de estado de Wi-Fi

off, off scanning, on no networks, on disconnected, on connected STA, on connected P2P, on connected STA P2P y soft AP

wsst/p>

Hora del estado del solicitante de Wi-Fi

invalid, disconnected, interface disabled, inactive, scanning, authenticating, associating, associated, four-way handshake, group handshake, completed, dormant y uninitialized

wssc

Recuento de estado de solicitante de Wi-Fi

invalid, disconnected, interface disabled, inactive, scanning, authenticating, associating, associated, four-way handshake, group handshake, completed, dormant y uninitialized

wsgt

Tiempo de intensidad de la señal Wi-Fi

none, poor, moderate, good y great

wsgc

Recuento de intensidad de la señal Wi-Fi

none, poor, moderate, good y great

bst

Hora del estado de Bluetooth

inactive, low, med y high

bsc

Recuento del estado de Bluetooth

inactive, low, med y high

pws

Resumen de uso de energía

battery capacity, computed power, minimum drained power y maximum drained power

pwi

Elemento de uso de energía

label, mAh

dsd

Paso de descarga

duration, level, screen y power-save

csd

Paso de carga

duration, level, screen y power-save

dtr

Tiempo de descarga restante

battery time remaining

ctr

Tiempo de carga restante

charge time remaining

Nota: Antes de Android 6.0, el uso de energía para la radio Bluetooth, la radio móvil y Wi-Fi se rastreaba en la categoría de sección m (Varios). En Android 6.0 y versiones posteriores, el uso de energía de estos componentes se rastrea en la sección pwi (Elemento de uso de energía) con etiquetas individuales (wifi, blue, cell) para cada componente.

Cómo ver asignaciones de memoria

Tienes dos maneras diferentes de inspeccionar el uso de memoria de tu app: durante un período usando procstats o en un punto en particular usando meminfo. En las siguientes secciones, se muestra cómo usar ambos métodos.

procstats

procstats permite ver cómo se comporta tu app con el tiempo, por ejemplo, cuánto tiempo se ejecuta en segundo plano y cuánta memoria usa durante ese tiempo. Te ayuda a encontrar rápidamente ineficiencias y comportamientos erróneos en la app, como pérdidas de memoria, que pueden afectar el rendimiento, en especial cuando se ejecuta en dispositivos con poca memoria. Su volcado de estado muestra estadísticas sobre el tiempo de ejecución de cada aplicación, el tamaño del conjunto proporcional (PSS), el tamaño del conjunto único (USS) y el tamaño del conjunto residente (RSS).

Para obtener estadísticas sobre el uso de memoria de la app durante las últimas tres horas, en formato natural, ejecuta el siguiente comando:

adb shell dumpsys procstats --hours 3

Como se muestra en el siguiente ejemplo, el resultado muestra qué porcentaje de tiempo se ejecutó la aplicación y el PSS, USS y RSS como minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS sobre la cantidad de muestras.

AGGREGATED OVER LAST 3 HOURS:
  * com.android.systemui / u0a37 / v28:
           TOTAL: 100% (15MB-16MB-17MB/7.7MB-8.7MB-9.4MB/7.7MB-9.6MB-84MB over 178)
      Persistent: 100% (15MB-16MB-17MB/7.7MB-8.7MB-9.4MB/7.7MB-9.6MB-84MB over 178)
  * com.android.se / 1068 / v28:
           TOTAL: 100% (2.8MB-2.9MB-2.9MB/300KB-301KB-304KB/304KB-22MB-33MB over 3)
      Persistent: 100% (2.8MB-2.9MB-2.9MB/300KB-301KB-304KB/304KB-22MB-33MB over 3)
  * com.google.android.gms.persistent / u0a7 / v19056073:
           TOTAL: 100% (37MB-38MB-40MB/27MB-28MB-29MB/124MB-125MB-126MB over 2)
          Imp Fg: 100% (37MB-38MB-40MB/27MB-28MB-29MB/124MB-125MB-126MB over 2)
  ...
  * com.android.gallery3d / u0a62 / v40030:
           TOTAL: 0.01%
        Receiver: 0.01%
        (Cached): 54% (6.4MB-6.5MB-6.9MB/4.4MB-4.4MB-4.4MB/4.4MB-26MB-68MB over 6)
  * com.google.android.tvlauncher / u0a30 / v1010900130:
           TOTAL: 0.01%
        Receiver: 0.01%
        (Cached): 91% (5.8MB-13MB-14MB/3.5MB-10MB-12MB/12MB-33MB-78MB over 6)
  * com.android.vending:instant_app_installer / u0a16 / v81633968:
           TOTAL: 0.01%
        Receiver: 0.01%
        (Cached): 100% (14MB-15MB-16MB/3.8MB-4.2MB-5.1MB/3.8MB-30MB-95MB over 7)
  ...
Run time Stats:
  SOff/Norm: +32m52s226ms
  SOn /Norm: +2h10m8s364ms
       Mod : +17s930ms
      TOTAL: +2h43m18s520ms

Memory usage:
  Kernel : 265MB (38 samples)
  Native : 73MB (38 samples)
  Persist: 262MB (90 samples)
  Top    : 190MB (325 samples)
  ImpFg  : 204MB (569 samples)
  ImpBg  : 754KB (345 samples)
  Service: 93MB (1912 samples)
  Receivr: 227KB (1169 samples)
  Home   : 66MB (12 samples)
  LastAct: 30MB (255 samples)
  CchAct : 220MB (450 samples)
  CchCAct: 193MB (71 samples)
  CchEmty: 182MB (652 samples)
  Cached : 58MB (38 samples)
  Free   : 60MB (38 samples)
  TOTAL  : 1.9GB
  ServRst: 50KB (278 samples)

          Start time: 2015-04-08 13:44:18
  Total elapsed time: +2h43m18s521ms (partial) libart.so

meminfo

Con el siguiente comando, puedes grabar en una instantánea la manera en que se divide la memoria de tu app entre diferentes tipos de asignación de memoria RAM:

adb shell dumpsys meminfo package_name|pid [-d]

La marca -d ofrece más información relacionada con el uso de memoria en Dalvik y ART.

Se muestra una lista de todas las asignaciones actuales de tu app, medidas en kilobytes.

Cuando inspecciones esta información, deberás estar familiarizado con los siguientes tipos de asignación:

RAM privada (sincronizada y no sincronizada)
Se trata de la memoria que solo utiliza tu proceso. Es el bloque de la memoria RAM que el sistema puede recuperar cuando se destruye el proceso de tu app. En general, la parte más importante de esto es la RAM no sincronizada privada, que es la más costosa, ya que solo tu proceso la usa y su contenido solo existe en la RAM, por lo que no se puede paginar al almacenamiento (porque Android no usa el intercambio). Todas las asignaciones de montón nativas y de Dalvik que hagas estarán relacionadas con la memoria RAM privada no sincronizada. Las asignaciones nativas y de Dalvik que compartes con el proceso Zygote representan la memoria RAM no sincronizada compartida.
Tamaño del conjunto proporcional (PSS)
Se trata de una medición del uso de memoria RAM de tu app en la que se tienen en cuenta las páginas compartidas entre diferentes procesos. Cualquier página de memoria RAM que sea exclusiva de tu proceso contribuye al valor de PSS de manera directa, mientras que las páginas que se comparten con otros procesos contribuyen a este valor solo de forma proporcional a la cantidad compartida. Por ejemplo, una página compartida entre dos procesos contribuye con la mitad de su tamaño al PSS de cada proceso.

Una característica de la medición del PSS es que puedes sumar el valor de PSS de todos los procesos para determinar la memoria real que estos usan. Esto significa que el valor de PSS es un buen indicador del espacio de memoria RAM real de un proceso y permite realizar comparaciones con respecto a la cantidad que usan otros procesos y la que se encuentra disponible en total.

Por ejemplo, el siguiente es el resultado del proceso de visualización de mapas en un dispositivo Nexus 5:

adb shell dumpsys meminfo com.google.android.apps.maps -d

Nota: La información que veas puede variar un poco respecto de lo que se muestra aquí, ya que algunos detalles del resultado difieren entre las versiones de la plataforma.

** MEMINFO in pid 18227 [com.google.android.apps.maps] **
                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    10468    10408        0        0    20480    14462     6017
  Dalvik Heap    34340    33816        0        0    62436    53883     8553
 Dalvik Other      972      972        0        0
        Stack     1144     1144        0        0
      Gfx dev    35300    35300        0        0
    Other dev        5        0        4        0
     .so mmap     1943      504      188        0
    .apk mmap      598        0      136        0
    .ttf mmap      134        0       68        0
    .dex mmap     3908        0     3904        0
    .oat mmap     1344        0       56        0
    .art mmap     2037     1784       28        0
   Other mmap       30        4        0        0
   EGL mtrack    73072    73072        0        0
    GL mtrack    51044    51044        0        0
      Unknown      185      184        0        0
        TOTAL   216524   208232     4384        0    82916    68345    14570

 Dalvik Details
        .Heap     6568     6568        0        0
         .LOS    24771    24404        0        0
          .GC      500      500        0        0
    .JITCache      428      428        0        0
      .Zygote     1093      936        0        0
   .NonMoving     1908     1908        0        0
 .IndirectRef       44       44        0        0

 Objects
               Views:       90         ViewRootImpl:        1
         AppContexts:        4           Activities:        1
              Assets:        2        AssetManagers:        2
       Local Binders:       21        Proxy Binders:       28
       Parcel memory:       18         Parcel count:       74
    Death Recipients:        2      OpenSSL Sockets:        2

Aquí se muestra un dumpsys anterior sobre Dalvik de la app de Gmail:

** MEMINFO in pid 9953 [com.google.android.gm] **
                 Pss     Pss  Shared Private  Shared Private    Heap    Heap    Heap
               Total   Clean   Dirty   Dirty   Clean   Clean    Size   Alloc    Free
              ------  ------  ------  ------  ------  ------  ------  ------  ------
  Native Heap      0       0       0       0       0       0    7800    7637(6)  126
  Dalvik Heap   5110(3)    0    4136    4988(3)    0       0    9168    8958(6)  210
 Dalvik Other   2850       0    2684    2772       0       0
        Stack     36       0       8      36       0       0
       Cursor    136       0       0     136       0       0
       Ashmem     12       0      28       0       0       0
    Other dev    380       0      24     376       0       4
     .so mmap   5443(5) 1996    2584    2664(5) 5788    1996(5)
    .apk mmap    235      32       0       0    1252      32
    .ttf mmap     36      12       0       0      88      12
    .dex mmap   3019(5) 2148       0       0    8936    2148(5)
   Other mmap    107       0       8       8     324      68
      Unknown   6994(4)    0     252    6992(4)    0       0
        TOTAL  24358(1) 4188    9724   17972(2)16388    4260(2)16968   16595     336

 Objects
               Views:    426         ViewRootImpl:        3(8)
         AppContexts:      6(7)        Activities:        2(7)
              Assets:      2        AssetManagers:        2
       Local Binders:     64        Proxy Binders:       34
    Death Recipients:      0
     OpenSSL Sockets:      1

 SQL
         MEMORY_USED:   1739
  PAGECACHE_OVERFLOW:   1164          MALLOC_SIZE:       62

En general, concéntrate solo en las columnas Pss Total y Private Dirty. En algunos casos, también hay datos interesantes en las columnas Private Clean y Heap Alloc.

A continuación, se proporciona más información sobre las diferentes asignaciones de memoria que debes observar:

Dalvik Heap
RAM que usan las asignaciones de Dalvik en tu app. En Pss Total, se incluyen todas las asignaciones de Zygote, ponderadas por el uso compartido de estas entre los procesos, como se describe en la definición de PSS. El número de la columna Private Dirty representa la memoria RAM real destinada únicamente al montón de tu app, compuesto por tus propias asignaciones y cualquier página de asignación Zygote que se haya modificado desde la bifurcación del proceso de tu app desde Zygote.

Nota: En las versiones de plataforma más recientes que tienen la sección Dalvik Other, los números Pss Total y Private Dirty para el montón de Dalvik no incluyen la sobrecarga de Dalvik, como la compilación justo a tiempo (JIT) y el registro de GC, mientras que las versiones anteriores incluyen una lista combinada de esta información en Dalvik.

Heap Alloc es la cantidad de memoria de la cual hacen un seguimiento los asignadores de montón nativo y de Dalvik para tu app. Este valor es superior a Pss Total y Private Dirty porque tu proceso se bifurcó desde Zygote e incluye asignaciones que tu proceso comparte con los demás.

.so mmap y .dex mmap
Memoria RAM que se usa para código asignado .so (nativo) y .dex (Dalvik o ART). El número Pss Total incluye el código de la plataforma que se comparte entre las apps. Private Clean es el código propio de tu app. Por lo general, el tamaño asignado real es mayor. Aquí, la RAM es solo lo que actualmente debe estar en ella para el código que ejecutó la app. Sin embargo, .so mmap presenta una memoria RAM privada no sincronizada de tamaño amplio, que se debe a correcciones en el código nativo que se realizaron cuando se cargó en su dirección final.
.oat mmap
Se trata de la cantidad de memoria RAM que usa la imagen de código. Se basa en las clases precargadas que suelen utilizar varias apps. Esta imagen se comparte entre todas las apps y no se ve afectada por apps específicas.
.art mmap
Se trata de la cantidad de memoria RAM que utiliza la imagen del montón. Se basa en las clases precargadas que suelen utilizar varias apps. Esta imagen se comparte entre todas las apps y no se ve afectada por apps específicas. Si bien la imagen de ART contiene instancias de Object, no se tiene en cuenta para calcular el tamaño del montón.
.Heap (solo con la marca -d)
Cantidad de memoria del montón de tu app. Se excluyen objetos de los espacios de objetos grandes e imágenes, pero se incluyen el espacio Zygote y el espacio fijo.
.LOS (solo con la marca -d)
Cantidad de memoria RAM que utiliza el espacio de objetos grandes de ART. Se incluyen los objetos grandes de Zygote. Todos los objetos grandes son asignaciones primitivas de array superiores a 12 KB.
.GC (solo con la marca -d)
El costo de sobrecarga de la recolección de elementos no utilizados. No hay forma de reducir esta sobrecarga.
.JITCache (solo con la marca -d)
Cantidad de memoria que utilizan las cachés de código y los datos de JIT. Por lo general, es un valor de cero, ya que todas las apps se compilan en el momento de la instalación.
.Zygote (solo con la marca -d)
Se trata de la cantidad de memoria que utiliza el espacio de Zygote. Dicho espacio se crea durante el arranque del dispositivo y nunca se realizan asignaciones en él.
.NonMoving (solo con la marca -d)
Cantidad de memoria RAM que utiliza el espacio fijo de ART. Dicho espacio contiene objetos no movibles especiales, como campos y métodos. Puedes reducir esta sección si usas menos campos y métodos en tu app.
.IndirectRef (solo con la marca -d)
Cantidad de memoria RAM que utilizan las tablas de referencia indirecta de ART. Por lo general, esta cantidad es pequeña. Sin embargo, si es demasiado grande, se puede reducir disminuyendo la cantidad de referencias JNI globales y locales que se usan.
Unknown
Cualquier página de memoria RAM que el sistema no pudo clasificar en uno de los demás elementos más específicos. Actualmente, contiene asignaciones que, por lo general, son nativas y que la herramienta no puede identificar durante la recolección de estos datos debido a la selección aleatoria del diseño del espacio de direcciones (ASLR). Como sucede con el montón de Dalvik, el Pss Total de Unknown tiene en cuenta el uso compartido con Zygote, y Private Dirty es la memoria RAM desconocida dedicada solo a tu app.
TOTAL
Memoria RAM total de tamaño del conjunto proporcional (PSS) que usa tu proceso. Es la suma de todos los campos PSS que se hallan encima de este. Indica el espacio total de la memoria que ocupa tu proceso, que se puede comparar directamente con la de otros procesos y la memoria RAM disponible en total.

Private Dirty y Private Clean son las asignaciones totales dentro de tu proceso, que no se comparten con otros procesos. Cuando se destruye tu proceso, toda la memoria RAM de estas asignaciones se libera de vuelta al sistema. Private Clean también se puede paginar y lanzar antes de que se destruya tu proceso, pero Private Dirty solo se libera cuando se destruye el proceso.

La memoria RAM no sincronizada es páginas que se modificaron y, por lo tanto, deben permanecer comprometidas con la memoria RAM porque no hay intercambio. La memoria RAM limpia son páginas que se asignaron a partir de un archivo persistente, como el código que se ejecuta, y que se pueden paginar si no se usan durante un tiempo.

ViewRootImpl
Cantidad de vistas raíz activas en tu proceso. Cada vista raíz está asociada a una ventana, de modo que esto puede ayudarte a identificar fugas de memoria relacionadas con cuadros de diálogos u otras ventanas.
AppContexts y Activities
Cantidad de objetos Context y Activity de la app actualmente activos en tu proceso. Esto puede ayudarte a identificar rápidamente objetos Activity fugados que no estén sujetos a la recolección de elementos no utilizados debido a referencias estáticas sobre ellos, lo cual es común. A menudo, estos objetos tienen muchas otras asignaciones asociadas a ellos, lo cual los convierte en un buen elemento para realizar un seguimiento de fugas de memoria de gran envergadura.