dumpsys
è uno strumento che funziona sui dispositivi Android e fornisce informazioni sui servizi di sistema. Chiama dumpsys
dalla riga di comando utilizzando Android Debug Bridge (ADB) per ottenere l'output di diagnostica per tutti i servizi di sistema in esecuzione su un dispositivo connesso.
In genere, questo output è più dettagliato del necessario, quindi utilizza le opzioni di riga di comando in questa pagina per ottenere l'output solo per i servizi di sistema che ti interessano. Questa pagina descrive anche come utilizzare dumpsys
per svolgere attività comuni, come controllare l'input, la RAM, la batteria o la diagnostica di 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 del dispositivo connesso, esegui adb shell dumpsys
.
Tuttavia, vengono visualizzate molte più informazioni del solito. Per un output più gestibile, specifica il servizio che vuoi esaminare includendolo nel comando. Ad esempio, il comando riportato di seguito fornisce i dati di sistema per i componenti di input, come i touchscreen o le tastiere integrate:
adb shell dumpsys input
Per un elenco completo dei servizi di sistema che puoi utilizzare con dumpsys
, usa il seguente comando:
adb shell dumpsys -l
Opzioni della riga di comando
La tabella seguente elenca le opzioni disponibili quando utilizzi dumpsys
:
Opzione | Descrizione |
---|---|
-t timeout
|
Specifica il periodo di timeout in secondi. Se non specificato, il valore predefinito è 10 secondi. |
--help
|
Stampa il testo di aiuto per lo strumento dumpsys .
|
-l
|
Mostra un elenco completo dei servizi di sistema che puoi utilizzare con
dumpsys .
|
--skip services
|
Specifica i services che non vuoi includere nell'output. |
service [arguments]
|
Specifica il valore service da stampare. Alcuni servizi
potrebbero consentirti di passare arguments facoltativo. Per scoprire di più su questi argomenti facoltativi, passa l'opzione -h con il servizio:
adb shell dumpsys procstats -h |
-c
|
Quando specifichi determinati servizi, aggiungi questa opzione per produrre dati in un formato adatto alle macchine. |
-h
|
Per alcuni servizi, aggiungi questa opzione per visualizzare il testo di aiuto e altre opzioni per il servizio in questione. |
Controllare la diagnostica dell'input
Se specifichi il servizio input
, come mostrato nel comando seguente, viene dumpato 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 collegato. Le sezioni seguenti descrivono il tipo di informazioni che in genere viene visualizzato.
Stato dell'hub di eventi
Di seguito è riportato un esempio di ciò che potresti vedere quando esamini lo stato Event Hub della diagnostica di 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 ...
Inserisci stato lettore
InputReader
è responsabile della decodifica degli eventi di input dal kernel. Il dump dello stato mostra informazioni su come è configurato ogni dispositivo di input e sulle modifiche dello stato recenti che si sono verificate, ad esempio pressioni dei tasti o tocchi sullo schermo touch.
L'esempio seguente mostra l'output per 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 presenti alcune informazioni sui parametri di configurazione globale, 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
Stato del gestore degli input
InputDispatcher
è responsabile dell'invio di eventi di input alle applicazioni.
Come mostrato nell'output di esempio seguente, il dump dello stato mostra informazioni su quale finestra viene toccata, sullo stato della coda di input, sull'eventuale presenza di un ANR in corso e su 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 ha un file di layout della tastiera, un file della mappa dei caratteri della tastiera e un file di configurazione del dispositivo di input appropriati. 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 inEventHub.h
, comeINPUT_DEVICE_CLASS_TOUCH_MT
. - Il numero
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, significa che manca un file di mappa dei caratteri chiave per un tastierino con funzioni speciali. I dispositivi con tastierino con funzioni speciali devono avere file di mappatura dei caratteri dei tasti che contengono solo la rigatype SPECIAL_FUNCTION
.
Inserisci lo stato del lettore:
- Sono presenti tutti i dispositivi di input previsti.
- Ogni dispositivo di input sia configurato correttamente. In particolare, controlla che gli assi del touchscreen e del joystick siano corretti.
Input dispatcher state:
- Tutti gli eventi di input vengono elaborati come previsto.
- Dopo aver toccato il touchscreen ed eseguito
dumpsys
contemporaneamente, la rigaTouchStates
identifica correttamente la finestra che stai toccando.
Testare le prestazioni dell'interfaccia utente
La specifica del servizio gfxinfo
fornisce all'output informazioni sul rendimento relative ai frame di animazione che si verificano durante la fase di registrazione.
Il seguente comando utilizza gfxinfo
per raccogliere i dati sul rendimento dell'interfaccia utente per un nome del pacchetto specificato:
adb shell dumpsys gfxinfo package-name
Puoi anche includere l'opzione framestats
per fornire informazioni ancora più dettagliate sui tempi dei frame dai frame recenti, in modo da poter rilevare e eseguire il debug dei problemi con maggiore precisione:
adb shell dumpsys gfxinfo package-name framestats
Per scoprire di più sull'utilizzo di gfxinfo
e framestats
per integrare le misurazioni delle prestazioni dell'UI nelle tue pratiche di test, consulta Scrivere un macrobenchmark.
Controllare la diagnostica di rete
Se specifichi il servizio netstats
, vengono fornite le statistiche sull'utilizzo della rete raccolte dal successivo avvio del dispositivo. Per visualizzare informazioni aggiuntive, ad esempio informazioni dettagliate sull'ID utente univoco (UID), includi l'opzione detail
, come segue:
adb shell dumpsys netstats detail
L'output varia in base alla versione di Android in esecuzione sul dispositivo collegato. Le sezioni seguenti descrivono il tipo di informazioni che in genere viene visualizzato.
Interfacce attive e interfacce UID attive
L'output di esempio riportato di seguito elenca le interfacce attive e le interfacce UID attive del dispositivo connesso. Nella maggior parte dei casi, le informazioni per le interfacce attive e 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" ed "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 ogni 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 etichettata
userId
.
Ad esempio, per trovare l'utilizzo della rete per l'app "com.example.myapp", esegui il seguente 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 con uid=10007
. Esistono due linee di questo tipo: la prima indica una connessione mobile e la seconda una connessione Wi-Fi. Sotto ogni riga puoi vedere le seguenti informazioni per ogni finestra di due ore, che bucketDuration
specifica in millisecondi:
-
set=DEFAULT
indica l'utilizzo della rete in primo piano, mentreset=BACKGROUND
indica l'utilizzo in background.set=ALL
implica entrambi. -
tag=0x0
indica il tag socket associato al traffico. -
rxBytes
erxPackets
rappresentano i byte ricevuti e i pacchetti ricevuti nell'intervallo di tempo corrispondente. -
txBytes
etxPackets
rappresentano i byte inviati (trasmessi) e i pacchetti inviati nell'intervallo di tempo corrispondente.
Controllare la diagnostica della batteria
La specifica del servizio batterystats
genera dati statistici sull'utilizzo della batteria su un dispositivo, organizzati in base all'ID utente univoco (UID). Per scoprire come usare dumpsys
per testare la tua app per Sospensione e Standby delle app, consulta Testare con Sospensione e Standby delle app.
Il comando per batterystats
è il seguente:
adb shell dumpsys batterystats options
Per visualizzare un elenco di opzioni aggiuntive disponibili per batterystats
, includi l'opzione -h
. Il seguente esempio genera statistiche sull'utilizzo della batteria per un
pacchetto di app specificato dall'ultima ricarica del dispositivo:
adb shell dumpsys batterystats --charged package-name
L'output in genere include quanto segue:
- Cronologia degli eventi relativi alla batteria
- Statistiche globali per il dispositivo
- Utilizzo approssimativo dell'alimentazione per UID e componente di sistema
- Milisecondi per pacchetto per app mobile
- Statistiche aggregate dell'UID di sistema
- Statistiche aggregate dell'UID dell'app
Per scoprire 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, leggi l'articolo Profilare l'utilizzo della batteria con Batterystats e Battery Historian.
Controllare l'output adatto alle macchine
Puoi generare l'output di batterystats
in formato CSV leggibile dal computer utilizzando
il seguente comando:
adb shell dumpsys batterystats --checkin
Di seguito è riportato un esempio di 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 per UID o a livello di sistema. I dati vengono selezionati per l'inclusione in base alla loro utilità per l'analisi del rendimento 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 correlate allo stato di ricarica/scarica.l
per--charged
(utilizzo dall'ultima ricarica).u
per--unplugged
(utilizzo dall'ultimo scollegamento). È stata ritirata in Android 5.1.1.
- Identificatore di sezione, che determina la modalità di interpretazione dei valori successivi nella riga.
La seguente tabella descrive i vari identificatori di sezione che potresti visualizzare:
Identificatore sezione | Descrizione | Campi rimanenti |
---|---|---|
|
Versione |
|
|
UID |
|
|
APK |
|
|
Procedura |
|
|
Sensore |
|
|
Vibratore |
|
|
Primo piano |
|
|
Ora statale |
|
|
Wake lock |
|
|
Sincronizza |
|
|
Job |
|
|
Wakelock del kernel |
|
|
Motivo sveglia |
|
|
Rete |
|
|
Attività degli utenti |
|
|
Batteria |
|
|
Scarico della batteria |
|
|
Livello della batteria |
|
|
Wi-Fi |
|
|
Wi-Fi globale |
|
|
Bluetooth globale |
|
|
Varie |
|
|
Rete globale |
|
|
Luminosità schermo |
|
|
Ora scansione degli indicatori |
|
|
Ora intensità del segnale |
|
|
Conteggio intensità segnale |
|
|
Data Connection Time |
|
|
Conteggio connessioni dati |
|
|
Ora stato Wi-Fi |
|
|
Conteggio stato Wi-Fi |
|
|
Ora stato del richiedente Wi-Fi |
|
|
Conteggio stato del richiedente Wi-Fi |
|
|
Ora intensità del segnale Wi-Fi |
|
|
Conteggio dell'intensità del segnale Wi-Fi |
|
|
Ora stato Bluetooth |
|
|
Conteggio stato Bluetooth |
|
|
Riepilogo del consumo di energia |
|
|
Elemento di utilizzo dell'alimentazione |
|
|
Passaggio di scarico |
|
|
Passaggio di addebito |
|
|
Tempo di ricarica rimanente |
|
|
Tempo di ricarica rimanente |
|
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, l'utilizzo di energia per questi componenti viene monitorato nella sezione pwi
(elemento di utilizzo di energia) con singole etichette (wifi
, blue
, cell
) per ciascun componente.
Visualizzare le allocazioni della memoria
Puoi controllare l'utilizzo della memoria dell'app in due modi: in un periodo di tempo utilizzando procstats
o in un determinato momento utilizzando meminfo
.
Le sezioni seguenti mostrano come utilizzare entrambi i metodi.
procstats
procstats
consente di vedere il comportamento della tua app nel tempo, incluso il tempo di esecuzione in background e la quantità di memoria utilizzata durante questo periodo. Ti aiuta a trovare rapidamente inefficienze e comportamenti errati nella tua app, ad esempio perdite di memoria, che possono influire sul suo rendimento, in particolare quando viene eseguita su dispositivi con poca memoria. Il dump dello stato mostra le statistiche relative al runtime, alle dimensioni del set proporzionale (PSS), alle dimensioni del set univoco (USS) e alle dimensioni del set residente (RSS) di ogni applicazione.
Per ottenere le statistiche sull'utilizzo della memoria dell'applicazione nelle ultime tre ore in formato leggibile, esegui il seguente 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 i valori PSS, USS e RSS come minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS
rispetto al numero di campioni.
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 della suddivisione della memoria dell'app tra diversi tipi di allocazione della RAM con il seguente comando:
adb shell dumpsys meminfo [-d] package_name|pid
Il flag -d
stampa ulteriori informazioni relative all'utilizzo della memoria di Dalvik e ART.
Il flag -h
stampa tutti i flag supportati.
L'output elenca tutte le allocazioni correnti dell'app, misurate in kilobyte.
Quando esamini queste informazioni, devi conoscere i seguenti tipi di allocazione:
- RAM privata (pulita e sporca)
- Si tratta di memoria utilizzata solo dal tuo processo. Si tratta della maggior parte della RAM che il sistema può recuperare quando il processo dell'app viene distrutto. In genere, la parte più importante è la RAM private dirty, che è la più costosa perché viene utilizzata solo dal tuo processo e perché i suoi contenuti esistono solo in RAM, quindi non possono essere paginati nello spazio di archiviazione, perché Android non utilizza lo scambio. Tutte le allocazioni dell'heap Dalvik e native che effettui sono RAM sporca privata. Le allocazioni Dalvik e native che condividi con il processo Zygote sono condivise in RAM sporca.
- Dimensione set proporzionale (PSS)
- Si tratta di una misurazione dell'utilizzo della RAM dell'app che prende in considerazione la condivisione di pagine tra i processi. Le pagine RAM univoche per il processo contribuiscono direttamente al relativo 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 con metà delle sue dimensioni al PSS di ciascun processo.
Una caratteristica della misurazione della PSS è che puoi sommare la PSS di tutti i processi per determinare la memoria effettiva utilizzata da tutti i processi. Ciò significa che il PSS è una buona misura del peso effettivo della RAM di un processo e per il confronto con l'utilizzo della RAM di altri processi e della RAM totale disponibile.
Ad esempio, di seguito è riportato l'output del processo di Map su un dispositivo Nexus 5:
adb shell dumpsys meminfo -d com.google.android.apps.maps
Nota: le informazioni visualizzate potrebbero variare leggermente da quelle mostrate qui, perché alcuni dettagli dell'output variano in base alle versioni 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 un dumpsys
precedente 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, tieni conto solo delle colonne Pss Total
e Private Dirty
.
In alcuni casi, anche le colonne Private Clean
e Heap Alloc
forniscono dati interessanti.
Di seguito sono riportate ulteriori informazioni sulle diverse allocazioni della memoria che dovresti osservare:
Dalvik Heap
- La RAM utilizzata dalle allocazioni di Dalvik nella tua app.
Pss Total
include tutte le allocazioni di Zygote, ponderate in base alla loro condivisione tra i processi, come descritto nella definizione di PSS. Il numeroPrivate Dirty
corrisponde alla RAM effettiva impegnata solo per l'heap dell'app, composta dalle tue allocazioni e da eventuali pagine di allocazione di Zygote che sono state modificate dal fork del processo dell'app da Zygote.Nota: nelle versioni più recenti della piattaforma che includono la sezione
Dalvik Other
, i numeriPss Total
ePrivate Dirty
per l'heap di Dalvik non includono il sovraccarico di Dalvik, ad esempio la compilazione just-in-time (JIT) e la contabilità GC, mentre le versioni precedenti li elencano tutti combinati inDalvik
.Heap Alloc
indica la quantità di memoria monitorata dagli allocatori dell'heap Dalvik e nativo per la tua app. Questo valore è maggiore diPss Total
ePrivate Dirty
perché il processo è stato eseguito in fork da Zygote e include le allocazioni condivise con tutti gli altri. .so mmap
e.dex mmap
- La RAM utilizzata per il codice
.so
(nativo) e.dex
(Dalvik o ART) mappato. Il numeroPss Total
include il codice della piattaforma condiviso tra le app.Private Clean
è il codice della tua app. In genere, le dimensioni mappate effettive sono maggiori. La RAM qui è solo quella che attualmente deve essere in RAM per il codice eseguito dall'app. Tuttavia,.so mmap
ha una grande area privata non in memoria, che è dovuta ai fix al codice nativo quando è stato caricato nel suo indirizzo finale. .oat mmap
- Si tratta della quantità di RAM utilizzata dall'immagine del codice. Si basa sulle classi precaricate comunemente utilizzate da più app. Questa immagine viene condivisa tra tutte le app e non è interessata da app specifiche.
.art mmap
- Questa è la quantità di RAM utilizzata dall'immagine dell'heap. Si basa sulle classi precaricate comunemente utilizzate da più app. Questa immagine è condivisa tra tutte le app e non è interessata da app specifiche. Anche se l'immagine ART contiene
Object
istanze, non viene conteggiata ai fini delle dimensioni dell'heap. .Heap
(solo con il flag-d
)- Si tratta della quantità di memoria heap per la tua app. Sono esclusi gli oggetti negli spazi di immagini e oggetti di grandi dimensioni, ma sono inclusi lo spazio Zygote e lo spazio statico.
.LOS
(solo con il flag-d
)- Questa è la quantità di RAM utilizzata dallo spazio di oggetti di grandi dimensioni ART. Sono inclusi gli oggetti di grandi dimensioni di Zygote. Gli oggetti di grandi dimensioni sono tutte allocazioni di array primitivi superiori a 12 KB.
.GC
(solo con il flag-d
)- Si tratta del costo di overhead per la raccolta dei rifiuti. Non è possibile ridurre questo overhead.
.JITCache
(solo con il flag-d
)- Questa è la quantità di memoria utilizzata dalle cache di dati e codice JIT. In genere, questo valore è pari a zero, poiché tutte le app vengono compilate al momento dell'installazione.
.Zygote
(solo con il flag-d
)- Questa è la 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 il flag-d
)- Si tratta della quantità di RAM utilizzata dallo spazio non mobile ART. Lo spazio statico contiene oggetti speciali non spostabili, come campi e metodi. Puoi ridurre questa sezione utilizzando meno campi e metodi nella tua app.
.IndirectRef
(solo con il flag-d
)- Questa è la quantità di RAM utilizzata dalle tabelle di riferimento indiretto ART. Di solito questo valore è ridotto, ma se è troppo elevato, potresti essere in grado di ridurlo riducendo il numero di riferimenti JNI locali e globali utilizzati.
Unknown
- Qualsiasi pagina RAM che il sistema non è riuscito a classificare in uno degli altri elementi più specifici. Al momento, 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 indirizzi (ASLR). Come per l'heap Dalvik,
Pss Total
perUnknown
prende in considerazione la condivisione con Zygote ePrivate Dirty
è la RAM sconosciuta dedicata solo alla tua app. TOTAL
- La RAM totale del set proporzionale (PSS) utilizzata dal processo. ovvero la
somma di tutti i campi PSS soprastanti. Indica il peso complessivo della memoria del processo, che può essere confrontato direttamente con altri processi e con la RAM totale disponibile.
Private Dirty
ePrivate Clean
sono le allocazioni totali all'interno del processo, che non vengono condivise con altri processi. Quando il processo viene distrutto, tutta la RAM di queste allocazioni viene nuovamente rilasciata al sistema.Private Clean
può anche essere espulso dalla pagina e rilasciato prima dell'eliminazione del processo, maPrivate Dirty
viene rilasciato solo al momento dell'eliminazione del processo.La RAM sporca è costituita da pagine che sono state modificate e quindi devono rimanere impegnate nella RAM perché non esiste un file di scambio. La RAM pulita è costituita da pagine mappate da un file persistente, come il codice in esecuzione, e può essere espulsa se non viene utilizzata per un po' di tempo.
ViewRootImpl
- Il numero di visualizzazioni principali attive nel processo. Ogni visualizzazione principale è associata a una finestra, quindi può aiutarti a identificare perdite di memoria che coinvolgono finestre di dialogo o altre finestre.
AppContexts
eActivities
- Il numero di oggetti
Context
Activity
dell'app attualmente presenti nel processo. In questo modo puoi identificare rapidamente gli oggettiActivity
con perdite che non possono essere sottoposti a garbage collection a causa di riferimenti statici, un problema comune. A questi oggetti sono spesso associate molte altre allocazioni, il che li rende un buon modo per monitorare le perdite di memoria di grandi dimensioni.