Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

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 出力に含めない 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 の行だけが含まれます(上記の 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)、Resident Set Size(RSS)についての統計情報が表示されます。

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

adb shell dumpsys procstats --hours 3

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

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 値にそのまま反映されます。一方、他のプロセスと共有されるページは、共有量に対する比率のみを考慮して反映されます。たとえば、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 のリークの原因となることがあります。