dumpsys è uno strumento che viene eseguito su dispositivi Android e fornisce informazioni sui servizi di sistema. Chiama dumpsys dalla riga di comando utilizzando
Android Debug Bridge (ADB)
per ottenere l'output diagnostico per tutti i servizi di sistema in esecuzione su un dispositivo connesso.
Questo output è in genere più dettagliato di quanto desideri, quindi utilizza le opzioni della 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 eseguire
attività comuni, come l'ispezione di input, RAM, batteria o 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 per il dispositivo connesso, esegui adb shell dumpsys.
Tuttavia, questo output fornisce molte più informazioni di quelle che in genere ti interessano. 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 touch screen o tastiere integrate:
adb shell dumpsys input
Per un elenco completo dei servizi di sistema che puoi utilizzare con dumpsys, utilizza il seguente comando:
adb shell dumpsys -l
Opzioni della riga di comando
La tabella seguente elenca le opzioni disponibili quando utilizzi 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
|
Restituisce un elenco completo dei servizi di sistema che puoi utilizzare con
dumpsys.
|
--skip services
|
Specifica il services che non vuoi includere nell'output. |
service [arguments]
|
Specifica il service che vuoi generare. Alcuni servizi
potrebbero consentirti di passare arguments facoltativi. 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 generare dati di output in un formato leggibile automaticamente. |
-h
|
Per alcuni servizi, aggiungi questa opzione per visualizzare il testo della guida e altre opzioni per quel servizio. |
Controllare la diagnostica degli input
Se specifichi il servizio input, come mostrato nel seguente comando, viene eseguito il dump dello stato dei dispositivi di input del sistema, come tastiere e touchscreen, e dell'elaborazione degli eventi di input.
adb shell dumpsys input
L'output varia a seconda della versione di Android in esecuzione sul dispositivo connesso. Le sezioni seguenti descrivono il tipo di informazioni che in genere visualizzi.
Stato dell'hub eventi
Di seguito è riportato un esempio di ciò che potresti visualizzare quando esamini lo stato dell'hub eventi 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
...
Input reader state
Il InputReader è responsabile della decodifica degli eventi di input dal kernel. Il
dump dello stato mostra informazioni su come è configurato ogni dispositivo di input e
sui recenti cambiamenti di stato, come la pressione di tasti o i tocchi sullo
schermo touch.
Il seguente esempio mostra l'output per un touch screen. 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 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
Stato del dispatcher di input
Il 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, 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 quando esamini l'output
per il servizio input:
Stato dell'hub eventi:
- Sono presenti tutti i dispositivi di input che ti aspetti.
- Ogni dispositivo di input ha un file di layout della tastiera, un file di mappatura dei caratteri 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
Classescorrispondono ai flag inEventHub.h, comeINPUT_DEVICE_CLASS_TOUCH_MT. - Il valore
BuiltInKeyboardIdè corretto. Se il dispositivo non ha una tastiera integrata, l'ID deve essere-2. In caso contrario, deve essere l'ID della tastiera integrata. - Se noti che il
BuiltInKeyboardIdnon è-2ma dovrebbe esserlo, significa che manca un file di mappatura dei caratteri chiave per un tastierino con funzioni speciali. I dispositivi con tastierino per funzioni speciali devono avere file di mappatura dei caratteri che contengono solo la rigatype SPECIAL_FUNCTION.
Input reader state:
- Sono presenti tutti i dispositivi di input previsti.
- Ogni dispositivo di input è configurato correttamente. In particolare, controlla che gli assi del touch screen e del joystick siano corretti.
Stato del dispatcher di input:
- Tutti gli eventi di input vengono elaborati come previsto.
- Dopo aver toccato il touch screen ed eseguito
dumpsyscontemporaneamente, la lineaTouchStatesidentifica correttamente la finestra che stai toccando.
Testare le prestazioni dell'interfaccia utente
La specifica del servizio gfxinfo fornisce un output con informazioni sul rendimento
relative ai frame di animazione che si verificano durante la fase di registrazione.
Il seguente comando utilizza gfxinfo per raccogliere 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 sul timing dei frame recenti, in modo da poter individuare e risolvere i problemi in modo più accurato:
adb shell dumpsys gfxinfo package-name framestats
Per scoprire di più su come utilizzare 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
La specifica del servizio netstats fornisce statistiche sull'utilizzo della rete raccolte
dall'avvio precedente del dispositivo. Per generare ulteriori informazioni, ad esempio
informazioni dettagliate sull'ID utente univoco (UID), includi l'opzione detail, come
segue:
adb shell dumpsys netstats detail
L'output varia a seconda della versione di Android in esecuzione sul dispositivo connesso. Le sezioni seguenti descrivono il tipo di informazioni che in genere visualizzi.
Interfacce attive e interfacce UID attive
L'output di esempio seguente 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" 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 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 con l'etichetta
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 che contengono 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 visualizzare le seguenti informazioni per
ogni finestra di due ore, che bucketDuration specifica in millisecondi:
-
set=DEFAULTindica l'utilizzo della rete in primo piano, mentreset=BACKGROUNDindica l'utilizzo in background.set=ALLimplica entrambe le cose. -
tag=0x0indica il tag socket associato al traffico. -
rxByteserxPacketsrappresentano i byte ricevuti e i pacchetti ricevuti nell'intervallo di tempo corrispondente. -
txBytesetxPacketsrappresentano i byte inviati (trasmessi) e i pacchetti inviati nel periodo di tempo corrispondente.
Controllare la diagnostica della batteria
La specifica del servizio batterystats genera dati statistici
sull'utilizzo della batteria su un dispositivo, organizzati per ID utente univoco (UID). Per scoprire come
utilizzare dumpsys per testare l'app per la modalità Doze e Standby delle app, consulta
Test con la modalità Doze 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 restituisce le statistiche sull'utilizzo della batteria per un
pacchetto applicativo 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'energia per UID e componente di sistema
- Millisecondi 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 Profilare l'utilizzo della batteria con Batterystats e Battery Historian.
Ispezionare l'output leggibile dalla macchina
Puoi generare l'output 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 a livello di UID o 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:
iper informazioni non correlate allo stato di addebito/non addebito.lper--charged(utilizzo dall'ultima ricarica).uper--unplugged(utilizzo dall'ultimo scollegamento). Deprecato in Android 5.1.1.
- Identificatore di sezione, che determina come interpretare i valori successivi nella riga.
La tabella seguente descrive i vari identificatori di sezione che potresti visualizzare:
Tabella 2. Elenco degli identificatori di sezione
| Identificatore sezione | Descrizione | Campi rimanenti |
|---|---|---|
|
Versione |
|
|
UID |
|
|
APK |
|
|
Processo |
|
|
Sensore |
|
|
Vibratore |
|
|
Primo piano |
|
|
Ora dello stato |
|
|
Wake lock |
|
|
Sincronizza |
|
|
Job |
|
|
Kernel Wake Lock |
|
|
Motivo del risveglio |
|
|
Rete |
|
|
Attività utente |
|
|
Batteria |
|
|
Scarica della batteria |
|
|
Livello della batteria |
|
|
Wi-Fi |
|
|
Wi-Fi globale |
|
|
Bluetooth globale |
|
|
Varie |
|
|
Rete globale |
|
|
Luminosità schermo |
|
|
Tempo di scansione del segnale |
|
|
Tempo di intensità del segnale |
|
|
Conteggio intensità del segnale |
|
|
Tempo di connessione dati |
|
|
Conteggio connessioni dati |
|
|
Tempo di stato del Wi-Fi |
|
|
Conteggio stati Wi-Fi |
|
|
Wi-Fi Supplicant State Time |
|
|
Conteggio stati supplicant Wi-Fi |
|
|
Ora dell'intensità del segnale Wi-Fi |
|
|
Conteggio dell'intensità del segnale Wi-Fi |
|
|
Ora stato Bluetooth |
|
|
Conteggio stati Bluetooth |
|
|
Riepilogo dell'utilizzo dell'energia |
|
|
Elemento di utilizzo avanzato |
|
|
Passaggio di scarico |
|
|
Passaggio di addebito |
|
|
Tempo di scarica rimanente |
|
|
Tempo di ricarica rimanente |
|
Nota: prima di Android 6.0, il consumo energetico per
la radio Bluetooth, la radio cellulare e il Wi-Fi veniva monitorato nella categoria
m (Varie). In Android 6.0 e versioni successive, il consumo energetico di questi componenti viene
monitorato nella sezione pwi (Elemento di consumo energetico) con etichette individuali
(wifi, blue, cell) per ogni componente.
Visualizzare le allocazioni della memoria
Puoi esaminare l'utilizzo di memoria della tua app in due modi: in un periodo di tempo utilizzando procstats o in un momento specifico utilizzando meminfo.
Le sezioni seguenti mostrano come utilizzare entrambi i metodi.
procstats
procstats consente di vedere il comportamento dell'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 anomali nella tua app, come perdite di memoria, che possono influire sulle sue prestazioni, soprattutto quando viene eseguita su dispositivi con poca memoria. Il dump dello stato mostra le statistiche sul runtime, sulla dimensione del set proporzionale (PSS), sulla dimensione del set univoca (USS) e sulla dimensione del set residente (RSS) di ogni applicazione.
Per ottenere statistiche sull'utilizzo della memoria utilizzata 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 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 di come la memoria della tua app è divisa 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 alla memoria utilizzata da Dalvik e ART.
Il flag -h stampa tutti i flag supportati.
L'output elenca tutte le allocazioni correnti della tua app, misurate in kilobyte.
Quando esamini queste informazioni, devi conoscere i seguenti tipi di allocazione:
- RAM privata pulita e sporca
- Questa è la memoria utilizzata solo dal tuo processo. Si tratta della maggior parte della RAM che il sistema può recuperare quando il processo dell'app viene interrotto. In genere, la parte più importante è la RAM privata modificata, che è la più costosa perché viene utilizzata solo dal tuo processo e perché i suoi contenuti esistono principalmente nella RAM attiva. Anche se Android evita i tradizionali file di scambio su disco, utilizza zRAM (compressione delle pagine in memoria) per scambiare le pagine sporche e occasionalmente zRAM Writeback per archiviare le pagine inattive nella memoria flash. Tuttavia, poiché la compressione delle pagine costa cicli di CPU e le scritture flash sono strettamente limitate per evitare l'usura dell'hardware, la RAM modificata privata non può essere eliminata senza costi. Tutte le allocazioni dell'heap Dalvik e nativo che effettui sono RAM privata modificata. Le allocazioni Dalvik e native che condividi con il processo Zygote sono RAM modificata condivisa.
- Dimensione insieme proporzionale (PSS)
- Si tratta di una misurazione dell'utilizzo della RAM della tua app che tiene conto della condivisione delle pagine tra i processi. Le pagine RAM univoche per il tuo processo contribuiscono 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 per metà delle sue dimensioni al PSS di ciascun processo.
Una caratteristica della misurazione PSS è che puoi sommare il PSS di tutti i processi per determinare la memoria effettiva utilizzata da tutti i processi. Ciò significa che 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 la RAM totale disponibile.
Ad esempio, di seguito è riportato l'output per il processo di Maps su un dispositivo Nexus 5:
adb shell dumpsys meminfo -d com.google.android.apps.maps
Nota:le informazioni visualizzate potrebbero variare leggermente rispetto a quelle mostrate qui, perché alcuni dettagli dell'output differiscono tra le 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 una 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, concentrati solo sulle 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 di memoria che devi osservare:
Dalvik Heap- La RAM utilizzata dalle allocazioni Dalvik nella tua app. Il valore
Pss Totalinclude tutte le allocazioni Zygote, ponderate in base alla condivisione tra i processi, come descritto nella definizione di PSS. Il numeroPrivate Dirtyè la RAM effettiva allocata solo all'heap della tua app, composta dalle tue allocazioni e da tutte le pagine di allocazione Zygote modificate dopo il fork del processo della tua app da Zygote.Nota: nelle versioni della piattaforma più recenti che hanno la sezione
Dalvik Other, i numeriPss TotalePrivate Dirtyper l'heap Dalvik non includono l'overhead Dalvik, ad esempio la compilazione just-in-time (JIT) e la gestione della memoria GC, mentre le versioni precedenti elencano tutto combinato inDalvik.Heap Allocè la quantità di memoria di cui i programmi di allocazione dell'heap Dalvik e nativo tengono traccia per la tua app. Questo valore è maggiore diPss TotalePrivate Dirtyperché il tuo processo è stato derivato da Zygote e include le allocazioni che il tuo processo condivide con tutti gli altri. .so mmape.dex mmap- La RAM utilizzata per il codice
.so(nativo) e.dex(Dalvik o ART) mappato. Il numeroPss Totalinclude 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 deve essere attualmente nella RAM per il codice eseguito dall'app. Tuttavia,.so mmapha un'ampia area privata modificata, dovuta alle correzioni al codice nativo quando è stato caricato nel suo indirizzo finale. .oat mmap- Quantità di RAM utilizzata dall'immagine del codice. Si basa sulle classi precaricate di uso comune utilizzate da più app. Questa immagine viene condivisa in tutte le app e non è influenzata da app specifiche.
.art mmap- Questa è la quantità di RAM utilizzata dall'immagine heap. Si basa sulle
classi precaricate di uso comune utilizzate da più app. Questa immagine è condivisa tra tutte le app e non è influenzata da app specifiche. Anche se l'immagine ART
contiene
Objectistanze, non viene conteggiata ai fini delle dimensioni dell'heap. .Heap(solo con il flag-d)- Questa è la quantità di memoria heap per la tua app. Sono esclusi gli oggetti negli spazi per immagini e oggetti di grandi dimensioni, ma sono inclusi lo spazio Zygote e lo spazio non mobile.
.LOS(solo con il flag-d)- Questa è la quantità di RAM utilizzata dallo spazio per oggetti di grandi dimensioni ART. Sono inclusi gli oggetti di grandi dimensioni di Zygote. Gli oggetti di grandi dimensioni sono tutte le allocazioni di array primitivi più grandi di 12 KB.
.GC(solo con il flag-d)- Questo è il costo generale per la garbage collection. 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 è 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 all'avvio del dispositivo e non viene mai allocato.
.NonMoving(solo con il flag-d)- Questa è la quantità di RAM utilizzata dallo spazio non mobile ART. Lo spazio non mobile contiene oggetti speciali non mobili, 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 importo è piccolo, ma se è troppo elevato, potresti ridurlo diminuendo 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 di indirizzi (ASLR). Come l'heap Dalvik, la
Pss TotalperUnknowntiene conto della condivisione con Zygote ePrivate Dirtyè la RAM sconosciuta dedicata solo alla tua app. TOTAL- La RAM totale Proportional Set Size (PSS) utilizzata dal processo. Si tratta della
somma di tutti i campi PSS sopra. Indica il peso complessivo della memoria del tuo processo, che può essere confrontato direttamente con altri processi e con la RAM totale disponibile.
Private DirtyePrivate Cleansono 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 rilasciata di nuovo al sistema.Private Cleanpuò anche essere spostato nella memoria virtuale e rilasciato prima che il processo venga eliminato, mentrePrivate Dirtyviene rilasciato solo al momento dell'eliminazione del processo.La RAM sporca è costituita da pagine che sono state modificate e vengono mantenute nella RAM attiva, compresse in zRAM o riscritte nello spazio di archiviazione. La RAM pulita è costituita da pagine mappate da un file persistente, ad esempio codice in esecuzione, e può essere spostata se non viene utilizzata per un po' di tempo.
ViewRootImpl- Il numero di visualizzazioni principali attive nel tuo processo. Ogni visualizzazione principale è associata a una finestra, quindi questo può aiutarti a identificare perdite di memoria che coinvolgono dialoghi o altre finestre.
AppContextseActivities- Il numero di oggetti
ContexteActivitydell'app attualmente presenti nel tuo processo. In questo modo puoi identificare rapidamente gli oggettiActivitycon perdite che non possono essere sottoposti a garbage collection a causa di riferimenti statici, il che è comune. Questi oggetti spesso hanno molte altre allocazioni associate, il che li rende un buon modo per monitorare perdite di memoria di grandi dimensioni.