dumpsys

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:

Tabelle 1 Die Liste der verfügbaren Optionen für „dumpsys“

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 in EventHub.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 Zeile type 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 Linie TouchStates 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 und rxPackets stellen empfangene Byte und empfangene Pakete im entsprechenden Zeitintervall dar.
  • txBytes und txPackets 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:

Tabelle 2 Liste der Abschnittskennungen

Bereichs-ID Beschreibung Verbleibende Felder

vers

Version

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

uid

UID

uid, package name

apk

APK

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

pr

Prozess

process, user, system, foreground, starts

sr

Sensor

sensor number, time und count

vib

Vibrator

time, count

fg

Vordergrund

time, count

st

Zustandszeit

foreground, active und running

wl

Wake lock

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

sy

Synchronisieren

sync, time und count

jb

Job

job, time und count

kwl

Kernel-Wakelock

kernel wake lock, time und count

wr

Aufwachgrund

wakeup reason, time und count

nt

Netz

mobile bytes RX, mobile bytes TX, Wi-Fi bytes RX, Wi-Fi bytes TX, mobile packets RX, mobile packets TX, Wi-Fi packets RX, Wi-Fi packets TX, mobile active time, mobile active count

ua

Nutzeraktivität

other, button und touch

bt

Akku

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

dc

Akkuentladung

low, high, screen on, screen off

lv

Akkustand

start level, current level

wfl

WLAN

full Wi-Fi lock on time, Wi-Fi scan time, Wi-Fi running time, Wi-Fi scan count, Wi-Fi idle time, Wi-Fi receive time, Wi-Fi transmit time

gwfl

WLAN weltweit

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

gble

Globale Bluetooth-Verbindung

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

m

Verschiedenes

screen on time, phone on time, full wakelock time total, partial wakelock time total, mobile radio active time, mobile radio active adjusted time, interactive time, power save mode enabled time, connectivity changes, device idle mode enabled time, device idle mode enabled count, device idling time, device idling count, mobile radio active count, mobile radio active unknown time

gn

Globales Netzwerk

mobile RX total bytes, mobile TX total bytes, Wi-Fi RX total bytes, Wi-Fi TX total bytes, mobile RX total packets, mobile TX total packets, Wi-Fi RX total packets, Wi-Fi TX total packets

br

Bildschirmhelligkeit

dark, dim, medium, light, bright

sst

Signalsuchzeit

signal scanning time

sgt

Dauer der Signalstärke

none, poor, moderate, good, great

sgc

Anzahl der Signalstärke

none, poor, moderate, good, great

dct

Zeit der Datenverbindung

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

dcc

Anzahl der Datenverbindungen

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

wst

WLAN-Statuszeit

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

wsc

Anzahl der WLAN-Status

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

wsst/p>

WLAN Supplicant State Time

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

wssc

Anzahl der Status des WLAN-Hilfsmittels

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

wsgt

Dauer der WLAN-Signalstärke

none, poor, moderate, good, great

wsgc

Anzahl der WLAN-Signalstärke

none, poor, moderate, good, great

bst

Bluetooth-Statuszeit

inactive, low, med, high

bsc

Anzahl Bluetooth-Status

inactive, low, med, high

pws

Zusammenfassung des Stromverbrauchs

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

pwi

Artikel mit Stromverbrauch

label, mAh

dsd

Entladeschritt

duration, level, screen, power-save

csd

Ladeschritt

duration, level, screen, power-save

dtr

Verbleibende Entladezeit

battery time remaining

ctr

Verbleibende Ladezeit

charge time remaining

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. Die Private 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 Zahlen Pss Total und Private 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 unter Dalvik zusammengefasst.

Der Heap Alloc ist die Arbeitsspeichermenge, die die Dalvik- und nativen Heap-Allocators für Ihre Anwendung verfolgen. Dieser Wert ist größer als Pss Total und Private 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. Die Pss 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ür Unknown die Freigabe für Zygote und Private 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 und Private 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 und Activities
Die Anzahl der Context- und Activity-Objekte der Anwendung, die derzeit in Ihrem Prozess vorhanden sind. So können Sie schnell gehackte Activity-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.