dumpsys

dumpsys è uno strumento eseguito su dispositivi Android che fornisce informazioni sui servizi di sistema. Chiama dumpsys dalla riga di comando utilizzando Android Debug Bridge (ADB) per ottenere un output diagnostico per tutti i servizi di sistema in esecuzione su un dispositivo connesso.

In genere questo output è più dettagliato del previsto, quindi usa le opzioni della riga di comando in questa pagina per ottenere output solo per i servizi di sistema desiderati. In questa pagina viene inoltre descritto come utilizzare dumpsys per svolgere le attività comuni, come l'ispezione dell'input, della RAM, della batteria o della diagnostica della rete.

Sintassi

La sintassi generale per l'utilizzo di dumpsys è la seguente:

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

Per ottenere un output diagnostico per tutti i servizi di sistema per il dispositivo connesso, esegui adb shell dumpsys. Tuttavia, questo restituisce molte più informazioni di quelle che si vogliono in genere. Per un output più gestibile, specifica il servizio che vuoi esaminare includendolo nel comando. Ad esempio, il comando riportato di seguito fornisce dati di sistema per i componenti di input, come touchscreen o tastiere integrate:

adb shell dumpsys input

Per un elenco completo dei servizi di sistema che puoi utilizzare con dumpsys, utilizza questo comando:

adb shell dumpsys -l

Opzioni della riga di comando

Nella tabella seguente sono elencate le opzioni disponibili quando si utilizza dumpsys:

Tabella 1. Elenco delle opzioni disponibili per dumpsys

Opzione Descrizione
-t timeout Specifica il periodo di timeout in secondi. Se non specificato, il valore predefinito è 10 secondi.
--help Stampa il testo della guida per lo strumento dumpsys.
-l Restituisci come output un elenco completo dei servizi di sistema che puoi utilizzare con dumpsys.
--skip services Specifica il valore services che non vuoi includere nell'output.
service [arguments] Specifica il valore service da restituire. Alcuni servizi potrebbero consentirti di passare arguments facoltativo. Per saperne di più su questi argomenti facoltativi, passa l'opzione -h al servizio:
adb shell dumpsys procstats -h
    
-c Quando specifichi determinati servizi, aggiungi questa opzione ai dati di output in un formato compatibile con le macchine.
-h Per determinati servizi, aggiungi questa opzione per vedere il testo della guida e opzioni aggiuntive per il servizio.

Ispeziona diagnostica input

Se specifichi il servizio input, come mostrato nel seguente comando, viene scaricato lo stato dei dispositivi di input del sistema, come tastiere e touchscreen, e l'elaborazione degli eventi di input.

adb shell dumpsys input

L'output varia a seconda della versione di Android in esecuzione sul dispositivo connesso. Le seguenti sezioni descrivono il tipo di informazioni che visualizzi in genere.

Stato hub eventi

Di seguito è riportato un esempio di ciò che potresti vedere quando esamini lo stato dell'hub eventi della diagnostica dell'input:

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

Stato lettore di input

InputReader è responsabile della decodifica degli eventi di input del kernel. Il dump dello stato mostra informazioni sulla configurazione di ogni dispositivo di input e sui recenti cambiamenti di stato che si sono verificati, come la pressione dei tasti o il tocco sul touchscreen.

Il seguente esempio mostra l'output di un touchscreen. Prendi nota delle informazioni sulla risoluzione del dispositivo e sui parametri di calibrazione utilizzati.

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

Alla fine del dump dello stato del lettore di input, sono disponibili alcune informazioni sui parametri di configurazione globali, ad esempio l'intervallo di tocco:

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

Inserisci stato committente

InputDispatcher è responsabile dell'invio di eventi di input alle applicazioni. Come mostrato nel seguente output di esempio, il relativo dump dello stato mostra informazioni sulla finestra toccata, lo stato della coda di input, se è in corso un errore ANR e altre informazioni sugli eventi di input:

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

Aspetti da controllare

Di seguito è riportato un elenco di aspetti da considerare durante l'ispezione dell'output per il servizio input:

Stato dell'hub eventi:

  • Sono presenti tutti i dispositivi di input previsti.
  • Ogni dispositivo di input dispone di un file di layout dei tasti appropriato, di un file di mappa dei caratteri delle chiavi e di un file di configurazione del dispositivo di input. Se i file non sono presenti o contengono errori di sintassi, non vengono caricati.
  • Ogni dispositivo di input è classificato correttamente. I bit nel campo Classes corrispondono ai flag in EventHub.h, ad esempio INPUT_DEVICE_CLASS_TOUCH_MT.
  • Il BuiltInKeyboardId è corretto. Se il dispositivo non ha una tastiera integrata, l'ID deve essere -2. In caso contrario, dovrebbe essere l'ID della tastiera integrata.
    • Se noti che BuiltInKeyboardId non è -2, ma dovrebbe esserlo, manca un file della mappa dei caratteri dei tasti per un tastierino funzione speciale. I tasti funzione speciali devono avere file mappa dei caratteri dei tasti che contengono solo la riga type SPECIAL_FUNCTION.

Inserisci lo stato del lettore:

  • Sono presenti tutti i dispositivi di input previsti.
  • Ogni dispositivo di input è configurato correttamente. Controlla in particolare che gli assi del touchscreen e del joystick siano corretti.

Inserisci lo stato del supervisore:

  • Tutti gli eventi di input vengono elaborati come previsto.
  • Dopo aver toccato il touchscreen e aver attivato dumpsys contemporaneamente, la linea TouchStates identifica correttamente la finestra che stai toccando.

Testare le prestazioni dell'interfaccia utente

Se specifichi il servizio gfxinfo, vengono forniti output con informazioni sulle prestazioni relative ai frame di animazione che si verificano durante la fase di registrazione. Il seguente comando utilizza gfxinfo per raccogliere dati sulle prestazioni dell'interfaccia utente per un nome di pacchetto specificato:

adb shell dumpsys gfxinfo package-name

Puoi anche includere l'opzione framestats per fornire informazioni ancora più dettagliate sulle tempistiche dei frame dai frame recenti, in modo da poter individuare i problemi ed eseguirne il debug in modo più preciso:

adb shell dumpsys gfxinfo package-name framestats

Per scoprire di più sull'utilizzo di gfxinfo e framestats per integrare le misurazioni delle prestazioni dell'interfaccia utente nelle pratiche di test, consulta Scrivere un Macrobenchmark.

Ispeziona la diagnostica di rete

Se specifichi il servizio netstats, vengono fornite statistiche sull'utilizzo della rete raccolte dall'avvio del dispositivo precedente. Per generare informazioni aggiuntive, ad esempio informazioni dettagliate sull'ID utente unico (UID), includi l'opzione detail, come indicato di seguito:

adb shell dumpsys netstats detail

L'output varia a seconda della versione di Android in esecuzione sul dispositivo connesso. Le seguenti sezioni descrivono il tipo di informazioni che visualizzi in genere.

Interfacce attive e interfacce UID attive

Il seguente output di esempio elenca le interfacce attive e le interfacce UID attive del dispositivo connesso. Nella maggior parte dei casi, le informazioni per le interfacce attive e per le interfacce UID attive sono le stesse.

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

Statistiche "Dev" e "Xt"

Di seguito è riportato un output di esempio per la sezione Statistiche sviluppatore:

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

Statistiche UID

Di seguito è riportato un esempio di statistiche dettagliate per ciascun 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

Per trovare l'UID della tua app, esegui questo comando: adb shell dumpsys package your-package-name. quindi cerca la riga userId.

Ad esempio, per trovare l'utilizzo della rete per l'app "com.example.myapp", esegui questo comando:

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

L'output dovrebbe essere simile al seguente:

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

Utilizzando il dump di esempio precedente, cerca le righe che contengono uid=10007. Esistono due righe di questo tipo: la prima indica una connessione mobile, la seconda una connessione Wi-Fi. Sotto ogni riga puoi trovare le seguenti informazioni per ogni finestra di due ore, che bucketDuration specifica in millisecondi:

  • set=DEFAULT indica l'utilizzo della rete in primo piano, mentre set=BACKGROUND indica l'utilizzo in background. set=ALL implica entrambi.
  • tag=0x0 indica il tag socket associato al traffico.
  • rxBytes e rxPackets rappresentano i byte ricevuti e i pacchetti ricevuti nell'intervallo di tempo corrispondente.
  • txBytes e txPackets rappresentano i byte inviati (trasmessi) e i pacchetti inviati nell'intervallo di tempo corrispondente.

Ispezionare la diagnostica della batteria

Se specifichi il servizio batterystats, vengono generati dati statistici relativi all'utilizzo della batteria su un dispositivo, organizzati per ID utente univoco (UID). Per informazioni su come utilizzare dumpsys per testare la sospensione e lo standby dell'app, consulta Test con sospensione e standby delle app.

Il comando per batterystats è il seguente:

adb shell dumpsys batterystats options

Per visualizzare un elenco delle opzioni aggiuntive disponibili per batterystats, includi l'opzione -h. L'esempio seguente restituisce statistiche sull'utilizzo della batteria per un pacchetto di app specificato dall'ultima ricarica del dispositivo:

adb shell dumpsys batterystats --charged package-name

In genere l'output include quanto segue:

  • Cronologia degli eventi relativi alla batteria
  • Statistiche globali per il dispositivo
  • Consumo energetico approssimativo per UID e componente di sistema
  • millisecondi per pacchetto per app mobile
  • Statistiche aggregate UID di sistema
  • Statistiche aggregate UID app

Per saperne di più sull'utilizzo di batterystats e sulla generazione di una visualizzazione HTML dell'output, che semplifica la comprensione e la diagnosi dei problemi relativi alla batteria, consulta Profilare l'utilizzo della batteria con le statistiche della batteria e la cronologia della batteria.

Ispeziona output ottimizzato per le macchine

Puoi generare un output batterystats in formato CSV leggibile dalla macchina utilizzando il seguente comando:

adb shell dumpsys batterystats --checkin

Di seguito è riportato un esempio dell'output:

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

Le osservazioni sull'utilizzo della batteria possono essere effettuate in base all'UID o a livello di sistema. I dati vengono selezionati per l'inclusione in base alla loro utilità nell'analisi delle prestazioni della batteria. Ogni riga rappresenta un'osservazione, con i seguenti elementi:

  • Un numero intero segnaposto
  • L'ID utente associato all'osservazione
  • La modalità di aggregazione:
    • i per informazioni non collegate allo stato di addebito/non addebito.
    • l per --charged (utilizzo dall'ultima ricarica).
    • u per --unplugged (utilizzo dall'ultimo scollegamento). Deprecato in Android 5.1.1.
  • Identificatore di sezione, che determina come interpretare i valori successivi nella riga.

Nella tabella seguente vengono descritti i vari identificatori di sezione che puoi visualizzare:

Tabella 2. Elenco degli identificatori di sezione

Identificatore sezione Descrizione Campi rimanenti

vers

Versione

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

uid

UID

uid, package name

apk

APK

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

pr

Processo

process, user, system, foreground e starts

sr

Sensore

sensor number, time e count

vib

Vibratore

time, count

fg

Primo piano

time, count

st

Ora dello stato

foreground, active e running

wl

Blocco riattivazione

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

sy

Sincronizzazione

sync, time e count

jb

Job

job, time e count

kwl

Wakelock con kernel

kernel wake lock, time e count

wr

Motivo del risveglio

wakeup reason, time e count

nt

Rete

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 e mobile active count

ua

Attività degli utenti

other, button e touch

bt

Batteria

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

dc

Scarica batteria

low, high, screen on e screen off

lv

Livello della batteria

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 e Wi-Fi transmit time

gwfl

Wi-Fi globale

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

gble

Bluetooth globale

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

m

Varie

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 e mobile radio active unknown time

gn

Rete globale

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, Wi-Fi TX total packets

br

Luminosità schermo

dark, dim, medium, light e bright

sst

Tempo di scansione del segnale

signal scanning time

sgt

Tempo di intensità del segnale

none, poor, moderate, good e great

sgc

Conteggio intensità del segnale

none, poor, moderate, good e great

dct

Tempo di connessione dati

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

dcc

Numero di connessioni dati

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

wst

Ora stato Wi-Fi

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

wsc

Conteggio stati Wi-Fi

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

wsst/p>

Ora stato supplente Wi-Fi

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

wssc

Numero stati supplici Wi-Fi

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

wsgt

Tempo di intensità del segnale Wi-Fi

none, poor, moderate, good e great

wsgc

Conteggio intensità segnale Wi-Fi

none, poor, moderate, good e great

bst

Ora stato Bluetooth

inactive, low, med e high

bsc

Conteggio stati Bluetooth

inactive, low, med e high

pws

Riepilogo utilizzo energetico

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

pwi

Articolo da utilizzare con batteria

label, mAh

dsd

Passo di scarico

duration, level, screen e power-save

csd

Passo di ricarica

duration, level, screen e power-save

dtr

Tempo di esaurimento rimanente

battery time remaining

ctr

Tempo di ricarica rimanente

charge time remaining

Nota: prima di Android 6.0, l'utilizzo di energia per radio Bluetooth, radio cellulare e Wi-Fi veniva monitorato nella categoria della sezione m (Varie). In Android 6.0 e versioni successive, il consumo energetico di questi componenti viene monitorato nella sezione pwi (Articolo per l'utilizzo avanzato) con singole etichette (wifi, blue, cell) per ogni componente.

Visualizza allocazioni della memoria

Puoi controllare l'utilizzo della memoria della tua app in due modi: per un determinato periodo di tempo utilizzando procstats o in un determinato momento utilizzando meminfo. Nelle sezioni seguenti viene illustrato come utilizzare entrambi i metodi.

procstat

procstats consente di controllare il comportamento della tua app nel tempo, incluso il tempo di esecuzione in background e la quantità di memoria utilizzata in quel lasso di tempo. Ti aiuta a individuare rapidamente inefficienze e comportamenti errati nell'app, come perdite di memoria, che possono influire sulle sue prestazioni, soprattutto quando vengono eseguite su dispositivi con memoria ridotta. Il dump dello stato mostra statistiche relative al runtime di ogni applicazione, alle dimensioni del set proporzionale (PSS), alle dimensioni del set univoco (USS) e alle dimensioni del set residente (RSS).

Per ottenere le statistiche sull'utilizzo della memoria dell'applicazione nelle ultime tre ore, in formato leggibile, esegui questo comando:

adb shell dumpsys procstats --hours 3

Come mostrato nell'esempio seguente, l'output mostra la percentuale di tempo in cui l'applicazione è stata in esecuzione e PSS, USS e RSS come minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS rispetto al numero di esempi.

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

Puoi registrare uno snapshot del modo in cui la memoria della tua app viene suddivisa tra diversi tipi di allocazione della RAM con il comando seguente:

adb shell dumpsys meminfo package_name|pid [-d]

Il flag -d stampa ulteriori informazioni relative all'utilizzo della memoria Dalvik e ART.

L'output elenca tutte le allocazioni attuali della tua app, misurate in kilobyte.

Quando esamini queste informazioni, dovresti conoscere i seguenti tipi di allocazione:

RAM privata (pulita e sporca)
Si tratta della memoria utilizzata solo dal tuo processo. Si tratta della maggior parte della RAM che il sistema può recuperare quando il processo dell'app viene eliminato. In genere, la parte più importante è la RAM sporca privata, che è la più costosa perché viene utilizzata solo dal tuo processo e perché i suoi contenuti esistono solo nella RAM, quindi non può essere ingaggiata nello spazio di archiviazione, perché Android non utilizza lo scambio. Tutte le allocazioni di heap native e Dalvik che effettui sono RAM private dirty. Dalvik e le allocazioni native che condividi con il processo Zygote sono RAM sporca condivisa.
Dimensioni set proporzionali (PSS)
Si tratta di una misurazione dell'utilizzo della RAM da parte dell'app che tiene conto della condivisione delle pagine tra i processi. Qualsiasi pagina RAM univoca per il tuo processo contribuisce direttamente al suo valore PSS, mentre le pagine condivise con altri processi contribuiscono al valore PSS solo in proporzione alla quantità di condivisione. Ad esempio, una pagina condivisa tra due processi contribuisce a metà delle sue dimensioni al PPS di ciascun processo.

Una caratteristica della misurazione PSS è che è possibile sommarla in tutti i processi per determinare la memoria effettiva utilizzata da tutti i processi. Ciò significa che PSS è una buona misura per il peso effettivo della RAM di un processo e per il confronto con l'utilizzo della RAM di altri processi e la RAM totale disponibile.

Ad esempio, di seguito è riportato l'output per il processo di Map su un dispositivo Nexus 5:

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

Nota: le informazioni visualizzate potrebbero essere leggermente diverse da quelle mostrate qui, perché alcuni dettagli dell'output variano a seconda della versione della piattaforma.

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

Ecco una versione precedente di dumpsys su Dalvik dell'app 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

In generale, considera solo le colonne Pss Total e Private Dirty. In alcuni casi, anche le colonne Private Clean e Heap Alloc forniscono dati interessanti.

Di seguito vengono fornite ulteriori informazioni sulle diverse allocazioni di memoria da osservare:

Dalvik Heap
La RAM utilizzata da Dalvik allocazioni nella tua app. Il Pss Total include tutte le allocazioni Zygote, ponderate in base alla loro condivisione tra processi, come descritto nella definizione del PSS. Il numero Private Dirty è la RAM effettiva impegnata solo nell'heap della tua app, composta dalle tue allocazioni e dalle eventuali pagine di allocazione di Zygote che sono state modificate dopo aver eseguito il foro del processo della tua app da Zygote.

Nota: nelle versioni di piattaforma più recenti che contengono la sezione Dalvik Other, i numeri Pss Total e Private Dirty per Dalvik Heap non includono l'overhead Dalvik, come la compilazione just-in-time (JIT) e la contabilità GC, mentre le versioni precedenti riportano il tutto in Dalvik.

Heap Alloc è la quantità di memoria che Dalvik e gli allocatori di heap nativi tengono traccia per la tua app. Questo valore è maggiore di Pss Total e Private Dirty perché il tuo processo è stato fork da Zygote e include allocazioni che il tuo processo condivide con tutti gli altri.

.so mmap e .dex mmap
La RAM utilizzata per il codice .so (nativo) e .dex (Dalvik o ART) mappato. Il numero Pss Total include il codice della piattaforma condiviso tra le app. Private Clean è il codice della tua app. In genere, le dimensioni effettive della mappa sono maggiori. La RAM in questo caso è solo quella che deve trovarsi attualmente nella RAM per il codice eseguito dall'app. Tuttavia, .so mmap ha un'ingombrante privata di grandi dimensioni, dovuta a correzioni del codice nativo quando è stato caricato nell'indirizzo finale.
.oat mmap
Si tratta della quantità di RAM utilizzata dall'immagine codice. Si basa sulle classi precaricate comunemente usate da più app. Questa immagine è condivisa con tutte le app e non è interessata da queste.
.art mmap
Si tratta della quantità di RAM utilizzata dall'immagine heap. Si basa sulle classi precaricate comunemente usate da più app. Questa immagine è condivisa tra tutte le app e non è influenzata da determinate app. Anche se l'immagine ART contiene istanze Object, non viene conteggiata ai fini delle dimensioni dello heap.
.Heap (solo con flag -d)
Si tratta della quantità di memoria heap per la tua app. Sono esclusi gli oggetti nell'immagine e gli spazi oggetti di grandi dimensioni, ma include lo spazio Zygote e lo spazio non mobile.
.LOS (solo con flag -d)
Si tratta della quantità di RAM utilizzata dal grande spazio di oggetti ART. Sono inclusi gli oggetti Zygote di grandi dimensioni. Gli oggetti di grandi dimensioni sono tutte allocazioni di array primitive superiori a 12 kB.
.GC (solo con flag -d)
Si tratta dei costi generali per la garbage collection. Non c'è modo di ridurre queste spese.
.JITCache (solo con flag -d)
Si tratta della quantità di memoria utilizzata dai dati e dalle cache di codice JIT. In genere, questo valore è pari a zero, poiché tutte le app vengono compilate al momento dell'installazione.
.Zygote (solo con flag -d)
Si tratta della quantità di memoria utilizzata dallo spazio Zygote. Lo spazio Zygote viene creato durante l'avvio del dispositivo e non viene mai allocato.
.NonMoving (solo con flag -d)
Si tratta della quantità di RAM utilizzata dallo spazio fisso ART. Lo spazio non mobile contiene oggetti speciali non spostabili come campi e metodi. Puoi ridurre questa sezione utilizzando meno campi e metodi nella tua app.
.IndirectRef (solo con flag -d)
La quantità di RAM utilizzata dalle tabelle di riferimento indirette ART. Di solito questo importo è basso, ma se è troppo alto, potresti riuscire a ridurlo riducendo il numero di riferimenti JNI locali e globali utilizzati.
Unknown
Le pagine RAM che il sistema non è riuscito a classificare in uno degli altri elementi più specifici. Attualmente, contiene principalmente allocazioni native che non possono essere identificate dallo strumento durante la raccolta di questi dati a causa della randomizzazione del layout dello spazio degli indirizzi (ASLR). Come l'heap Dalvik, Pss Total per Unknown prende in considerazione la condivisione con Zygote, mentre Private Dirty è una RAM sconosciuta dedicata solo alla tua app.
TOTAL
La RAM totale di dimensioni set proporzionali (PSS) totali utilizzata dal processo. Questa è la somma di tutti i campi PSS sopra di esso. Indica il peso complessivo della memoria del processo, che può essere confrontato direttamente con altri processi, e la RAM totale disponibile.

Private Dirty e Private Clean sono le allocazioni totali all'interno del tuo processo, che non vengono condivise con altri processi. Quando il processo viene eliminato, tutta la RAM di queste allocazioni viene rilasciata al sistema. Private Clean può anche essere paginato e rilasciato prima dell'eliminazione del processo, ma Private Dirty viene rilasciato solo al momento dell'eliminazione del processo.

La RAM dirty è le pagine che sono state modificate e quindi devono rimanere impegnate nella RAM perché non c'è scambio. RAM pulita sono pagine che sono state mappate da un file permanente, ad esempio il codice in esecuzione, e che possono essere impaginate se non vengono utilizzate per un determinato periodo di tempo.

ViewRootImpl
Il numero di viste principali attive nel processo. Ogni vista principale è associata a una finestra e questo può aiutarti a identificare perdite di memoria che coinvolgono finestre di dialogo o altre finestre.
AppContexts e Activities
Il numero di oggetti Context e Activity app attualmente attivi nel processo. Ciò può aiutarti a identificare rapidamente gli oggetti Activity trapelati che non possono essere garbage collection a causa di riferimenti statici su di essi, che è una pratica comune. A questi oggetti spesso sono associate molte altre allocazioni, il che li rende un ottimo modo per monitorare grandi perdite di memoria.