dumpsys
ist ein Tool, das auf Android-Geräten ausgeführt wird und Informationen zu Systemdiensten liefert. Rufen Sie dumpsys
über die Befehlszeile mithilfe der Android Debug Bridge (ADB) auf, um eine Diagnoseausgabe für alle Systemdienste zu erhalten, die auf einem verbundenen Gerät ausgeführt werden.
Diese Ausgabe ist in der Regel ausführlicher als gewünscht. Verwenden Sie daher die Befehlszeilenoptionen auf dieser Seite, um nur die Ausgabe für die gewünschten Systemdienste zu erhalten. Auf dieser Seite wird auch beschrieben, wie Sie mit dumpsys
gängige Aufgaben wie die Prüfung der Eingabe, des RAM, des Akkus oder der Netzwerkdiagnose ausführen.
Syntax
Die allgemeine Syntax für die Verwendung von dumpsys
lautet:
adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]
Wenn Sie eine Diagnoseausgabe für alle Systemdienste für das verbundene Gerät erhalten möchten, führen Sie adb shell dumpsys
aus.
Dadurch erhalten Sie jedoch weitaus mehr Informationen, als Sie normalerweise wünschen. Die Ausgabe ist überschaubarer, wenn Sie den Dienst, den Sie prüfen möchten, in den Befehl aufnehmen. Mit dem folgenden Befehl werden beispielsweise Systemdaten für Eingabekomponenten wie Touchscreens oder integrierte Tastaturen bereitgestellt:
adb shell dumpsys input
Mit dem folgenden Befehl erhalten Sie eine vollständige Liste der Systemdienste, die Sie mit dumpsys
verwenden können:
adb shell dumpsys -l
Befehlszeilenoptionen
In der folgenden Tabelle sind die verfügbaren Optionen bei Verwendung von dumpsys
aufgeführt:
Option | Beschreibung |
---|---|
-t timeout
|
Geben Sie das Zeitlimit in Sekunden an. Wenn keine Angabe erfolgt, beträgt der Standardwert 10 Sekunden. |
--help
|
Drucken Sie den Hilfetext für das dumpsys -Tool aus.
|
-l
|
Geben Sie eine vollständige Liste der Systemdienste aus, die Sie mit dumpsys verwenden können.
|
--skip services
|
Geben Sie den services an, der nicht in der Ausgabe enthalten sein soll. |
service [arguments]
|
Geben Sie den service an, den Sie ausgeben möchten. Bei einigen Diensten können Sie optional arguments übergeben. Übergeben Sie die Option -h mit dem Dienst, um mehr über diese optionalen Argumente zu erfahren: adb shell dumpsys procstats -h |
-c
|
Wenn Sie bestimmte Dienste angeben, fügen Sie diese Option hinzu, um Daten in einem maschinenfreundlichen Format auszugeben. |
-h
|
Bei bestimmten Diensten können Sie diese Option anhängen, um den Hilfetext und zusätzliche Optionen für den jeweiligen Dienst zu sehen. |
Eingabediagnose prüfen
Wenn Sie den Dienst input
angeben, wie im folgenden Befehl gezeigt, werden der Status der Eingabegeräte des Systems, z. B. Tastaturen und Touchscreens, sowie die Verarbeitung von Eingabeereignissen ausgegeben.
adb shell dumpsys input
Die Ausgabe variiert je nach der Android-Version, die auf dem verbundenen Gerät ausgeführt wird. In den folgenden Abschnitten wird beschrieben, welche Art von Informationen Sie normalerweise sehen.
Event-Hub-Status
Im Folgenden finden Sie ein Beispiel dafür, was Sie möglicherweise sehen, wenn Sie den Event Hub-Status der Eingabediagnose überprüfen:
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 ...
Lesestatus eingeben
InputReader
ist für das Decodieren von Eingabeereignissen aus dem Kernel verantwortlich. Der Statusdump enthält Informationen zur Konfiguration der einzelnen Eingabegeräte und zu kürzlich erfolgten Statusänderungen wie Tastatureingaben oder Berührungen auf dem Touchscreen.
Das folgende Beispiel zeigt die Ausgabe für einen Touchscreen. Notieren Sie sich die Informationen zur Auflösung des Geräts und zu den verwendeten Kalibrierungsparametern.
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
Am Ende des Status-Dumps des Eingabe-Readers finden Sie einige Informationen zu globalen Konfigurationsparametern, z. B. das Tap-Intervall:
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
Disponentenstatus eingeben
InputDispatcher
ist für das Senden von Eingabeereignissen an Anwendungen verantwortlich.
Wie in der folgenden Beispielausgabe gezeigt, enthält der Status-Dump Informationen darüber, welches Fenster berührt wird, den Status der Eingabewarteschlange, einen aktiven ANR-Fehler sowie andere Eingabeereignisinformationen:
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
Zu prüfende Punkte
Im Folgenden finden Sie eine Liste von Dingen, die bei der Prüfung der Ausgabe für den Dienst input
zu beachten sind:
Status des Ereignis-Hubs:
- Alle erwarteten Eingabegeräte sind vorhanden.
- Jedes Eingabegerät hat eine entsprechende Schlüssellayoutdatei, eine Schlüsselzeichenzuordnungsdatei und eine Eingabegerätekonfigurationsdatei. Wenn die Dateien fehlen oder Syntaxfehler enthalten, werden sie nicht geladen.
- Jedes Eingabegerät wird richtig klassifiziert. Die Bits im Feld
Classes
entsprechen Flags inEventHub.h
, z. B.INPUT_DEVICE_CLASS_TOUCH_MT
. -
BuiltInKeyboardId
ist richtig. Wenn das Gerät keine integrierte Tastatur hat, muss die ID-2
sein. Andernfalls sollte es sich um die ID der integrierten Tastatur handeln. - Wenn das
BuiltInKeyboardId
nicht-2
ist, aber es sein sollte, fehlt eine Schlüsselzeichenzuordnungsdatei für eine spezielle Funktionstastatur. Geräte mit Sonderfunktionstastaturen sollten Dateien für Tastenbelegungen haben, die nur die Zeiletype SPECIAL_FUNCTION
enthalten.
Lesestatus der Eingabe:
- Alle erwarteten Eingabegeräte sind vorhanden.
- Jedes Eingabegerät ist richtig konfiguriert. Prüfen Sie insbesondere, ob die Achsen des Touchscreens und des Joysticks korrekt sind.
Eingangsstatus des Disponenten:
- Alle Eingabeereignisse werden wie erwartet verarbeitet.
- Nachdem Sie den Touchscreen berührt und gleichzeitig
dumpsys
ausgeführt haben, identifiziert die LinieTouchStates
das Fenster, das Sie berühren.
UI-Leistung testen
Wenn Sie den Dienst gfxinfo
angeben, erhalten Sie eine Ausgabe mit Leistungsinformationen zu den Frames einer Animation, die während der Aufzeichnungsphase stattfinden.
Der folgende Befehl verwendet gfxinfo
, um UI-Leistungsdaten für einen angegebenen Paketnamen zu erfassen:
adb shell dumpsys gfxinfo package-name
Sie können auch die Option framestats
einbinden, um noch detailliertere Frame-Zeitinformationen aus den letzten Frames bereitzustellen, sodass Sie Probleme genauer aufspüren und beheben können:
adb shell dumpsys gfxinfo package-name framestats
Weitere Informationen zur Verwendung von gfxinfo
und framestats
zum Einbinden von UI-Leistungsmessungen in Ihre Testpraktiken finden Sie unter Makro-Benchmark schreiben.
Netzwerkdiagnose prüfen
Wenn Sie den Dienst netstats
angeben, werden Statistiken zur Netzwerknutzung bereitgestellt, die seit dem Start des vorherigen Geräts erfasst wurden. Wenn Sie zusätzliche Informationen wie detaillierte Informationen zur eindeutigen Nutzer-ID (UID) ausgeben möchten, fügen Sie die Option detail
so ein:
adb shell dumpsys netstats detail
Die Ausgabe variiert je nach der Android-Version, die auf dem verbundenen Gerät ausgeführt wird. In den folgenden Abschnitten wird beschrieben, welche Art von Informationen Sie normalerweise sehen.
Aktive Schnittstellen und aktive UID-Schnittstellen
In der folgenden Beispielausgabe werden die aktiven Schnittstellen und aktiven UID-Schnittstellen des verbundenen Geräts aufgelistet. In den meisten Fällen sind die Informationen für aktive Schnittstellen und aktive UID-Schnittstellen identisch.
Active interfaces: iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}] Active UID interfaces: iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId="Guest"}]
„Dev“- und „Xt“-Statistiken
Im Folgenden sehen Sie eine Beispielausgabe für den Abschnitt „Entwicklerstatistik“:
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
UID-Statistiken
Im Folgenden finden Sie ein Beispiel für detaillierte Statistiken für jede 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
Führen Sie den folgenden Befehl aus, um die UID für Ihre App zu ermitteln: adb shell dumpsys
package your-package-name
. Suchen Sie dann die Zeile userId
.
Führen Sie beispielsweise den folgenden Befehl aus, um die Netzwerknutzung für die Anwendung „com.example.myapp“ zu ermitteln:
adb shell dumpsys package com.example.myapp | grep userId
Die Ausgabe sollte in etwa so aussehen:
userId=10007 gids=[3003, 1028, 1015]
Suchen Sie mithilfe des vorherigen Beispiel-Dumps nach Zeilen mit uid=10007
. Es gibt zwei solcher Linien: Die erste steht für eine Mobilfunkverbindung und die zweite für eine WLAN-Verbindung. Unter jeder Zeile sehen Sie die folgenden Informationen für jedes Zwei-Stunden-Fenster, die bucketDuration
in Millisekunden angibt:
-
set=DEFAULT
gibt die Nutzung des Netzwerks im Vordergrund an,set=BACKGROUND
die Hintergrundnutzung.set=ALL
impliziert beides. -
tag=0x0
gibt das mit dem Traffic verknüpfte Socket-Tag an. -
rxBytes
undrxPackets
stellen empfangene Byte und empfangene Pakete im entsprechenden Zeitintervall dar. -
txBytes
undtxPackets
stellen gesendete (übermittelte) Byte und gesendete Pakete im entsprechenden Zeitintervall dar.
Akkudiagnose prüfen
Wenn Sie den Dienst batterystats
angeben, werden statistische Daten zur Akkunutzung auf einem Gerät generiert, die nach eindeutiger Nutzer-ID (UID) geordnet sind. Informationen zum Testen Ihrer App mit dumpsys
auf Stromsparmodus und App-Standby finden Sie unter Mit Stromsparmodus und App-Standby testen.
Der Befehl für batterystats
lautet:
adb shell dumpsys batterystats options
Wenn Sie eine Liste weiterer für batterystats
verfügbarer Optionen sehen möchten, fügen Sie die Option -h
ein. Im folgenden Beispiel werden Statistiken zur Akkunutzung für ein bestimmtes App-Paket seit dem letzten Laden des Geräts ausgegeben:
adb shell dumpsys batterystats --charged package-name
Die Ausgabe enthält normalerweise Folgendes:
- Verlauf von akkubezogenen Ereignissen
- Globale Statistiken für das Gerät
- Ungefährer Stromverbrauch pro UID und Systemkomponente
- Mobile Millisekunden pro Paket pro App
- Zusammengefasste System-UID-Statistiken
- Zusammengefasste App-UID-Statistiken
Weitere Informationen zur Verwendung von batterystats
und zum Generieren einer HTML-Visualisierung der Ausgabe, mit der sich akkubezogene Probleme leichter verstehen und diagnostizieren lassen, finden Sie unter Profil der Akkunutzung mit Batterystats und Battery Historian erstellen.
Maschinenfreundliche Ausgabe prüfen
Mit dem folgenden Befehl können Sie eine batterystats
-Ausgabe im maschinenlesbaren CSV-Format generieren:
adb shell dumpsys batterystats --checkin
Hier ein Beispiel für die Ausgabe:
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 ...
Informationen zur Akkunutzung können pro UID oder Systemebene angegeben werden. Die Daten werden anhand ihres Nutzens bei der Analyse der Akkuleistung ausgewählt. Jede Zeile stellt eine Beobachtung mit folgenden Elementen dar:
- Eine Platzhalter-Ganzzahl
- Die User-ID, die der Beobachtung zugeordnet ist
- Der Aggregationsmodus:
i
für Informationen, die nicht mit dem Status „Belastet/nicht belastet“ verknüpft sind.l
für--charged
(Nutzung seit der letzten Abbuchung).u
für--unplugged
(Nutzung seit dem letzten Ausstecken). In Android 5.1.1 verworfen.
- Abschnittskennung, die festlegt, wie nachfolgende Werte in der Zeile interpretiert werden.
In der folgenden Tabelle werden die verschiedenen Bereichskennungen beschrieben, die Sie sehen können:
Bereichs-ID | Beschreibung | Verbleibende Felder |
---|---|---|
|
Version |
|
|
UID |
|
|
APK |
|
|
Prozess |
|
|
Sensor |
|
|
Vibrator |
|
|
Vordergrund |
|
|
Zustandszeit |
|
|
Wake lock |
|
|
Synchronisieren |
|
|
Job |
|
|
Kernel-Wakelock |
|
|
Aufwachgrund |
|
|
Netz |
|
|
Nutzeraktivität |
|
|
Akku |
|
|
Akkuentladung |
|
|
Akkustand |
|
|
WLAN |
|
|
WLAN weltweit |
|
|
Globale Bluetooth-Verbindung |
|
|
Verschiedenes |
|
|
Globales Netzwerk |
|
|
Bildschirmhelligkeit |
|
|
Signalsuchzeit |
|
|
Dauer der Signalstärke |
|
|
Anzahl der Signalstärke |
|
|
Zeit der Datenverbindung |
|
|
Anzahl der Datenverbindungen |
|
|
WLAN-Statuszeit |
|
|
Anzahl der WLAN-Status |
|
|
WLAN Supplicant State Time |
|
|
Anzahl der Status des WLAN-Hilfsmittels |
|
|
Dauer der WLAN-Signalstärke |
|
|
Anzahl der WLAN-Signalstärke |
|
|
Bluetooth-Statuszeit |
|
|
Anzahl Bluetooth-Status |
|
|
Zusammenfassung des Stromverbrauchs |
|
|
Artikel mit Stromverbrauch |
|
|
Entladeschritt |
|
|
Ladeschritt |
|
|
Verbleibende Entladezeit |
|
|
Verbleibende Ladezeit |
|
Hinweis: Vor Android 6.0 wurde der Stromverbrauch für Bluetooth, Mobilfunk und WLAN in der Abschnittskategorie m
(Sonstiges) erfasst. Ab Android 6.0 wird der Stromverbrauch dieser Komponenten im Abschnitt pwi
(Power Use Item) mit individuellen Labels (wifi
, blue
, cell
) für jede Komponente erfasst.
Arbeitsspeicherzuweisungen ansehen
Es gibt zwei Möglichkeiten, die Arbeitsspeichernutzung Ihrer App zu prüfen: über einen bestimmten Zeitraum mit procstats
oder zu einem bestimmten Zeitpunkt mit meminfo
.
In den folgenden Abschnitten erfahren Sie, wie Sie beide Methoden verwenden.
Procstats
Mit procstats
können Sie sehen, wie sich Ihre App im Laufe der Zeit verhält, z. B. wie lange sie im Hintergrund ausgeführt wird und wie viel Speicher während dieses Zeitraums verwendet wird. So können Sie schnell Ineffizienzen und Fehlverhalten (z. B. Speicherlecks) in Ihrer Anwendung finden, die sich auf die Leistung auswirken können, insbesondere wenn sie auf Geräten mit wenig Arbeitsspeicher ausgeführt wird. Der State Dump zeigt Statistiken zur Laufzeit jeder Anwendung, proportionale Set-Größe (PSS), Unique Set-Größe (USS) und residente Satzgröße (RSS) an.
Führen Sie den folgenden Befehl aus, um Statistiken zur Arbeitsspeichernutzung der letzten drei Stunden in einem für Menschen lesbaren Format abzurufen:
adb shell dumpsys procstats --hours 3
Wie im folgenden Beispiel gezeigt, wird in der Ausgabe angezeigt, wie viel Prozent der Zeit die Anwendung ausgeführt wurde und PSS, USS und RSS als minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS
über die Anzahl der Stichproben.
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
Mit dem folgenden Befehl können Sie einen Snapshot der Aufteilung des Arbeitsspeichers Ihrer Anwendung auf die verschiedenen Arten von RAM-Zuweisungen aufzeichnen:
adb shell dumpsys meminfo package_name|pid [-d]
Das Flag -d
gibt weitere Informationen zur Dalvik- und ART-Speichernutzung aus.
Die Ausgabe listet alle aktuellen Zuweisungen der Anwendung in Kilobyte auf.
Bei der Analyse dieser Informationen sollten Sie mit den folgenden Zuweisungsarten vertraut sein:
- Privater (sauberer und beschädigter) RAM
- Dies ist Arbeitsspeicher, der nur von Ihrem Prozess verwendet wird. Dies ist der Großteil des RAM, den das System freigeben kann, wenn der Prozess Ihrer App gelöscht wird. Im Allgemeinen ist der wichtigste Teil davon der private, schmutzige RAM. Dieser ist am teuersten, da er nur von Ihrem Prozess verwendet wird und weil sein Inhalt nur im RAM vorhanden ist und daher nicht auf den Speicher übertragen werden kann, da Android die Auslagerung nicht verwendet. Alle von Ihnen vorgenommenen Dalvik- und nativen Heap-Zuweisungen sind privates, schmutziges RAM. Dalvik- und native Zuweisungen, die Sie mit dem Zygote-Prozess teilen, sind gemeinsam genutzter schmutziger RAM.
- Proportionale Setgröße (PSS)
- Dies ist ein Maß für die RAM-Nutzung Ihrer App, bei dem die Seitenfreigabe zwischen Prozessen berücksichtigt wird. Alle RAM-Seiten, die nur für Ihren Prozess bestimmt sind, tragen direkt zum PSS-Wert bei. Seiten, die mit anderen Prozessen gemeinsam genutzt werden, tragen hingegen nur proportional zum Anteil der gemeinsamen Nutzung zum PSS-Wert bei. Beispielsweise trägt eine Seite, die von zwei Prozessen gemeinsam genutzt wird, zur Hälfte ihrer Größe zum PST des jeweiligen Prozesses bei.
Ein Merkmal der PSS-Messung besteht darin, dass Sie den PSS prozessübergreifend addieren können, um den tatsächlich von allen Prozessen verwendeten Arbeitsspeicher zu ermitteln. PSS ist also ein gutes Maß für die tatsächliche RAM-Gewichtung eines Prozesses und kann mit der RAM-Nutzung anderer Prozesse und dem insgesamt verfügbaren RAM verglichen werden.
Im Folgenden sehen Sie beispielsweise die Ausgabe für den Prozess von Maps auf einem Nexus 5-Gerät:
adb shell dumpsys meminfo com.google.android.apps.maps -d
Hinweis:Die angezeigten Informationen können leicht von den hier gezeigten abweichen, da einige Details der Ausgabe je nach Plattformversion unterschiedlich sind.
** 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
Hier ist eine ältere dumpsys
auf Dalvik aus der Gmail App:
** 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
Beziehen Sie sich in der Regel nur auf die Spalten Pss Total
und Private Dirty
.
In einigen Fällen enthalten auch die Spalten Private Clean
und Heap Alloc
interessante Daten.
Im Folgenden finden Sie weitere Informationen zu den verschiedenen Arbeitsspeicherzuweisungen, die Sie beachten sollten:
Dalvik Heap
- Der von Dalvik-Zuweisungen in Ihrer Anwendung verwendete RAM.
Pss Total
umfasst alle Zygote-Zuweisungen, gewichtet nach ihrer gemeinsamen Nutzung zwischen Prozessen, wie in der PSS-Definition beschrieben. DiePrivate Dirty
-Nummer ist der tatsächliche RAM, der nur dem Heap Ihrer Anwendung zugewiesen wurde. Er setzt sich aus Ihren eigenen Zuweisungen und allen Zygote-Zuweisungsseiten zusammen, die seit der Abspaltung des Prozesses Ihrer Anwendung von Zygote geändert wurden.Hinweis: Bei neueren Plattformversionen mit dem Abschnitt
Dalvik Other
enthalten die ZahlenPss Total
undPrivate Dirty
für Dalvik Heap den Dalvik-Overhead wie die Just-in-Time-Kompilierung (JIT) und die GC-Buchhaltung nicht. Bei älteren Versionen werden alle Werte unterDalvik
zusammengefasst.Der
Heap Alloc
ist die Arbeitsspeichermenge, die die Dalvik- und nativen Heap-Allocators für Ihre Anwendung verfolgen. Dieser Wert ist größer alsPss Total
undPrivate Dirty
, da Ihr Prozess von Zygote abgespalten wurde und Zuweisungen enthält, die Ihr Prozess mit allen anderen teilt. .so mmap
und.dex mmap
- Der RAM, der für den zugeordneten
.so
-Code (nativ) und.dex
-Code (Dalvik oder ART) verwendet wird. DiePss Total
-Nummer enthält Plattformcode, der zwischen Apps geteilt wird.Private Clean
ist der eigene Code Ihrer App. In der Regel ist die tatsächlich abgebildete Größe größer. Der RAM ist hier nur das, was derzeit im RAM für Code ist, der von der Anwendung ausgeführt wurde..so mmap
hat jedoch ein großes privates Schmutz, was auf Korrekturen am nativen Code beim Laden in seine endgültige Adresse zurückzuführen ist. .oat mmap
- Dies ist der vom Code-Image verwendete RAM-Speicherplatz. Sie basiert auf vorinstallierten Klassen, die häufig von mehreren Anwendungen verwendet werden. Dieses Bild wird in allen Apps geteilt und ist von bestimmten Apps nicht betroffen.
.art mmap
- Dies ist der Arbeitsspeicher, der vom Heap-Image verwendet wird. Sie basiert auf vorinstallierten Klassen, die häufig von mehreren Anwendungen verwendet werden. Dieses Image wird von allen Anwendungen gemeinsam genutzt und ist von bestimmten Anwendungen nicht betroffen. Auch wenn das ART-Image
Object
-Instanzen enthält, wird es nicht auf die Heap-Größe angerechnet. .Heap
(nur mit dem Flag-d
)- Dies ist die Menge an Heap-Arbeitsspeicher für Ihre Anwendung. Objekte im Bild und große Objektbereiche werden dabei nicht berücksichtigt, aber der Zygote-Bereich und der nicht bewegliche Bereich sind inbegriffen.
.LOS
(nur mit dem Flag-d
)- Dies ist der Arbeitsspeicher, der vom großen ART-Objektbereich belegt wird. Dies gilt auch für große Zygote-Objekte. Große Objekte sind alles einfache Arrayzuweisungen, die größer als 12 KB sind.
.GC
(nur mit dem Flag-d
)- Dies sind die Gemeinkosten für die automatische Speicherbereinigung. Es gibt keine Möglichkeit, diesen Aufwand zu reduzieren.
.JITCache
(nur mit dem Flag-d
)- Dies ist die Speichermenge, die von den JIT-Daten und Code-Caches verwendet wird. In der Regel ist dies null, da alle Anwendungen bei der Installation kompiliert werden.
.Zygote
(nur mit dem Flag-d
)- Dies ist der Arbeitsspeicher, der vom Zygote-Bereich belegt wird. Der Zygote-Bereich wird beim Gerätestart erstellt und nie zugewiesen.
.NonMoving
(nur mit dem Flag-d
)- Dieser Wert gibt an, wie viel RAM vom nicht beweglichen ART-Bereich belegt wird. Der nicht bewegliche Bereich enthält spezielle nicht verschiebbare Objekte wie Felder und Methoden. Sie können diesen Abschnitt reduzieren, indem Sie weniger Felder und Methoden in Ihrer Anwendung verwenden.
.IndirectRef
(nur mit dem Flag-d
)- Dies ist der RAM, der von den indirekten ART-Referenztabellen verwendet wird. Normalerweise ist dieser Betrag gering, aber wenn er zu hoch ist, können Sie ihn möglicherweise reduzieren, indem Sie die Anzahl der verwendeten lokalen und globalen JNI-Referenzen reduzieren.
Unknown
- Alle RAM-Seiten, die das System nicht unter einem der anderen spezifischeren Elemente klassifizieren konnte. Derzeit enthält es hauptsächlich native Zuweisungen, die vom Tool beim Erfassen dieser Daten aufgrund von Address Space Layout Randomization (ASLR) nicht erkannt werden können. Wie beim Dalvik-Heap berücksichtigt der
Pss Total
fürUnknown
die Freigabe für Zygote undPrivate Dirty
ist ein unbekannter RAM, der nur für Ihre Anwendung vorgesehen ist. TOTAL
- Der gesamte von Ihrem Prozess verwendete Proportional Set Größe (PSS). Dies ist die Summe aller PSS-Felder darüber. Sie zeigt die Gesamtspeicherauslastung Ihres Prozesses an, die direkt mit anderen Prozessen und dem insgesamt verfügbaren RAM verglichen werden kann.
Private Dirty
undPrivate Clean
sind die gesamten Zuweisungen innerhalb Ihres Prozesses und werden nicht mit anderen Prozessen geteilt. Wenn Ihr Prozess gelöscht wird, wird der gesamte RAM aus diesen Zuweisungen wieder für das System freigegeben.Private Clean
kann auch ausgelagert und freigegeben werden, bevor der Prozess gelöscht wird.Private Dirty
wird jedoch erst beim Löschen des Prozesses freigegeben.Schmutziger RAM umfasst Seiten, die geändert wurden und dem RAM zugewiesen bleiben müssen, da es keinen Auslagerungswechsel gibt. Sauberer RAM ist Seiten, die von einer persistenten Datei (z. B. ausgeführter Code) zugeordnet wurden und die ausgelagert werden können, wenn sie eine Zeit lang nicht verwendet werden.
ViewRootImpl
- Die Anzahl der Stammansichten, die in Ihrem Prozess aktiv sind. Jede Stammansicht ist einem Fenster zugeordnet. So können Sie Speicherlecks in Dialogfeldern oder anderen Fenstern leichter identifizieren.
AppContexts
undActivities
- Die Anzahl der
Context
- undActivity
-Objekte der Anwendung, die derzeit in Ihrem Prozess vorhanden sind. So können Sie schnell gehackteActivity
-Objekte ermitteln, die aufgrund statischer Referenzen nicht automatisch bereinigt werden können. Das ist üblich. Diesen Objekten sind oft viele andere Zuweisungen zugeordnet, sodass sie eine gute Möglichkeit darstellen, große Speicherlecks zu verfolgen.