dumpsys

dumpsys é uma ferramenta que é executada em dispositivos Android e fornece informações sobre serviços do sistema. Você pode chamar dumpsys a partir da linha de comando usando o Android Debug Bridge (ADB) para ter uma saída de diagnóstico para todos os serviços do sistema em execução em um dispositivo conectado. Normalmente, essa saída é mais detalhada do que você precisa, então use as opções de linha de comando descritas abaixo para ter apenas as informações dos serviços do sistema em que você tem interesse. Esta página também descreve como usar dumpsys para realizar tarefas comuns, como inspeção de entrada, RAM, bateria ou diagnóstico de rede.

Sintaxe

A sintaxe geral para usar dumpsys é a seguinte:

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

Para ter uma saída de diagnóstico de todos os serviços do sistema para seu dispositivo conectado, basta executar o adb shell dumpsys. No entanto, isso gera muito mais informações do que normalmente desejado. Para ter uma saída mais gerenciável, especifique o serviço que você quer examinar incluindo-o no comando. Por exemplo, o comando abaixo fornece dados do sistema para componentes de entrada, como touchscreens ou teclados integrados:

adb shell dumpsys input
    

Para receber uma lista completa dos serviços do sistema que você pode usar com o dumpsys, use o seguinte comando:

adb shell dumpsys -l
    

Opções de linha de comando

A tabela a seguir lista as opções disponíveis ao usar o dumpsys.

Opção Descrição
-t timeout Especifica o período de tempo limite em segundos. Quando não especificado, o valor padrão é de 10 segundos.
--help Imprime textos de ajuda para a ferramenta dumpsys.
-l Mostra uma lista completa dos serviços do sistema que você pode usar com dumpsys.
--skip services Especifica os serviços que você não quer incluir na saída.
service [arguments] Especifica o serviço que você quer incluir na saída. Alguns serviços podem permitir que você passe argumentos opcionais. Saiba mais sobre esses argumentos opcionais passando a opção -h com o serviço, conforme mostrado abaixo:

    adb shell dumpsys procstats -h
        
-c Ao especificar determinados serviços, acrescente essa opção para gerar dados em um formato compatível com a máquina.
-h Para determinados serviços, acrescente essa opção para ver o texto de ajuda e outras opções para tal serviço.

Inspecionar diagnósticos de entrada

Especificar o serviço de input, como mostrado abaixo, despeja o estado dos dispositivos de entrada do sistema, como teclados e touchscreens, e o processamento de eventos de entrada.

adb shell dumpsys input
    

A saída pode variar de acordo com a versão do Android executada no dispositivo conectado. As seções abaixo descrevem o tipo de informação que é vista normalmente.

Estado do hub de eventos

Veja a seguir uma amostra do que pode ser encontrado ao inspecionar o estado do hub de eventos dos diagnósticos 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 do leitor de entrada

O InputReader é responsável pela decodificação de eventos de entrada do kernel. O despejo de estado dele mostra informações sobre como cada dispositivo de entrada está configurado e mudanças de estado que ocorreram recentemente, como teclas pressionadas ou toques no touchscreen.

A amostra a seguir mostra a saída de uma tela sensível ao toque. Observe as informações sobre a resolução do dispositivo e os parâmetros de calibração que foram usados.

    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
    

No final do despejo de estado do leitor de entrada, há algumas informações sobre os parâmetros de configuração global, como o intervalo de toque.

    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 do expedidor de entrada

O InputDispatcher é responsável por enviar eventos de entrada para aplicativos. Conforme mostrado na amostra de saída abaixo, o despejo de estado apresenta informações sobre qual janela está sendo tocada, o estado da fila de entrada, se um ANR está em andamento e assim por diante.

    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
    

Itens a serem verificados

Veja a seguir uma lista de itens a serem considerados ao inspecionar as diversas saídas do serviço de input:

Estado do hub de eventos:

  • Todos os dispositivos de entrada que você espera encontrar estão presentes.
  • Cada dispositivo de entrada tem um arquivo-chave de layout apropriado, um arquivo-chave de mapeamento de caracteres e um arquivo de configuração do dispositivo de entrada. Se houver arquivos faltando ou se eles tiverem erros de sintaxe, eles não serão carregados.
  • Cada dispositivo de entrada está classificado corretamente. Os bits no campo Classes correspondem às sinalizações em EventHub.h, como INPUT_DEVICE_CLASS_TOUCH_MT.
  • O BuiltInKeyboardId está correto. Se o dispositivo não tiver um teclado integrado, o código precisará ser -2. Caso contrário, ele precisará ser o código do teclado integrado.
    • Se você observar que o BuiltInKeyboardId não é -2, mas deveria ser, um arquivo-chave de mapeamento de caracteres para um teclado de função especial está faltando em algum lugar. Dispositivos de teclado de função especial precisam ter arquivos de mapeamento de caracteres que contenham apenas a linha type SPECIAL_FUNCTION (presente no arquivo tuna-gpio-keykad.kcm que vemos mencionado acima).

Estado do leitor de entrada:

  • Todos os dispositivos de entrada esperados se encontram presentes.
  • Cada dispositivo de entrada está configurado corretamente. Em particular, é necessário verificar se os eixos do joystick e do touchscreen estão corretos.

Estado do expedidor de entrada:

  • Todos os eventos de entrada são processados conforme o esperado.
  • Depois de tocar na tela sensível ao toque e executar dumpsys ao mesmo tempo, a linha TouchStates identifica corretamente a janela que está sendo tocada.

Testar desempenho da IU

A especificação do serviço gfxinfo fornece informações de desempenho relacionadas aos frames de animação que estão ocorrendo durante a fase de gravação. O comando a seguir usa gfxinfo para reunir dados de desempenho da IU para um nome de pacote especificado:

    adb shell dumpsys gfxinfo package-name
    

Você também pode incluir a opção framestats para fornecer informações de tempo de frame ainda mais detalhadas para frames recentes, de modo que seja possível rastrear e depurar problemas com maior precisão. Veja abaixo:

    adb shell dumpsys gfxinfo package-name framestats
    

Para saber mais sobre como usar o gfxinfo e o framestats para integrar as métricas de desempenho da IU às suas práticas de teste, acesse Testar desempenho da IU.

Inspecionar diagnósticos de rede

A especificação do serviço netstats fornece estatísticas de uso de rede coletadas desde que o dispositivo anterior foi inicializado. Para gerar outras informações, como informações detalhadas do ID de usuário único (UID, na sigla em inglês), inclua a opção detail, desta maneira:

adb shell dumpsys netstats detail
    

A saída pode variar de acordo com a versão do Android executada no dispositivo conectado. As seções abaixo descrevem o tipo de informação que é vista normalmente.

Interfaces ativas e interfaces UID ativas

A amostra de saída a seguir lista as interfaces ativas e as interfaces UID ativas do dispositivo conectado. Na maioria dos casos, as informações para interfaces ativas e interfaces UID ativas são as mesmas.

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

Estatísticas "Dev" e "Xt"

Veja esta amostra de saída para a seção de estatísticas Dev:

    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
    

Estatísticas de UID

Veja esta amostra de estatísticas detalhadas 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 o UID para seu app, execute este comando: adb shell dumpsys package your-package-name. Em seguida, procure a linha marcada como userId.

Por exemplo, para encontrar o uso da rede para o app "com.example.myapp", execute o seguinte comando:

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

A saída será semelhante a esta:

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

Usando o despejo da amostra acima, procure linhas que contenham uid=10007. Existem duas dessas linhas: a primeira indica uma conexão móvel, e a segunda indica uma conexão Wi-Fi. Abaixo de cada linha, é possível ver as seguintes informações para cada janela de duas horas (que bucketDuration especifica em milissegundos):

  • set=DEFAULT indica o uso da rede em primeiro plano, enquanto set=BACKGROUND indica o uso em segundo plano. set=ALL implica ambos.
  • tag=0x0 indica a tag de soquete associada ao tráfego.
  • rxBytes e rxPackets representam os bytes e os pacotes recebidos no intervalo de tempo correspondente.
  • txBytes e txPackets representam os bytes e os pacotes enviados (transmitidos) no intervalo de tempo correspondente.

Inspecionar o diagnóstico da bateria

A especificação do serviço batterystats gera dados estatísticos interessantes sobre o uso da bateria de um dispositivo, organizados pelo UID. Para saber como usar o dumpsys para testar seu app para Soneca e App em espera, acesse Testes com os recursos Soneca e App em espera.

O comando para batterystats é o seguinte:

    adb shell dumpsys batterystats options
    

Para ver uma lista de outras opções disponíveis para batterystats, inclua a opção -h. O exemplo abaixo mostra as estatísticas de uso da bateria para um pacote de apps especificado desde a última vez que o dispositivo foi carregado:

    adb shell dumpsys batterystats --charged package-name
    

A saída normalmente inclui o seguinte:

  • Histórico de eventos relacionados ao uso da bateria
  • Estatísticas gerais do dispositivo
  • Uso aproximado da bateria por UID e componentes do sistema
  • Milissegundos por dispositivo móvel por pacote
  • Estatísticas agregadas do UID do sistema
  • Estatísticas agregadas do UID do app

Para saber mais sobre como usar batterystats e gerar uma visualização HTML da saída, o que facilita o entendimento e o diagnóstico de problemas relacionados à bateria, leia Gerar perfil do uso da bateria com Batterystats e Battery Historian.

Inspecionar a saída para a máquina

É possível gerar a saída do batterystats no formato CSV legível por máquina usando o seguinte comando:

adb shell dumpsys batterystats --checkin
    

A seguir, um exemplo de saída que pode ser visto:

    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
    ...
    

As observações de uso da bateria podem ser por UID ou no nível do sistema. Os dados são selecionados para inclusão com base na utilidade deles ao analisar o desempenho da bateria. Cada linha representa uma observação com os seguintes elementos:

  • Um número inteiro fictício
  • O ID do usuário associado à observação
  • O modo de agregação:
    • "i" para informações não vinculadas ao status de carga/descarga.
    • "l" para carregado (uso desde a última carga).
    • "u" para desconectado (uso desde a última vez em que foi desconectado). Suspenso no Android 5.1.1.
  • Identificador de seção, que determina como interpretar valores subsequentes na linha.

A tabela abaixo descreve os diversos identificadores de seção que podem ser vistos:

Identificador de seção Descrição Campos restantes

vers

Versão

versão de check-in, versão de pacote, versão da plataforma inicial, versão da plataforma final

uid

UID

uid, nome do pacote

apk

APK

ativações, APK, serviço, horário de início, inícios, inicializações

pr

Processo

processo, usuário, sistema, primeiro plano, inícios

sr

Sensor

número do sensor, hora, contagem

vib

Vibrador

tempo, contagem

fg

Primeiro plano

tempo, contagem

st

Tempo do estado

primeiro plano, ativo, em execução

wl

Wake lock

wake lock, tempo integral, "f", contagem total, tempo parcial, "p", contagem parcial, tempo de janela, "w", contagem de janelas

sy

Sincronização

sincronização, tempo, contagem

jb

Tarefa

tarefa, tempo, contagem

kwl

Wake lock do kernel

wake lock do kernel, tempo, contagem

wr

Motivo da ativação

motivo da ativação, tempo, contagem

nt

Rede

RX de bytes móveis, TX de bytes móveis, RX de bytes Wi-Fi, TX de bytes Wi-Fi, RX de pacotes móveis, TX de pacotes móveis, RX de pacotes Wi-Fi, TX de pacotes Wi-Fi, tempo ativo em dispositivos móveis, contagem ativa de dispositivos móveis

ua

Atividades do usuário

outro, botão, toque

bt

Bateria

contagem inicial, tempo real da bateria, tempo de atividade da bateria, tempo real total, tempo de atividade total, hora de início, tempo real da bateria com tela desligada, tempo de atividade da bateria com tela desligada

dc

Descarga da bateria

baixa, alta, tela ligada, tela desligada

lv

Nível da bateria

nível inicial, nível atual

wfl

Wi-Fi

tempo total de bloqueio de Wi-Fi ativado, tempo de busca por Wi-Fi, tempo de execução do Wi-Fi, contagem de busca por Wi-Fi, tempo ocioso do Wi-Fi, tempo de recebimento do Wi-Fi, tempo de transmissão do Wi-Fi

gwfl

Wi-Fi Global

tempo do Wi-Fi ativado, tempo de execução do Wi-Fi, tempo ocioso do Wi-Fi, tempo de recebimento do Wi-Fi, tempo de transmissão do Wi-Fi, energia do Wi-Fi (mAh)

gble

Bluetooth global

tempo ocioso de BT, tempo de recebimento de BT, tempo de transmissão de BT, energia do BT (mAh)

m

Diversos

tempo de tela ativada, tempo do smartphone ligado, tempo total de wake lock, tempo total de wake lock parcial, tempo ativo do rádio móvel, tempo ativo ajustado do rádio móvel, tempo de interação, tempo de ativação do modo de economia de energia, alterações de conectividade, tempo de ativação do modo ocioso do dispositivo, contagem de ativação do modo ocioso do dispositivo, tempo de ociosidade do dispositivo, contagem de ociosidade do dispositivo, contagem ativa de rádio móvel, tempo desconhecido ativo do rádio móvel

gn

Rede global

bytes totais de RX móvel, bytes totais de TX móvel, bytes totais de RX de Wi-Fi, bytes totais de TX de Wi-Fi, pacotes totais de RX móvel, pacotes totais de TX móvel, pacotes totais de RX de Wi-Fi, pacotes totais de TX de Wi-Fi

br

Brilho da tela

escuro, sombreado, médio, claro, brilhante

sst

Tempo de busca por sinal

tempo de busca por sinal

sgt

Tempo de intensidade do sinal

nenhum, ruim, moderado, bom, ótimo

sgc

Contagem de intensidade do sinal

nenhum, ruim, moderado, bom, ótimo

dct

Tempo de conexão de dados

nenhum, GPRS, EDGE, UMTS, CDMA, EVDO_0, EVDO_A, 1xRTT, HSDPA, HSUPA, HSPA, IDEN, EVDO_B, LTE, EHRPD, HSPAP, outros

dcc

Contagem de conexões de dados

nenhum, GPRS, EDGE, UMTS, CDMA, EVDO_0, EVDO_A, 1xRTT, HSDPA, HSUPA, HSPA, IDEN, EVDO_B, LTE, EHRPD, HSPAP, outros

wst

Tempo do estado do Wi-Fi

desativado, busca enquanto desativado, ativado sem redes, ativado desconectado, STA conectado, ativado com P2P conectado, ativado com STA P2P conectado, softAP

wsc

Contagem de estado do Wi-Fi

desativado, busca enquanto desativado, ativado sem redes, ativado desconectado, STA conectado, ativado com P2P conectado, ativado com STA P2P conectado, softAP

wsst

Tempo do estado do suplicante de Wi-Fi

inválido, desconectado, interface desativada, inativo, buscando, autenticando, associando, associado, handshake de quatro vias, handshake de grupo, completo, inativo, inutilizado

wssc

Contagem de estado do suplicante de Wi-Fi

inválido, desconectado, interface desativada, inativo, buscando, autenticando, associando, associado, handshake de quatro vias, handshake de grupo, completo, inativo, inutilizado

wsgt

Tempo de intensidade do sinal de Wi-Fi

nenhum, ruim, moderado, bom, ótimo

wsgc

Contagem de intensidade do sinal de Wi-Fi

nenhum, ruim, moderado, bom, ótimo

bst

Tempo de estado do Bluetooth

inativo, baixo, médio, alto

bsc

Contagem do estado do Bluetooth

inativo, baixo, médio, alto

pws

Resumo do uso de energia

capacidade da bateria, potência calculada, potência drenada mínima, potência drenada máxima

pwi

Item de uso de energia

etiqueta, mAh

dsd

Etapa de descarga

duração, nível, tela, economia de energia

csd

Etapa de carga

duração, nível, tela, economia de energia

dtr

Tempo de descarga restante

tempo de bateria restante

ctr

Tempo de carga restante

tempo de carga restante

Observação: antes do Android 6.0, o uso de energia para o rádio Bluetooth, rádio celular e Wi-Fi eram monitorados na categoria de seção m (Misc). No Android 6.0 e versões posteriores, o uso de energia para esses componentes é monitorado na seção pwi (item de uso de energia) com etiquetas individuais (wifi, blue, cell) para cada componente.

Ver alocações de memória

É possível inspecionar o uso de memória do seu app de duas maneiras: durante um período usando procstats ou em um momento específico usando meminfo. As seções abaixo demostram como usar um dos métodos.

procstats

procstats possibilita ver como seu app está se comportando ao longo do tempo, incluindo por quanto tempo ele é executado em segundo plano e quanto de memória é usado durante esse período. Ele ajuda você a encontrar rapidamente ineficiências e erros de comportamento no seu app, como vazamentos de memória que podem afetar o desempenho, especialmente quando executados em dispositivos com pouca memória. O estado de despejo dele exibe estatísticas sobre o ambiente de execução de cada aplicativo, tamanho do conjunto proporcional (PSS, na sigla em inglês) e tamanho do conjunto exclusivo (USS, na sigla em inglês).

Para ver estatísticas de uso de memória do aplicativo das últimas três horas, em formato legível, execute o comando a seguir:

adb shell dumpsys procstats --hours 3

Como pode ser visto no exemplo abaixo, o resultado demostra a porcentagem de tempo em que o aplicativo estava em execução e o PSS e USS como minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS sobre o número de amostras.

    AGGREGATED OVER LAST 3 HOURS:
      * com.android.systemui / u0a20 / v22:
               TOTAL: 100% (109MB-126MB-159MB/108MB-125MB-157MB over 18)
          Persistent: 100% (109MB-126MB-159MB/108MB-125MB-157MB over 18)
      * com.android.nfc / 1027 / v22:
               TOTAL: 100% (17MB-17MB-17MB/16MB-16MB-16MB over 18)
          Persistent: 100% (17MB-17MB-17MB/16MB-16MB-16MB over 18)
      * android.process.acore / u0a4 / v22:
               TOTAL: 100% (14MB-15MB-15MB/14MB-14MB-14MB over 20)
              Imp Fg: 100% (14MB-15MB-15MB/14MB-14MB-14MB over 20)
      ...
      * com.coulombtech / u0a106 / v26:
               TOTAL: 0.01%
            Receiver: 0.01%
            (Cached): 21% (4.9MB-5.0MB-5.2MB/3.8MB-3.9MB-4.1MB over 2)
      * com.softcoil.mms / u0a86 / v32:
               TOTAL: 0.01%
            (Cached): 0.25%
      * com.udemy.android / u0a91 / v38:
               TOTAL: 0.01%
            Receiver: 0.01%
            (Cached): 0.75% (9.8MB-9.8MB-9.8MB/8.5MB-8.5MB-8.5MB over 1)
      ...
    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

É possível gravar um snapshot de como a memória do seu app é dividida entre diferentes tipos de alocação de RAM com o comando a seguir:

    adb shell dumpsys meminfo package_name|pid [-d]
    

A sinalização -d fornece mais informações relacionadas ao uso de memória Dalvik e ART.

A saída lista todas as alocações atuais do app, medidas em kilobytes.

Ao examinar essa informação, é necessário conhecer bem os seguintes tipos de alocação:

RAM privada (limpa e suja)
Essa é a memória usada somente pelo seu processo. Essa é a quantidade de RAM que o sistema pode resgatar quando o processo do app é destruído. Geralmente, a parte mais importante é a RAM privada e suja, que é a mais cara porque é usada apenas pelo seu processo e os componentes dela existem exclusivamente em RAM, então não podem ser paginados em armazenamento (porque o Android não usa swap). Todas as alocações de heap nativas e da Dalvik que forem feitas, serão RAM privada e suja. As alocações nativas e da Dalvik que forem compartilhadas com o processo Zigoto serão RAM suja compartilhada.
Tamanho do conjunto proporcional (PSS)
Essa é uma medida do uso de RAM do seu app que leva em consideração páginas compartilhadas entre processos. Toda página de RAM exclusiva do seu processo contribui diretamente para o valor de PSS, enquanto as páginas compartilhadas com outros processos contribuem para o valor de PSS apenas na proporção da quantidade compartilhada. Por exemplo, uma página compartilhada entre dois processos contribuirá com metade do próprio tamanho para o PSS de cada processo.

Uma característica interessante da medida de PSS é que é possível adicionar o PSS a todos os processos para determinar a memória que está realmente sendo usada por todos eles. Isso significa que o PSS é uma boa medida para o peso real em RAM de um processo e para comparação com o uso de RAM de outros processos e com o total disponível.

Por exemplo, abaixo há uma amostra de saída de um processo de mapa em um dispositivo Nexus 5. Há muitas informações aqui, mas os pontos principais foram listados abaixo.

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

Observação: a informação exibida pode variar do que é mostrado aqui, alguns detalhes de saída diferem entre versões de plataformas.

    ** 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
    

Veja um dumpsys mais antigo do app Gmail na Dalvik:

    ** 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
    

Em geral, atenha-se apenas às colunas "Pss Total" e "Private Dirty". Em alguns casos, as colunas Private Clean e Heap Alloc também oferecem dados interessantes. Se quiser mais informações sobre as diferentes alocações de memória (as linhas), observe o seguinte:

Dalvik Heap
A RAM usada no seu app pelas alocações da Dalvik. O Pss Total inclui todos as alocações Zigoto, medidas por compartilhamento entre processos, como descrito na definição de PSS acima. A Private Dirty é o número verdadeiro de RAM usada apenas nos heaps do seu app, composta das suas próprias alocações e de todas as páginas de alocação Zigoto que foram modificadas desde a bifurcação entre o processo do seu app e o Zigoto.

Observação: em plataformas mais recentes que têm a seção Dalvik Other, os números de Pss Total e Private Dirty para heap da Dalvik não incluem sobrecarga de Dalvik, como a compilação just-in-time (JIT) e o agendamento de GC, enquanto versões mais antigas listam todos combinados em Dalvik.

O Heap Alloc é a quantidade de memória que os alocadores de heap nativos e da Dalvik controlam no seu app. Esse valor é maior que Pss Total e Private Dirty, porque seu processo foi separado do Zigoto e inclui alocações que seu processo compartilha com todos os outros.

.so mmap e .dex mmap
A RAM usada para códigos .so (nativo) e .dex (Dalvik or ART) mapeados. O número Pss Total inclui um código de plataforma compartilhado entre apps. A Private Clean é o código do próprio app. Geralmente, o tamanho mapeado real é muito maior. A RAM aqui é só o que é necessário estar em RAM no momento para o código executado pelo app. No entanto, o .so mmap tem uma RAM suja privada maior devido às correções do código nativo quando ele foi carregado no endereço final.
.oat mmap
Essa é a quantidade de RAM usada pela imagem do código que é baseada nas classes pré-carregadas normalmente usadas por diversos apps. Essa imagem é compartilhada por todos os apps e não é afetada por nenhum app em especial.
.art mmap
Essa é a quantidade de RAM usada pela imagem de heap que se baseia nas classes pré-carregadas normalmente usadas por diversos apps. Essa imagem é compartilhada por todos os apps e não é afetada por nenhum app em especial. Embora a imagem da ART contenha instâncias de Object, ela não é considerada para o tamanho de heap.
.Heap (apenas com a sinalização -d)
Quantidade de memória de heap do seu app. Exclui objetos da imagem e espaços de objetos grandes, mas inclui o espaço do zigoto e espaço fixo.
.LOS (apenas com a sinalização -d)
Essa é a quantidade de RAM usada pelo espaço de objetos grandes da ART. Inclui objetos grandes do zigoto. Objetos grandes são alocações de matriz primitiva maiores do que 12 KB.
.GC (apenas com a sinalização -d)
Esse é o custo indireto para a coleta de lixo. Não há uma forma de reduzir essa sobrecarga.
.JITCache (apenas com a sinalização -d)
Essa é a quantidade de memória usada pelos caches de código e dados JIT. Normalmente, esse valor é zero, já que todos os apps serão compilados assim que instalados.
.Zygote (apenas com a sinalização -d)
Essa é a quantidade de memória usada pelo espaço do zigoto. O espaço do zigoto é criado durante a inicialização do dispositivo e nunca há alocações dentro dele.
.NonMoving (apenas com a sinalização -d)
Essa é a quantidade de RAM usada pelo espaço fixo da ART. O espaço fixo contém objetos não móveis especiais, como campos e métodos. É possível reduzir essa parte usando menos campos e métodos no seu app.
.IndirectRef (apenas com a sinalização -d)
Essa é a quantidade de RAM usada pelas tabelas de referência indireta da ART. Normalmente, esse é um valor pequeno, mas se estiver muito alto, talvez seja possível reduzi-lo ao diminuir o número de referências a JNI locais e globais usadas.
Unknown
Todas as páginas da RAM que o sistema não conseguiu classificar em um dos outros itens mais específicos. Atualmente, aqui ficam muitas das alocações nativas que não podem ser identificadas pela ferramenta durante a coleta desses dados em virtude da Aleatorização do layout do espaço de endereço (ASLR, na sigla em inglês). Como o heap da Dalvik, o Pss Total para Desconhecidos leva em conta o compartilhamento com o Zigoto, e a Private Dirty é uma RAM desconhecida dedicada apenas ao seu app.
TOTAL
O total de RAM do Tamanho do conjunto proporcional (PSS) usado pelo seu processo. Essa é a soma de todos os campos de PSS acima dele. Indica o peso geral do seu processo na memória, que pode ser comparado diretamente com outros processos e com a RAM total disponível.

A Private Dirty e a Private Clean são as alocações totais no seu processo, que não são compartilhadas com outros processos. Juntos (especialmente a Private Dirty), elas formam a quantidade de RAM que será devolvida ao sistema quando o processo for destruído. A RAM suja são páginas que foram modificadas e, portanto, continuam alocadas à RAM (porque não há swap). Já a RAM limpa são páginas que foram mapeadas de um arquivo persistente (como código em execução) e, por isso, podem ser despaginadas se ficarem ociosas por algum tempo.

ViewRootImpl
O número de visualizações raiz ativas no processo. Cada visualização raiz está associada a uma janela, o que ajuda a identificar vazamentos de memória relacionados a caixas de diálogo ou outras janelas.

AppContexts e Activities
O número de objetos Context e Activity do app que atualmente estão ativos no seu processo. Isso pode ajudar você a identificar rapidamente objetos Activity com vazamentos que não podem ser coletados como lixo por terem referências estáticas, o que é comum. Muitas vezes, esses objetos têm muitas outras alocações associadas a eles, o que os torna uma boa maneira de controlar grandes vazamentos de memória.

Observação: um objeto View ou Drawable também contém uma referência à Activity relacionada a ele, então manter um objeto View ou Drawable também pode levar seu app a vazar uma Activity.