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 オプションを
service:
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
gfxinfo
と framestats
を使用して 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
はトラフィックに関連付けられたソケットのタグを示します。rxBytes
とrxPackets
は、対応する期間での受信バイト数と受信パケット数を表します。txBytes
とtxPackets
は、対応する期間での送信バイト数と送信パケット数を表します。
電池の診断情報を調べる
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. セクション識別子のリスト
セクション識別子 | 説明 | 後続のフィールド |
---|---|---|
|
バージョン |
|
|
UID |
|
|
APK |
|
|
プロセス |
|
|
センサー |
|
|
バイブレーション |
|
|
フォアグラウンド |
|
|
状態時間 |
|
|
wake lock |
|
|
同期 |
|
|
ジョブ |
|
|
カーネルの wake lock |
|
|
wakeup の理由 |
|
|
ネットワーク |
|
|
ユーザーのアクティビティ |
|
|
電池 |
|
|
電池放電 |
|
|
電池残量 |
|
|
Wi-Fi |
|
|
グローバル Wi-Fi |
|
|
グローバル Bluetooth |
|
|
その他 |
|
|
グローバル ネットワーク |
|
|
画面の明るさ |
|
|
電波スキャン時間 |
|
|
電波強度時間 |
|
|
電波強度カウント |
|
|
データ接続時間 |
|
|
データ接続数 |
|
|
Wi-Fi 状態時間 |
|
|
Wi-Fi 状態カウント |
|
|
Wi-Fi サプリカント状態時間 |
|
|
Wi-Fi サプリカント状態カウント |
|
|
Wi-Fi 電波強度時間 |
|
|
Wi-Fi 電波強度カウント |
|
|
Bluetooth 状態時間 |
|
|
Bluetooth 状態カウント |
|
|
消費電力概要 |
|
|
消費電力項目 |
|
|
放電ステップ |
|
|
充電ステップ |
|
|
放電の残り時間 |
|
|
充電の残り時間 |
|
注: 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
として表示されます。
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 Total
とPrivate Dirty
の数値に、実行時コンパイル(JIT)や GC ブックキーピングなどの Dalvik オーバーヘッドは含まれません。一方、古いバージョンではこれらすべてがDalvik
として合算されます。Heap Alloc
は、アプリについて Dalvik とネイティブ ヒープ アロケータがトラッキングしているメモリ量です。アプリのプロセスが Zygote からフォークされ、他のプロセスと共有する割り当てを含んでいるため、この値はPss Total
とPrivate 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 ヒープと同様に、
Unknown
のPss Total
では Zygote との共有を考慮に入れており、Private Dirty
はアプリ専用の不明な RAM です。 TOTAL
- これは、アプリのプロセスによって使用される Proportional Set Size(PSS)RAM の合計です。それより上に表示されるすべての PSS フィールドの合計になっています。プロセスの全体的なメモリの重みを示し、他のプロセス、および使用可能な RAM の合計と直接比較できます。
Private Dirty
とPrivate Clean
は、他のプロセスと共有されない、アプリのプロセス内の割り当ての合計です。プロセスが破棄されると、これらの割り当てに基づくすべての RAM が解放されてシステムに返されます。プロセスが破棄される前にPrivate Clean
をページアウトして解放することもできますが、Private Dirty
はプロセスが破棄された場合にのみ解放されます。ダーティ RAM は変更されたページであり、RAM にコミットされた状態を維持する必要があります(スワップがないため)。クリーン RAM は永続ファイル(実行されるコードなど)からマッピングされたページであり、しばらく使用されなければページアウトできます。
ViewRootImpl
- これは、アプリのプロセス内のアクティブなルートビューの数です。各ルートビューはウィンドウと関連付けられるため、ダイアログやその他のウィンドウに関するメモリリークの特定に役立ちます。
AppContexts
とActivities
- これは、アプリの
Context
オブジェクトとActivity
オブジェクトのうち、プロセス内の現在ライブ状態にあるオブジェクトの数です。この値を使用すると、静的な参照が原因でガベージ コレクションの対象とならないActivity
オブジェクトのリークを簡単に特定できます。こうしたリークはよくあります。ほとんどの場合、これらのオブジェクトにはその他の割り当てが多数関連付けられているため、大きなメモリリークをトラッキングするのに役立ちます。