dumpsys

dumpsys は、Android デバイス上で動作し、システム サービスに関する情報を提供するツールです。Android Debug Bridge(ADB)を使用してコマンドラインから dumpsys を呼び出すと、接続されたデバイスで実行されるすべてのシステム サービスの診断情報を出力できます。

通常、この出力は必要以上に詳細であるため、このページにあるコマンドライン オプションを使用して、必要なシステム サービスの情報のみを出力してください。このページでは、dumpsys を使用して一般的な作業(入力、RAM、電池、ネットワークの診断情報の調査など)を行う方法についても説明します。

構文

dumpsys を使用する一般的な構文は次のとおりです。

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

接続されたデバイスのすべてのシステム サービスに関する診断情報を出力するには、adb shell dumpsys を実行します。ただし、このコマンドでは、通常必要とするよりもはるかに多くの情報が出力されます。もっと管理しやすい出力を生成するには、調べたいサービスをコマンド内で指定します。たとえば、下記のコマンドを使用すると、タッチスクリーンや組み込みキーボードなどの入力コンポーネントのシステムデータを取得できます。

adb shell dumpsys input

dumpsys で使用できるシステム サービスの一覧を表示するには、次のコマンドを使用します。

adb shell dumpsys -l

コマンドライン オプション

dumpsys で使用できるオプションの一覧を次の表に示します。

表 1. dumpsys で使用できるオプションのリスト

オプション 説明
-t timeout タイムアウト時間を秒単位で指定します。指定しなかった場合のデフォルト値は 10 秒です。
--help dumpsys ツールのヘルプテキストを出力します。
-l dumpsys で使用できるシステム サービスの一覧を出力します。
--skip services 出力から除外したい services を指定します。
service [arguments] 出力したい service を指定します。サービスによっては、オプションの arguments を渡すことができます。オプションの引数に関する情報を表示するには、サービスとともに -h オプションを渡します。
adb shell dumpsys procstats -h
    
-c 特定のサービスについて指定する際、このオプションを追加すると、機械が読み取れる形式でデータが出力されます。
-h 特定のサービスについて指定する際、このオプションを追加すると、そのサービスについて、ヘルプテキストと追加のオプションが表示されます。

入力の診断情報を調べる

次のコマンドのように input サービスを指定すると、キーボードやタッチスクリーンなどのシステムの入力デバイスの状態と、入力イベントの処理がダンプされます。

adb shell dumpsys input

出力は、接続されたデバイス上で動作する Android のバージョンによって異なります。以降のセクションでは、一般的に表示される情報のタイプについて説明します。

イベントハブの状態

入力の診断情報のうち、イベントハブの状態を表すサンプル出力を次に示します。

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

入力リーダーの状態

InputReader は、カーネルからの入力イベントのデコードを行います。その状態をダンプすると、各入力デバイスがどのように設定されているか、および最近発生した状態の変化(キーの押下、タッチスクリーン上のタップなど)についての情報が表示されます。

次のサンプルは、タッチスクリーンについての出力例を示しています。デバイスの解像度と使用された調整パラメータについての情報が表示されていることがわかります。

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

入力リーダーの状態ダンプの末尾には、タップ間隔などのグローバル設定パラメータについての情報が表示されます。

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

入力ディスパッチャの状態

InputDispatcher は、アプリに入力イベントを送信する役割を担います。次のサンプル出力のように、状態ダンプには、タップされているウィンドウ、入力キューの状態、ANR が発生中かどうかなどの入力イベントに関する情報が表示されます。

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

確認事項

input サービスの出力を調べるときに確認すべき項目のリストを次に示します。

イベントハブの状態:

  • 想定している入力デバイスがすべて存在すること。
  • 各入力デバイスに対して、適切なキーレイアウト ファイル、キー文字マップファイル、入力デバイス設定ファイルがあること。ファイルが欠けているか構文エラーが含まれている場合、そのファイルは読み込まれません。
  • 各入力デバイスが正しく分類されていること。Classes フィールドの各ビットは、EventHub.h 内のフラグ(INPUT_DEVICE_CLASS_TOUCH_MT など)に対応します。
  • BuiltInKeyboardId が正しいこと。デバイスに組み込みキーボードがない場合、この ID は -2 でなければなりません。組み込みキーボードがある場合は、組み込みキーボードの ID でなければなりません。
    • BuiltInKeyboardId-2 であるべきなのにそうでない場合は、いずれかの専用ファンクション キーパッドのキー文字マップファイルが欠けています。専用ファンクション キーパッド デバイスには、type SPECIAL_FUNCTION という行のみを含むキー文字マップファイルが必要です。

入力リーダーの状態:

  • 想定している入力デバイスがすべて存在すること。
  • 各入力デバイスが正しく設定されていること。特に、タッチスクリーンとジョイスティックの軸が正しいことを確認します。

入力ディスパッチャの状態:

  • すべての入力イベントが想定どおり処理されること。
  • dumpsys を実行しながら、タッチスクリーンにタップした後、タップしたウィンドウが TouchStates 行によって正しく識別されていること。

UI パフォーマンスをテストする

gfxinfo サービスを指定すると、記録フェーズ中に発生するアニメーションのフレームに関するパフォーマンス情報が出力されます。次のコマンドは、gfxinfo を使用して、指定したパッケージ名に対応する UI パフォーマンス データを収集します。

adb shell dumpsys gfxinfo package-name

また、framestats オプションを含めると、最近のフレームからさらに詳細なフレーム時間情報が得られるため、問題をより正確に追跡してデバッグできます。

adb shell dumpsys gfxinfo package-name framestats

gfxinfoframestats を使用して UI のパフォーマンス測定値をテストに統合する方法については、Macrobenchmark を作成するをご覧ください。

ネットワークの診断情報を調べる

netstats サービスを指定すると、前回のデバイス起動後に収集されたネットワーク使用統計情報が出力されます。一意のユーザー ID(UID)の詳細などの追加情報を出力するには、次のように detail オプションを指定します。

adb shell dumpsys netstats detail

出力は、接続されたデバイス上で動作する Android のバージョンによって異なります。以降のセクションでは、一般的に表示される情報のタイプについて説明します。

アクティブなインターフェースとアクティブな UID インターフェース

次の出力サンプルには、接続されているデバイスのアクティブなインターフェースとアクティブな UID インターフェースのリストが表示されています。ほとんどの場合、アクティブなインターフェースとアクティブな UID インターフェースの情報は同じです。

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

Dev と Xt の統計情報

Dev 統計情報のセクションのサンプル出力を次に示します。

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 の統計情報

各 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

アプリの UID を見つけるには、コマンド adb shell dumpsys package your-package-name を実行します。次に、userId というラベルの行を探します。

たとえば、アプリ com.example.myapp のネットワーク使用状況を確認するには、次のコマンドを実行します。

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

出力は次のようになります。

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

上記のサンプルダンプで、uid=10007 を含む行を探します。該当する行が 2 つあります。最初の行はモバイル接続を示し、2 番目の行は Wi-Fi 接続を示しています。各行の下に、次のような 2 時間分の情報を見つけることができます(時間は bucketDuration にミリ秒単位で示されています)。

  • set=DEFAULT はフォアグラウンドのネットワーク使用状況を示し、set=BACKGROUND はバックグラウンドのネットワーク使用状況を示します。set=ALL はその両方を示します。
  • tag=0x0 は、トラフィックに関連付けられたソケットタグを示します。
  • rxBytesrxPackets は、対応する期間での受信バイト数と受信パケット数を表します。
  • txBytestxPackets は、対応する期間での送信バイト数と送信パケット数を表します。

電池の診断情報を調べる

batterystats サービスを指定すると、一意のユーザー ID(UID)ごとに分類された、デバイスの電池使用量に関する統計データが生成されます。dumpsys を使用してアプリの Doze とアプリ スタンバイをテストする方法については、Doze モードとアプリ スタンバイ モードでテストするをご覧ください。

batterystats 用のコマンドを次に示します。

adb shell dumpsys batterystats options

batterystats で使用できる追加オプションのリストを表示するには、-h オプションを指定します。次の例では、デバイスが最後に充電された後の、指定されたアプリ パッケージの電池使用量の統計情報が出力されます。

adb shell dumpsys batterystats --charged package-name

通常、出力には以下の項目が含まれます。

  • 電池関連のイベント履歴
  • デバイスの全体的な統計情報
  • UID とシステム コンポーネント別の推定消費電力
  • モバイル デバイスでのアプリ別のパケットあたりの時間(ミリ秒)
  • システム UID 別に集計された統計情報
  • アプリ UID 別に集計された統計情報

batterystats の使用方法と、電池関連の問題を把握および診断しやすくするために HTML 表示形式で出力を生成する方法について詳しくは、Batterystats と Battery Historian を使用して電池使用量をプロファイリングするをご覧ください。

機械が読み取れる出力を調べる

機械が読み取れる CSV 形式で batterystats 出力を生成するには、次のコマンドを使用します。

adb shell dumpsys batterystats --checkin

出力の例を次に示します。

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

UID 単位またはシステムレベルで電池使用量を監視できます。電池のパフォーマンスを分析する際の有用性に基づいて、監視対象データが選択されます。各行は 1 つの監視記録を表し、以下の要素を含みます。

  • プレースホルダの整数
  • その記録に関連付けられたユーザー ID
  • 集計モード:
    • i は、充電されている / 充電されていないステータスに関連しない情報を表します。
    • l は、--charged(前回の充電以降の使用状況)を表します。
    • u は、--unplugged(前回の電源オフ以降の使用状況)を表します。これは Android 5.1.1 で非推奨になりました。
  • セクション識別子は、その行の後続の値をどう解釈するかを表します。

出力に表示される各セクション識別子の説明を次の表に示します。

表 2. セクション識別子のリスト

セクション識別子 説明 後続のフィールド

vers

バージョン

checkin versionparcel versionstart platform versionend platform version

uid

UID

uidpackage name

apk

APK

wakeupsAPKservicestart timestartslaunches

pr

プロセス

processusersystemforegroundstarts

sr

センサー

sensor numbertimecount

vib

バイブレーション

timecount

fg

フォアグラウンド

timecount

st

状態時間

foregroundactiverunning

wl

wake lock

wake lockfull timeffull countpartial timeppartial countwindow timewwindow count

sy

同期

synctimecount

jb

ジョブ

jobtimecount

kwl

カーネルの wake lock

kernel wake locktimecount

wr

wakeup の理由

wakeup reasontimecount

nt

ネットワーク

mobile bytes RXmobile bytes TXWi-Fi bytes RXWi-Fi bytes TXmobile packets RXmobile packets TXWi-Fi packets RXWi-Fi packets TXmobile active timemobile active count

ua

ユーザーのアクティビティ

otherbuttontouch

bt

バッテリー

start countbattery realtimebattery uptimetotal realtimetotal uptimestart clock timebattery screen off realtimebattery screen off uptime

dc

電池放電

lowhighscreen onscreen off

lv

電池残量

start levelcurrent level

wfl

Wi-Fi

full Wi-Fi lock on timeWi-Fi scan timeWi-Fi running timeWi-Fi scan countWi-Fi idle timeWi-Fi receive timeWi-Fi transmit time

gwfl

グローバル Wi-Fi

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

gble

グローバル Bluetooth

BT idle timeBT receive timeBT transmit timeBT power (mAh)

m

その他

screen on timephone on timefull wakelock time totalpartial wakelock time totalmobile radio active timemobile radio active adjusted timeinteractive timepower save mode enabled timeconnectivity changesdevice idle mode enabled timedevice idle mode enabled countdevice idling timedevice idling countmobile radio active countmobile radio active unknown time

gn

グローバル ネットワーク

mobile RX total bytesmobile TX total bytesWi-Fi RX total bytesWi-Fi TX total bytesmobile RX total packetsmobile TX total packetsWi-Fi RX total packetsWi-Fi TX total packets

br

画面の明るさ

darkdimmediumlightbright

sst

電波スキャン時間

signal scanning time

sgt

電波強度時間

nonepoormoderategoodgreat

sgc

電波強度カウント

nonepoormoderategoodgreat

dct

データ接続時間

noneGPRSEDGEUMTSCDMAEVDO_0EVDO_A1xRTTHSDPAHSUPAHSPAIDENEVDO_BLTEEHRPDHSPAP, other

dcc

データ接続数

noneGPRSEDGEUMTSCDMAEVDO_0EVDO_A1xRTTHSDPAHSUPAHSPAIDENEVDO_BLTEEHRPDHSPAPother

wst

Wi-Fi 状態時間

offoff scanningon no networkson disconnectedon connected STAon connected P2Pon connected STA P2Psoft AP

wsc

Wi-Fi 状態カウント

offoff scanningon no networkson disconnectedon connected STAon connected P2Pon connected STA P2Psoft AP

wsst

Wi-Fi サプリカント状態時間

invaliddisconnectedinterface disabledinactivescanningauthenticatingassociatingassociatedfour-way handshakegroup handshakecompleteddormantuninitialized

wssc

Wi-Fi サプリカント状態カウント

invaliddisconnectedinterface disabledinactivescanningauthenticatingassociatingassociatedfour-way handshakegroup handshakecompleteddormantuninitialized

wsgt

Wi-Fi 電波強度時間

nonepoormoderategoodgreat

wsgc

Wi-Fi 電波強度カウント

nonepoormoderategoodgreat

bst

Bluetooth 状態時間

inactivelowmedhigh

bsc

Bluetooth 状態カウント

inactivelowmedhigh

pws

消費電力概要

battery capacitycomputed powerminimum drained powermaximum drained power

pwi

消費電力項目

labelmAh

dsd

放電ステップ

durationlevelscreenpower-save

csd

充電ステップ

durationlevelscreenpower-save

dtr

放電の残り時間

battery time remaining

ctr

充電の残り時間

charge time remaining

: Android 6.0 より前では、Bluetooth 無線、セル無線通信、Wi-Fi の消費電力は、m(その他)セクション カテゴリでトラッキングされていました。Android 6.0 以降では、これらのコンポーネントの消費電力は pwi(消費電力項目)セクションでトラッキングされ、コンポーネントごとに個別のラベル(wifibluecell)が付けられます。

メモリ割り当てを表示する

アプリのメモリ使用量を調べる方法には、一定期間にわたって procstats を使用する方法と、特定の時点で meminfo を使用する方法の 2 つがあります。以降のセクションでは、両方の方法について説明します。

procstats

procstats を使用すると、一定期間にアプリがどのように動作するかを調べられます。たとえば、アプリがバックグラウンドで実行される期間と、その期間中のメモリ使用量を確認できます。これにより、アプリの非効率な動作や不正な動作を早期に見つけられます。たとえば、特にメモリの少ないデバイスで実行されているときに、アプリのパフォーマンスに影響するメモリリークを発見できます。状態ダンプには、アプリの毎回の実行時間、Proportional Set Size(PSS)、Unique Set Size(USS)、Resident Set Size(RSS)に関する統計情報が表示されます。

アプリの過去 3 時間にわたるメモリ使用量の統計情報を人間が読み取れる形式で表示するには、次のコマンドを実行します。

adb shell dumpsys procstats --hours 3

次の例に示すように、出力には、アプリの実行時間の割合とともに、サンプル数に対する PSS、USS、RSS が minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS として表示されます。

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

さまざまなタイプの RAM 割り当ての間でアプリのメモリがどのように分割されているかをスナップショットとして記録するには、次のコマンドを実行します。

adb shell dumpsys meminfo package_name|pid [-d]

-d フラグを指定すると、Dalvik および ART のメモリ使用量に関する詳細情報が出力されます。

出力には、キロバイト単位で測定されたアプリの現在の割り当ての一覧が表示されます。

この情報を調べるにあたっては、以下の割り当てタイプについて知っておく必要があります。

プライベート(クリーンおよびダーティ)RAM
これは、アプリのプロセスのみによって使用されるメモリです。アプリのプロセスが破棄されたときにシステムが回収できる、RAM のまとまった領域です。通常、この領域の最も重要な部分はプライベート ダーティ RAM です。これはアプリのプロセスのみによって使用され、その内容が RAM 内にのみ存在するので、ストレージにページングすることができません(Android はスワップを使用しないため)。したがって、最もメモリを消費します。アプリが行う Dalvik とネイティブ ヒープの割り当ては、すべてプライベート ダーティ RAM です。アプリが Zygote プロセスと共有する Dalvik とネイティブの割り当ては、共有されるダーティ RAM です。
Proportional Set Size(PSS)
これは、プロセス間のページの共有を考慮に入れた、アプリの RAM 使用量の測定値です。プロセスに固有の RAM ページは、すべて PSS 値にそのまま反映されます。一方、他のプロセスと共有されるページは、共有量に対する比率に応じて PSS 値に反映されます。たとえば、2 つのプロセス間で共有されるページは、それぞれ半分のサイズが各プロセスの PSS に反映されます。

PSS 測定値の特徴は、全プロセスで PSS を合計し、全プロセスによって実際に使用されるメモリ量を確認できることです。したがって、PSS は、あるプロセスの実際の RAM の重みを評価する場合や、他のプロセスの RAM の使用量および使用可能な RAM の合計量と比較する場合に適した尺度です。

たとえば、Nexus 5 デバイスにおけるマップのプロセスの出力は、次のようになります。

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

注: 出力の詳細の一部はプラットフォーム バージョンによって異なるため、実際に表示される情報は次に示すものとは若干異なる場合があります。

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

次に示すのは、Gmail アプリの Dalvik の以前の dumpsys です。

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

通常は、Pss Total 列と Private Dirty 列にのみ注意すれば十分です。ただし、場合によっては、Private Clean 列と Heap Alloc 列からも興味深いデータを得ることができます。

監視が必要なさまざまなメモリ割り当てについては、以下の情報をご覧ください。

Dalvik Heap
これは、アプリの Dalvik 割り当てによって使用される RAM です。Pss Total にはすべての Zygote 割り当てが含まれます(上記の PSS の定義で説明しているように、プロセス間の共有に基づいて重み付けされます)。Private Dirty の数値は、アプリのヒープにのみコミットされる実際の RAM です。アプリ固有の割り当てと、Zygote からアプリのプロセスをフォークした後で変更されたすべての Zygote 割り当てページで構成されます。

注: Dalvik Other セクションを含む新しいプラットフォーム バージョンでは、Dalvik ヒープの Pss TotalPrivate Dirty の数値に、実行時コンパイル(JIT)や GC ブックキーピングなどの Dalvik オーバーヘッドは含まれません。一方、古いバージョンではこれらすべてが Dalvik として合算されます。

Heap Alloc は、アプリについて Dalvik とネイティブ ヒープ アロケータがトラッキングしているメモリ量です。アプリのプロセスが Zygote からフォークされ、他のプロセスと共有する割り当てを含んでいるため、この値は Pss TotalPrivate Dirty より大きくなります。

.so mmap.dex mmap
これは、マッピングされた .so(ネイティブ)と .dex(Dalvik または ART)のコード用に使用される RAM です。Pss Total の数値には、複数のアプリ間で共有されるプラットフォーム コードが含まれます。Private Clean はアプリ固有のコードです。通常、実際にマッピングされるサイズはさらに大きくなります。ここに示される RAM は、アプリによって実行されたコード用に現在必要とされる分の RAM だけです。ただし、.so mmap には多くのプライベート ダーティがあります。これは、ネイティブ コードがその最終アドレスに読み込まれたときに行われる修正が原因です。
.oat mmap
これは、コードイメージによって使用される RAM の量です。この量は、複数のアプリによって共用されるプリロード済みクラスに基づきます。このイメージはすべてのアプリ間で共有され、特定のアプリの影響を受けません。
.art mmap
これは、ヒープイメージによって使用される RAM の量です。この量は、複数のアプリによって共用されるプリロード済みクラスに基づきます。このイメージはすべてのアプリ間で共有され、特定のアプリの影響を受けません。ART イメージに Object インスタンスが含まれていても、ヒープサイズにはカウントされません。
.Heap-d フラグを指定した場合のみ)
これは、アプリ用のヒープメモリの量です。イメージ内のオブジェクトとラージ オブジェクト スペースは含まれませんが、Zygote スペースと非移動スペースは含まれます。
.LOS-d フラグを指定した場合のみ)
これは、ART ラージ オブジェクト スペースによって使用される RAM の量です。Zygote ラージ オブジェクトが含まれます。ラージ オブジェクトは、12 KB より大きいすべてのプリミティブ配列の割り当てです。
.GC-d フラグを指定した場合のみ)
これは、ガベージ コレクションのオーバーヘッド コストです。このオーバーヘッドを削減する方法はありません。
.JITCache-d フラグを指定した場合のみ)
これは、JIT データとコード キャッシュによって使用されるメモリの量です。通常、すべてのアプリはインストール時にコンパイルされるため、この値はゼロです。
.Zygote-d フラグを指定した場合のみ)
これは、Zygote スペースによって使用されるメモリの量です。Zygote スペースはデバイスの起動時に作成され、割り当てられることはありません。
.NonMoving-d フラグを指定した場合のみ)
これは、ART 非移動スペースによって使用される RAM の量です。非移動スペースには、フィールドやメソッドなどの移動できない特別なオブジェクトが含まれます。このセクションは、アプリで使用するフィールドとメソッドを少なくすることで削減できます。
.IndirectRef-d フラグを指定した場合のみ)
これは、ART 間接参照テーブルによって使用される RAM の量です。 通常は少量ですが、量が多すぎる場合は、ローカルおよびグローバルの JNI 参照の使用を少なくすることで削減できる可能性があります。
Unknown
これは、システムが他の項目のいずれにも分類できなかった RAM ページです。現在、その大部分は、アドレス空間配置のランダム化(ASLR)が原因でこのデータの収集時にツールが識別できないネイティブ割り当てです。Dalvik ヒープと同様に、UnknownPss Total では Zygote との共有を考慮に入れており、Private Dirty はアプリ専用の不明な RAM です。
TOTAL
これは、アプリのプロセスによって使用される Proportional Set Size(PSS)RAM の合計です。それより上に表示されるすべての PSS フィールドの合計になっています。プロセスの全体的なメモリの重みを示し、他のプロセス、および使用可能な RAM の合計と直接比較できます。

Private DirtyPrivate Clean は、他のプロセスと共有されない、アプリのプロセス内の割り当ての合計です。プロセスが破棄されると、これらの割り当てに基づくすべての RAM が解放されてシステムに返されます。プロセスが破棄される前に Private Clean をページアウトして解放することもできますが、Private Dirty はプロセスが破棄された場合にのみ解放されます。

ダーティ RAM は変更されたページであり、スワップがないため RAM にコミットされた状態を維持する必要があります。クリーン RAM は、実行されるコードなど、永続ファイルからマッピングされたページであり、しばらく使用されなければページアウトできます。

ViewRootImpl
これは、アプリのプロセス内のアクティブなルートビューの数です。各ルートビューはウィンドウと関連付けられるため、ダイアログやその他のウィンドウに関するメモリリークの特定に役立ちます。
AppContextsActivities
これは、アプリの Context オブジェクトと Activity オブジェクトのうち、プロセス内の現在ライブ状態にあるオブジェクトの数です。この値を使用すると、静的な参照が原因でガベージ コレクションの対象とならない Activity オブジェクトのリークを簡単に特定できます。こうしたリークはよくあります。ほとんどの場合、これらのオブジェクトにはその他の割り当てが多数関連付けられているため、大きなメモリリークをトラッキングするのに役立ちます。