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 で使用できるオプションの一覧を次の表に示します。

オプション 説明
-t timeout タイムアウト時間を秒単位で指定します。指定しない場合、デフォルト値は 10 秒です。
--help dumpsys ツールのヘルプテキストを出力します。
-l dumpsys で指定できるシステム サービスの全リストを出力します。
--skip services 出力に含めないサービスを指定します。
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 の行だけが含まれます(上記の tuna-gpio-keykad.kcm ファイルでそれを確認できます)。

入力リーダーの状態:

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

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

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

UI パフォーマンスのテスト

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

    adb shell dumpsys gfxinfo package-name
    

下記のように framestats オプションも指定すると、最近のフレームについて詳細なタイミング情報がさらに提供されるので、問題をより正確に追跡してデバッグすることができます。

    adb shell dumpsys gfxinfo package-name framestats
    

gfxinfoframestats を使って、UI パフォーマンスの測定をテスト結果に組み込む場合について詳しくは、UI パフォーマンスのテストに関する記事をご覧ください。

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

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 接続を示します。各行の下に、(bucketDuration にミリ秒単位で指定された)2 時間分の次の情報がそれぞれ表示されます。

  • 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 別、またはシステムレベル別の表示が可能です。データを含めるかどうかは、電池のパフォーマンスを分析するうえで役立つかどうかに基づいて選択されます。各行は、以下の要素についての記録を表します。

  • ダミー整数
  • その記録に関連付けられたユーザー ID
  • 集計モード:
    • i - 充電している / していない状態に関連しない情報。
    • l - 充電済み(最後に充電されてからの使用量)。
    • u - プラグを抜いている(最後にプラグを抜いてからの使用量)。Android 5.1.1 でサポートが終了しています。
  • セクション ID: その行内でその後に続く値をどう解釈するかを示します。

下記の表で、表示される可能性のあるさまざまなセクション ID について説明します。

セクション ID 説明 その後のフィールド

vers

バージョン

チェックインのバージョン、パーセルのバージョン、開始プラットフォームのバージョン、終了プラットフォームのバージョン

uid

UID

UID、パッケージ名

apk

APK

wakeup 数、APK、サービス、開始時間、開始数、起動数

pr

プロセス

プロセス、ユーザー、システム、フォアグラウンド、開始数

sr

センサー

センサー番号、時間、カウント

vib

バイブレーション

時間、カウント

fg

フォアグラウンド

時間、カウント

st

開始時間

フォアグラウンド、アクティブ、実行中

wl

wake lock

wake lock、フル時間、'f'、フルカウント、部分時間、'p'、部分カウント、期間、'w'、期間カウント

sy

同期

同期、時間、カウント

jb

ジョブ

ジョブ、時間、カウント

kwl

カーネルの wake lock

カーネルの wake lock、時間、カウント

wr

wakeup の理由

wakeup の理由、時間、カウント

nt

ネットワーク

モバイルバイト数 RX、モバイルバイト数 TX、Wi-Fi バイト数 RX、Wi-Fi バイト数 TX、モバイル パケット数 RX、モバイル パケット数 TX、Wi-Fi パケット数 RX、Wi-Fi パケット数 TX、モバイル アクティブ時間、モバイル アクティブ数

ua

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

その他、ボタン、タップ

bt

電池

開始数、電池の実時間、電池の稼働時間、合計実時間、合計稼働時間、開始時刻、電池画面オフの実時間、電池画面オフの稼働時間

dc

電池放電

低、高、画面オン、画面オフ

lv

電池残量

開始残量、現在の残量

wfl

Wi-Fi

Wi-Fi フルロックオン時間、Wi-Fi スキャン時間、Wi-Fi 実行時間、Wi-Fi スキャン数、Wi-Fi アイドル時間、Wi-Fi 受信時間、Wi-Fi 送信時間

gwfl

グローバル Wi-Fi

Wi-Fi オン時間、Wi-Fi 実行時間、Wi-Fi アイドル時間、Wi-Fi 受信時間、Wi-Fi 送信時間、Wi-Fi 電力(mAh)

gble

グローバル Bluetooth

BT アイドル時間、BT 受信時間、BT 送信時間、BT 電力(mAh)

m

その他

画面オン時間、電話オン時間、フル wake lock 合計時間、部分 wake lock 合計時間、モバイル無線アクティブ時間、モバイル無線アクティブ調整時間、操作時間、省電力モード有効時間、接続変更数、デバイス アイドルモード有効時間、デバイス アイドルモード有効数、デバイス アイドル時間、デバイス アイドル数、モバイル無線アクティブ数、モバイル無線アクティブ不明時間

gn

グローバル ネットワーク

モバイル RX 合計バイト数、モバイル TX 合計バイト数、Wi-Fi RX 合計バイト数、Wi-Fi TX 合計バイト数、モバイル RX 合計パケット数、モバイル TX 合計パケット数、Wi-Fi RX 合計パケット数、Wi-Fi TX 合計パケット数

br

画面の明るさ

暗い、やや暗い、普通、やや明るい、明るい

sst

電波スキャン時間

電波スキャン時間

sgt

電波強度時間

なし、弱、中、強、最強

sgc

電波強度カウント

なし、弱、中、強、最強

dct

データ接続時間

なし、GPRS、EDGE、UMTS、CDMA、EVDO_0、EVDO_A、1xRTT、HSDPA、HSUPA、HSPA、IDEN、EVDO_B、LTE、EHRPD、HSPAP、その他

dcc

データ接続数

なし、GPRS、EDGE、UMTS、CDMA、EVDO_0、EVDO_A、1xRTT、HSDPA、HSUPA、HSPA、IDEN、EVDO_B、LTE、EHRPD、HSPAP、その他

wst

Wi-Fi 状態時間

オフ、オフでスキャン中、オンでネットワークなし、切断中、接続済み STA、接続済み P2P、接続済み STA P2P、ソフト AP

wsc

Wi-Fi 状態カウント

オフ、オフでスキャン中、オンでネットワークなし、切断中、接続済み STA、接続済み P2P、接続済み STA P2P、ソフト AP

wsst

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

無効、切断、インターフェース無効、非アクティブ、スキャン中、認証中、リンク中、リンク済み、4 ウェイ ハンドシェイク、グループ ハンドシェイク、完了、休止、未初期化

wssc

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

無効、切断、インターフェース無効、非アクティブ、スキャン中、認証中、リンク中、リンク済み、4 ウェイ ハンドシェイク、グループ ハンドシェイク、完了、休止、未初期化

wsgt

Wi-Fi 電波強度時間

なし、弱、中、強、最強

wsgc

Wi-Fi 電波強度カウント

なし、弱、中、強、最強

bst

Bluetooth 状態時間

非アクティブ、低、中、高

bsc

Bluetooth 状態カウント

非アクティブ、低、中、高

pws

消費電力概要

電池容量、算出電力、最小消費電力、最大消費電力

pwi

消費電力項目

ラベル、mAh

dsd

放電ステップ

時間、残量、画面、省電力

csd

充電ステップ

時間、残量、画面、省電力

dtr

放電の残り時間

電池の残り時間

ctr

充電の残り時間

充電の残り時間

: Android 6.0 より前は、Bluetooth 無線、セル無線通信、および Wi-Fi の消費電力は、m(その他)セクション カテゴリで追跡されていました。Android 6.0 以上では、これらのコンポーネントの消費電力は、pwi(消費電力の項目)セクションの各コンポーネント別のラベル(wifi、blue、cell)で追跡されます。

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

アプリのメモリ使用量を調べるには、一定期間 procstats を使用する方法か、meminfo を使って特定時間のスナップショットを撮る方法のどちらかを行います。以下のセクションで、2 つの方法それぞれについて説明します。

procstats

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

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

adb shell dumpsys procstats --hours 3

下記の例で確認できるように、出力には、アプリの実行時間の割合の後に、PSS、USS が「minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS over <サンプル数>」の形式で表示されます。

    AGGREGATED OVER LAST 3 HOURS:
      * com.android.systemui / u0a20 / v22:
               TOTAL: 100% (109MB-126MB-159MB/108MB-125MB-157MB over 18)
          Persistent: 100% (109MB-126MB-159MB/108MB-125MB-157MB over 18)
      * com.android.nfc / 1027 / v22:
               TOTAL: 100% (17MB-17MB-17MB/16MB-16MB-16MB over 18)
          Persistent: 100% (17MB-17MB-17MB/16MB-16MB-16MB over 18)
      * android.process.acore / u0a4 / v22:
               TOTAL: 100% (14MB-15MB-15MB/14MB-14MB-14MB over 20)
              Imp Fg: 100% (14MB-15MB-15MB/14MB-14MB-14MB over 20)
      ...
      * com.coulombtech / u0a106 / v26:
               TOTAL: 0.01%
            Receiver: 0.01%
            (Cached): 21% (4.9MB-5.0MB-5.2MB/3.8MB-3.9MB-4.1MB over 2)
      * com.softcoil.mms / u0a86 / v32:
               TOTAL: 0.01%
            (Cached): 0.25%
      * com.udemy.android / u0a91 / v38:
               TOTAL: 0.01%
            Receiver: 0.01%
            (Cached): 0.75% (9.8MB-9.8MB-9.8MB/8.5MB-8.5MB-8.5MB over 1)
      ...
    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 値にそのまま反映されます。一方、他のプロセスと共有されるページは、共有量に対する比率でのみ反映されます。たとえば、2 つのプロセスで共有されるページは、そのサイズが半分ずつ各プロセスの PSS に反映されます。

PSS 値の特長は、全プロセスにわたって PSS を合計して、全プロセスの実際のメモリ使用量を判断できることです。そのため PSS は、1 つのプロセスの実際の 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 とネイティブ ヒープ アロケータが管理しているメモリの量です。この値は、Pss TotalPrivate Dirty より大きくなります。これは、プロセスが Zygote からフォークされたので、他のプロセスと共有する割り当てが含まれているためです。

.so mmap.dex mmap
マッピングされた .so(ネイティブ)と .dex(Dalvik または ART)のコードが使用する RAM です。Pss Total の数値には、複数のアプリにわたり共有されるプラットフォーム コードが含まれます。Private Clean はアプリ独自のコードです。通常、実際にマッピングされるサイズはこれより大きくなります。ここに示される 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 ヒープと同様に、Unknown の Pss Total は Zygote との共有を考慮し、Private Dirty はアプリ専用の不明な RAM です。
TOTAL
プロセスが使用する Proportional Set Size(PSS)RAM の合計です。これより上に表示されるすべての PSS フィールドの合計となります。プロセス全体のメモリの重みを表し、他のプロセス、および使用可能な合計 RAM と直接比較できます。

Private DirtyPrivate Clean は、他のプロセスとは共有されない、プロセス内の割り当ての合計です。この 2 つを合わせたもの(特に Private Dirty)が、プロセスが破棄されたときにシステムに解放される RAM の量となります。ダーティ RAM は変更されたページであり、RAM にコミットされたまま維持される必要があります(スワップがないため)。クリーン RAM は永続ファイル(実行されるコードなど)からマッピングされたページであり、一定期間使用されない場合はページアウトが可能です。

ViewRootImpl
プロセス内でアクティブなルートビューの数です。各ルートビューはウィンドウと関連付けられるため、ダイアログやその他のウィンドウに関するメモリリークの特定に使用できます。

AppContextsActivities
アプリの Context オブジェクトと Activity オブジェクトのうち、プロセス内で現在ライブ状態にある数です。これを使って、静的な参照があるためにガベージ コレクションの対象とならない Activity オブジェクトのリークを簡単に特定できるようになります。こうしたリークはよくある現象です。通常、これらのオブジェクトには関連付けられたその他の割り当てが多くあるため、これによって大きなメモリリークを追跡できるようになります。

注: View オブジェクトまたは Drawable オブジェクトは、その所属元である Activity への参照元も保持しています。そのため、View オブジェクトまたは Drawable オブジェクトを保持することが、アプリの Activity のリークの原因となることがあります。