Android命令行工具--dumpsys

dumpsys?是一種在 Android 設備上運行的工具,可提供有關系統服務的信息。可以使用?Android 調試橋 (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 版本不同而異。以下部分介紹您通常會看到的信息類型。

Event Hub 狀態

以下是您在檢查輸入診斷信息的?Event Hub 狀態時可能會看到的信息示例:

INPUT MANAGER (dumpsys input)Event Hub State:BuiltInKeyboardId: -2Devices:-1: VirtualClasses: 0x40000023Path: Descriptor: a718a782d34bc767f4689c232d64d527998ea7fdLocation:ControllerNumber: 0UniqueId: Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Virtual.kcmConfigurationFile:HaveKeyboardLayoutOverlay: false1: msm8974-taiko-mtp-snd-card Headset JackClasses: 0x00000080Path: /dev/input/event5Descriptor: c8e3782483b4837ead6602e20483c46ff801112cLocation: ALSAControllerNumber: 0UniqueId:Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile:KeyCharacterMapFile:ConfigurationFile:HaveKeyboardLayoutOverlay: false2: msm8974-taiko-mtp-snd-card Button JackClasses: 0x00000001Path: /dev/input/event4Descriptor: 96fe62b244c555351ec576b282232e787fb42babLocation: ALSAControllerNumber: 0UniqueId:Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000KeyLayoutFile: /system/usr/keylayout/msm8974-taiko-mtp-snd-card_Button_Jack.klKeyCharacterMapFile: /system/usr/keychars/msm8974-taiko-mtp-snd-card_Button_Jack.kcmConfigurationFile:HaveKeyboardLayoutOverlay: false3: hs_detectClasses: 0x00000081Path: /dev/input/event3Descriptor: 485d69228e24f5e46da1598745890b214130dbc4Location:ControllerNumber: 0UniqueId:Identifier: bus=0x0000, vendor=0x0001, product=0x0001, version=0x0001KeyLayoutFile: /system/usr/keylayout/hs_detect.klKeyCharacterMapFile: /system/usr/keychars/hs_detect.kcmConfigurationFile:HaveKeyboardLayoutOverlay: false
...

Input Reader 狀態

InputReader?負責對來自內核的輸入事件進行解碼。其狀態轉儲會顯示各輸入設備的配置信息以及最近發生的狀態變化,如按下按鍵或輕觸觸摸屏等操作。

以下示例顯示了觸摸屏的輸出。注意有關設備分辨率和所用校準參數的信息。

Input Reader State
...Device 6: Melfas MMSxxx TouchscreenIsExternal: falseSources: 0x00001002KeyboardType: 0Motion Ranges:X: source=0x00001002, min=0.000, max=719.001, flat=0.000, fuzz=0.999Y: source=0x00001002, min=0.000, max=1279.001, flat=0.000, fuzz=0.999PRESSURE: source=0x00001002, min=0.000, max=1.000, flat=0.000, fuzz=0.000SIZE: source=0x00001002, min=0.000, max=1.000, flat=0.000, fuzz=0.000TOUCH_MAJOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000TOUCH_MINOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000TOOL_MAJOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000TOOL_MINOR: source=0x00001002, min=0.000, max=1468.605, flat=0.000, fuzz=0.000Touch Input Mapper:Parameters:GestureMode: spotsDeviceType: touchScreenAssociatedDisplay: id=0, isExternal=falseOrientationAware: trueRaw Touch Axes:X: min=0, max=720, flat=0, fuzz=0, resolution=0Y: min=0, max=1280, flat=0, fuzz=0, resolution=0Pressure: min=0, max=255, flat=0, fuzz=0, resolution=0TouchMajor: min=0, max=30, flat=0, fuzz=0, resolution=0TouchMinor: unknown rangeToolMajor: unknown rangeToolMinor: unknown rangeOrientation: unknown rangeDistance: unknown rangeTiltX: unknown rangeTiltY: unknown rangeTrackingId: min=0, max=65535, flat=0, fuzz=0, resolution=0Slot: min=0, max=9, flat=0, fuzz=0, resolution=0Calibration:touch.size.calibration: diametertouch.size.scale: 10.000touch.size.bias: 0.000touch.size.isSummed: falsetouch.pressure.calibration: amplitudetouch.pressure.scale: 0.005touch.orientation.calibration: nonetouch.distance.calibration: noneSurfaceWidth: 720pxSurfaceHeight: 1280pxSurfaceOrientation: 0Translation and Scaling Factors:XScale: 0.999YScale: 0.999XPrecision: 1.001YPrecision: 1.001GeometricScale: 0.999PressureScale: 0.005SizeScale: 0.033OrientationCenter: 0.000OrientationScale: 0.000DistanceScale: 0.000HaveTilt: falseTiltXCenter: 0.000TiltXScale: 0.000TiltYCenter: 0.000TiltYScale: 0.000Last Button State: 0x00000000Last Raw Touch: pointerCount=0Last Cooked Touch: pointerCount=0

在 Input Reader 狀態轉儲的結尾部分,會顯示一些關于全局配置參數的信息,例如點按時間間隔:

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

Input Dispatcher 狀態

InputDispatcher?負責向應用發送輸入事件。如以下示例輸出所示,其狀態轉儲顯示許多方面的信息,包括正在輕觸哪個窗口、輸入隊列的狀態、是否正在進行 ANR 以及其他輸入事件信息:

Input Dispatcher State:DispatchEnabled: 1DispatchFrozen: 0FocusedApplication: <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.000ms1: 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.000ms2: 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=10MotionEvent(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.0msMotionEvent(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.7msMotionEvent(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=falseOutboundQueue: <empty>WaitQueue: <empty>1: channelName='278c1d65 KeyguardScrim (server)', windowName='Window{278c1d65 u0 KeyguardScrim}', status=NORMAL, monitor=false, inputPublisherBlocked=falseOutboundQueue: <empty>WaitQueue: <empty>2: channelName='357bbbfe SearchPanel (server)', windowName='Window{357bbbfe u0 SearchPanel}', status=NORMAL, monitor=false, inputPublisherBlocked=falseOutboundQueue: <empty>WaitQueue: <empty>...AppSwitch: not pending7: 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=falseOutboundQueue: <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=falseOutboundQueue: <empty>WaitQueue: <empty>9: channelName='3b14c0ca NavigationBar (server)', windowName='Window{3b14c0ca u0 NavigationBar}', status=NORMAL, monitor=false, inputPublisherBlocked=falseOutboundQueue: <empty>WaitQueue: <empty>...Configuration:KeyRepeatDelay: 50.0msKeyRepeatTimeout: 500.0ms

檢查事項

下面列出了在檢查?input?服務的輸出時要考慮的事項:

Event Hub 狀態:

  • 所有預期的輸入設備是否都存在。
  • 每個輸入設備是否都有適當的按鍵布局文件、按鍵字符映射文件和輸入設備配置文件。如果這些文件缺失或包含語法錯誤,則無法加載它們。
  • 每個輸入設備是否都已正確分類。Classes?字段中的位是否對應于?EventHub.h?中的標志,如?INPUT_DEVICE_CLASS_TOUCH_MT
  • BuiltInKeyboardId?是否正確無誤。如果設備未配備內置鍵盤,則該 ID 必須為?-2。否則,應為內置鍵盤的 ID。
    • 如果您發現?BuiltInKeyboardId?應該為?-2,但卻不是,則說明缺少某個特殊功能小鍵盤的按鍵字符映射文件。特殊功能小鍵盤設備應具有僅包含?type SPECIAL_FUNCTION?行的按鍵字符映射文件。

Input Reader 狀態:

  • 所有的預期輸入設備是否都存在。
  • 每個輸入設備是否都已配置正確。特別注意檢查觸摸屏和操縱桿軸是否正確。

Input Dispatcher 狀態:

  • 所有輸入事件是否均按預期進行處理。
  • 輕觸觸摸屏的同時運行?dumpsys?后,TouchStates?行是否正確標識了您所輕觸的窗口。

測試界面性能

如果指定?gfxinfo?服務,輸出中會包含錄制階段所發生的動畫幀的相關性能信息。 以下命令使用?gfxinfo?收集指定軟件包名稱的界面性能數據:

adb shell dumpsys gfxinfo package-name

您還可以包含?framestats?選項,以提供有關最近發生的幀的更加詳細的幀時間信息,讓您能夠更準確地找到問題并進行調試:

adb shell dumpsys gfxinfo package-name framestats

如需詳細了解如何使用?gfxinfo?和?framestats?將界面性能測量值集成到測試實踐中,請參閱編寫 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?的行。有兩個這樣的行,第一個表示移動數據連接,第二個表示 Wi-Fi 連接。在每一行下方,您可以看到每個兩小時期限(bucketDuration?以毫秒為單位表示)的以下信息:

  • set=DEFAULT?表示前臺網絡使用情況,set=BACKGROUND?表示后臺網絡使用情況,set=ALL?表示這兩種網絡使用情況。
  • tag=0x0?表示與流量關聯的套接字標簽。
  • rxBytes?和?rxPackets?表示在相應時間間隔內接收的字節數和數據包數。
  • txBytes?和?txPackets?表示在相應時間間隔內發送(傳輸)的字節數和數據包數。

檢查電池診斷信息

指定?batterystats?服務會生成關于設備電池用量的統計數據,這些數據按唯一用戶 ID (UID) 進行整理。如需了解如何使用?dumpsys?在低電耗模式和應用待機模式下測試應用,請參閱在低電耗模式和應用待機模式下進行測試。

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?表示?--charged(自上次充電后的使用情況)。
    • u?表示?--unplugged(自上次拔下電源后的使用情況)。在 Android 5.1.1 中已廢棄。
  • 區段標識符,用于確定如何解譯行中的后續值。

下表介紹了您可能會看到的各種區段標識符:

表 2.?區段標識符列表

區段標識符說明其余字段

vers

版本

checkin versionparcel versionstart platform version?和?end platform version

uid

UID

uid?和?package name

apk

APK

wakeupsAPKservicestart timestarts?和?launches

pr

進程

processusersystemforeground?和?starts

sr

傳感器

sensor numbertime?和?count

vib

振動器

time?和?count

fg

前景

time?和?count

st

狀態時間

foregroundactive?和?running

wl

喚醒鎖

wake lockfull timeffull countpartial timeppartial countwindow timew?和?window count

sy

同步

synctime?和?count

jb

作業

jobtime?和?count

kwl

內核喚醒鎖定

kernel wake locktime?和?count

wr

喚醒原因

wakeup reasontime?和?count

nt

網絡

mobile bytes RXmobile bytes TXWi-Fi bytes RXWi-Fi bytes TXmobile packets RXmobile packets TXWi-Fi packets RXWi-Fi packets TXmobile active time?和?mobile active count

ua

用戶活動

otherbutton?和?touch

bt

電池

start countbattery realtimebattery uptimetotal realtimetotal uptimestart clock timebattery screen off realtime?和?battery screen off uptime

dc

電池電量消耗

lowhighscreen on?和?screen off

lv

電量

start level?和?current level

wfl

Wi-Fi

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

gwfl

全局 Wi-Fi

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

gble

全局藍牙

BT idle timeBT receive timeBT transmit time?和?BT 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 count?和?mobile 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 packets?和?Wi-Fi TX total packets

br

屏幕亮度

darkdimmediumlight?和?bright

sst

信號掃描時間

signal scanning time

sgt

信號強度時間

nonepoormoderategood?和?great

sgc

信號強度計數

nonepoormoderategood?和?great

dct

數據連接時間

noneGPRSEDGEUMTSCDMAEVDO_0EVDO_A1xRTTHSDPAHSUPAHSPAIDENEVDO_BLTEEHRPD?和?HSPAP,?other

dcc

數據連接計數

noneGPRSEDGEUMTSCDMAEVDO_0EVDO_A1xRTTHSDPAHSUPAHSPAIDENEVDO_BLTEEHRPDHSPAP?和?other

wst

Wi-Fi 狀態時間

offoff scanningon no networkson disconnectedon connected STAon connected P2Pon connected STA P2P?和?soft AP

wsc

WLAN 狀態計數

offoff scanningon no networks、?on disconnectedon connected STAon connected P2Pon connected STA P2P、?soft AP

wsst/p>

Wi-Fi 客戶端狀態時間

invaliddisconnectedinterface disabledinactivescanningauthenticatingassociatingassociatedfour-way handshakegroup handshakecompleteddormant?和?uninitialized

wssc

Wi-Fi 客戶端狀態計數

invaliddisconnectedinterface disabledinactivescanningauthenticatingassociatingassociatedfour-way handshakegroup handshakecompleteddormant?和?uninitialized

wsgt

Wi-Fi 信號強度時間

nonepoormoderategood?和?great

wsgc

Wi-Fi 信號強度計數

nonepoormoderategood?和?great

bst

藍牙狀態時間

inactivelowmed?和?high

bsc

藍牙狀態計數

inactivelowmed?和?high

pws

耗電量匯總

battery capacitycomputed powerminimum drained power?和?maximum drained power

pwi

耗電項

label?和?mAh

dsd

耗電步驟

durationlevelscreen?和?power-save

csd

充電步驟

durationlevelscreen?和?power-save

dtr

耗電剩余時間

battery time remaining

ctr

充電剩余時間

charge time remaining

注意:對于 Android 6.0 之前的版本,藍牙無線電、移動網絡無線電以及 Wi-Fi 的耗電量在?m(“其他”)區段類別中進行跟蹤。在 Android 6.0 及更高版本中,這些組件的耗電量在?pwi(“耗電項”)區段進行跟蹤,其中每個組件均使用單獨的標簽(wifiblue?和?cell)。?

查看內存分配情況

您可以通過兩種方法檢查應用的內存占用情況:使用?procstats?檢查一段時間內的占用情況,或使用?meminfo?檢查特定時間點的占用情況。 以下幾個部分介紹如何使用這兩種方法。

procstats

procstats?可以讓您了解應用在一段時間內的表現,包括應用在后臺運行的時長以及在該期間內的內存占用情況。它可以幫助您快速找到應用中的低效環節和不當行為(如內存泄漏),這些問題可能會影響應用的表現,特別是在低內存設備上運行時。其狀態轉儲會顯示有關每個應用的運行時間、按比例分攤的內存大小 (PSS)、獨占內存大小 (USS) 和常駐內存大小 (RSS) 等統計信息。

如需獲取過去三小時內應用的內存占用情況統計信息(采用簡單易懂的格式),請運行以下命令:

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: +32m52s226msSOn /Norm: +2h10m8s364msMod : +17s930msTOTAL: +2h43m18s520msMemory 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.9GBServRst: 50KB (278 samples)Start time: 2015-04-08 13:44:18Total 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。

實際使用的物理內存(比例分配共享庫占用的內存,PSS)

這是對應用 RAM 占用情況的衡量,考慮了在進程之間共享 RAM 頁的情況。您的進程獨占的 RAM 頁會直接計入其 PSS 值,而與其他進程共享的 RAM 頁則僅會按相應比例計入 PSS 值。例如,兩個進程共享的頁面會占每個進程的 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     HeapTotal    Dirty    Clean    Dirty     Size    Alloc     Free------   ------   ------   ------   ------   ------   ------Native Heap    10468    10408        0        0    20480    14462     6017Dalvik Heap    34340    33816        0        0    62436    53883     8553Dalvik Other      972      972        0        0Stack     1144     1144        0        0Gfx dev    35300    35300        0        0Other 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        0Other mmap       30        4        0        0EGL mtrack    73072    73072        0        0GL mtrack    51044    51044        0        0Unknown      185      184        0        0TOTAL   216524   208232     4384        0    82916    68345    14570Dalvik 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        0ObjectsViews:       90         ViewRootImpl:        1AppContexts:        4           Activities:        1Assets:        2        AssetManagers:        2Local Binders:       21        Proxy Binders:       28Parcel memory:       18         Parcel count:       74Death Recipients:        2      OpenSSL Sockets:        2

?

下面是 Gmail 應用的 Dalvik 上一個較舊版本的?dumpsys

** MEMINFO in pid 9953 [com.google.android.gm] **Pss     Pss  Shared Private  Shared Private    Heap    Heap    HeapTotal   Clean   Dirty   Dirty   Clean   Clean    Size   Alloc    Free------  ------  ------  ------  ------  ------  ------  ------  ------Native Heap      0       0       0       0       0       0    7800    7637(6)  126Dalvik Heap   5110(3)    0    4136    4988(3)    0       0    9168    8958(6)  210Dalvik Other   2850       0    2684    2772       0       0Stack     36       0       8      36       0       0Cursor    136       0       0     136       0       0Ashmem     12       0      28       0       0       0Other 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      68Unknown   6994(4)    0     252    6992(4)    0       0TOTAL  24358(1) 4188    9724   17972(2)16388    4260(2)16968   16595     336ObjectsViews:    426         ViewRootImpl:        3(8)AppContexts:      6(7)        Activities:        2(7)Assets:      2        AssetManagers:        2Local Binders:     64        Proxy Binders:       34Death Recipients:      0OpenSSL Sockets:      1SQLMEMORY_USED:   1739PAGECACHE_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?數值不包括 Dalvik 開銷(例如即時編譯 (JIT) 和垃圾回收記錄),而更低的版本會在?Dalvik?中將其一并列出。

Heap Alloc?是 Dalvik 和原生堆分配器為您的應用記錄的內存占用量。此值大于?Pss Total?和?Private Dirty,這是因為您的進程是從 Zygote 派生的,且包含您的進程與所有其他進程共享的分配。

.so mmap?和?.dex mmap

映射的?.so(原生)和?.dex(Dalvik 或 ART)代碼占用的 RAM。Pss Total?值包括應用之間共享的平臺代碼。Private Clean?是您的應用自己的代碼。通常,實際映射的容量更大。此處的 RAM 只是應用已執行的代碼當前需要占用的 RAM。不過,.so mmap?具有較大容量的私有臟 RAM,這是因為在將其加載到最終地址時對原生代碼進行了修復。

.oat mmap

這是代碼映像占用的 RAM 容量。它根據由多個應用共用的預加載類計算。此映像在所有應用之間共享,不受特定應用影響。

.art mmap

這是堆映像占用的 RAM 容量。它根據由多個應用共用的預加載類計算。此映像在所有應用之間共享,不受特定應用影響。盡管 ART 映像包含?Object?實例,但它不會計入您的堆占用空間。

.Heap(僅帶有?-d?標志)

這是應用堆所占用的內存容量,其中不包括映像中的對象和大型對象空間,但包括 Zygote 空間和非移動空間。

.LOS(僅帶有?-d?標志)

這是由 ART 大型對象空間占用的 RAM 容量,其中包括 Zygote 大型對象。大型對象是所有大于 12KB 的原語數組分配。

.GC(僅帶有?-d?標志)

這是垃圾回收的開銷成本。無法減少此開銷。

.JITCache(僅帶有?-d?標志)

這是 JIT 數據和代碼緩存占用的內存容量。 通常情況下,此值為零,因為所有應用都是在安裝時編譯的。

.Zygote(僅帶有?-d?標志)

這是 Zygote 空間占用的內存容量。Zygote 空間在設備啟動過程創建且永遠不會被分配。

.NonMoving(僅帶有?-d?標志)

這是由 ART 非移動空間占用的 RAM 容量。非移動空間包含特殊的不可移動對象,例如字段和方法。您可以通過在應用中減少使用字段和方法來減小這部分空間。

.IndirectRef(僅帶有?-d?標志)

這是由 ART 間接引用表占用的 RAM 容量。 通常此容量較小,但如果很高,可以通過減少使用的本地和全局 JNI 引用數量來減小此容量。

Unknown

系統無法將其分類到其他更具體的一個項中的任何 RAM 頁。當前,此類 RAM 頁主要包含原生分配,由于地址空間布局隨機化 (ASLR),工具在收集此數據時無法識別這些分配。與 Dalvik 堆相同,Unknown?的?Pss Total?考慮了與 Zygote 共享的容量,且?Private Dirty?是僅由您的應用占用的未知 RAM。

TOTAL

您的進程占用的按比例分攤的內存大小 (PSS) RAM 總容量,等于上述所有 PSS 字段的總和。該值表示了您的進程占用的內存容量占總體內存容量的比重,可以直接與其他進程和可用的總 RAM 進行比較。

Private Dirty?和?Private Clean?合起來就是您進程中的總分配,這些分配未與其他進程共享。 當您的進程被銷毀時,這些分配中的所有 RAM 都會釋放回系統。Private Clean?也可以在進程銷毀之前被換出和釋放,但?Private Dirty?僅在進程銷毀后被釋放。

臟 RAM 頁由于已被修改過,因此必須保留在 RAM 中(因為沒有交換)。干凈 RAM 頁是從某個持久性文件(例如正在執行的代碼)映射而來的,因此如果暫時不使用,可以將其換出 RAM。

ViewRootImpl

您的進程中當前處于活動狀態的根視圖數量。每個根視圖都與一個窗口關聯,因此該值有助于您確定與對話框或其他窗口有關的內存泄漏。

AppContexts?和?Activities

您的進程中當前處于活動狀態的應用?Context?和?Activity?對象數量。該值可以幫助您快速確定發生泄漏的?Activity?對象,這些對象由于存在對其的靜態引用(比較常見)而無法進行垃圾回收。這些對象往往關聯了許多其他分配,因此是查找大型內存泄漏的理想工具。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63153.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】深刻理解Swin Transformer

Swin Transformer 是一種基于 Transformer 的視覺模型&#xff0c;由 Microsoft 研究團隊提出&#xff0c;旨在解決傳統 Transformer 模型在計算機視覺任務中的高計算復雜度問題。其全稱是 Shifted Window Transformer&#xff0c;通過引入分層架構和滑動窗口機制&#xff0c;S…

從零開始學習 sg200x 多核開發之 sophpi 編譯生成 fip.bin 流程梳理

本文主要介紹 sophpi 編譯生成 fip.bin 流程。 1、編譯前準備 sophpi 的基本編譯流程如下&#xff1a; $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注&#xff1a; 需要在 bash 下運行clean_all 非必要可以不…

mysql客戶端命令

目錄 結束符 ; \g \G 中斷輸入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ?編輯 notee (\t) prompt (\R) source (\.) system (\!) ?編輯 use (\u) help contents 結束符 ; \g \G 當我…

scala隱式函數

1 定義 通常我們所說的隱式函數也稱為 隱式轉換&#xff0c;是使用 implicit 修飾的函數 作用&#xff1a; 可以通過一個隱式函數將一種類型轉變為另一種類型 隱式轉換有兩種應用場景&#xff1a; 類型轉換&#xff0c;隱式轉換為期望類型 類型增強 2 示例 ①&#xff1a;類…

Tomcat原理(4)——嘗試手動Servlet的實現

目錄 一、什么是Servlet 1.servlet的定義 2.servlet的結構 二、實現servlet的流程圖 三、具體實現代碼 1、server 2.實體類request&response 3.HttpServlet抽象類 4.再定義三個servlet進行測試 Tomcat原理&#xff08;3&#xff09;——靜&動態資源以及運行項…

Node.js內置模塊

1.內置模塊 Node.js的中文網參考手冊:https://nodejs.cn//api 幫助文檔 API文檔:查看對應的模塊,左邊是模塊,右邊是模塊的成員 源碼:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 創建web服務器的模塊 -->進入源碼中,搜索…

【RAG實戰】RAG與大模型應用

1.1 大模型應用的方向&#xff1a;RAG 1.1.1 什么是RAG 1. 生成式AI 一種能夠生成各類內容的技術&#xff0c;包括文本、圖像、音頻和合成數據。自2022年底ChatGPT在全球范圍內推廣以來&#xff0c;基于Transformer解碼器結構的大模型已能在短時間內為用戶生成高質量的文本、…

基于DeepSpeed Chat詳解 PPO 算法中的actor_loss_fn及其核心參數

詳解 PPO 算法中的 actor_loss_fn 及其核心參數 1. 引言 在強化學習中&#xff0c;PPO&#xff08;Proximal Policy Optimization&#xff0c;近端策略優化&#xff09;算法是一種經典且高效的策略優化方法。它通過重要性采樣&#xff08;Importance Sampling&#xff09;和策…

D3 基礎1

D3 D3.js (Data-Driven Documents) 是一個基于 JavaScript 的庫&#xff0c;用于生成動態、交互式數據可視化。它通過操作文檔對象模型 (DOM) 來生成數據驅動的圖形。官方網站是 https://d3js.org/ <!DOCTYPE html> <html lang"en"><head><me…

基線檢查:Windows安全基線.【手動 || 自動】

基線定義 基線通常指配置和管理系統的詳細描述&#xff0c;或者說是最低的安全要求&#xff0c;它包括服務和應用程序設置、操作系統組件的配置、權限和權利分配、管理規則等。 基線檢查內容 主要包括賬號配置安全、口令配置安全、授權配置、日志配置、IP通信配置等方面內容&…

Python -- Linux中的Matplotlib圖中無法顯示中文 (中文為方框)

目的 用matplotlib生成的圖中文無法正常顯示 方法 主要原因: 沒找到字體 進入windows系統的C:\Windows\Fonts目錄, 復制自己想要的字體 粘貼到Linux服務器中對應python文件所處的文件夾內 設置字體: 設置好字體文件的路徑在需要對字體設置的地方設置字體 效果 中文正常顯…

快速理解類的加載過程

當程序主動使用某個類時&#xff0c;如果該類還未加載到內存中&#xff0c;則系統會通過如下三個步驟來對該類進行初始化&#xff1a; 1.加載&#xff1a;將class文件字節碼內容加載到內存中&#xff0c;并將這些靜態數據轉換成方法區的運行時數據結構&#xff0c;然后生成一個…

搭建 Elasticsearch 集群:完整教程

本文將詳細介紹如何在 Linux 環境下搭建一個 Elasticsearch 集群&#xff0c;涵蓋環境準備、配置優化、服務啟動等多個環節。 一、環境準備 創建安裝目錄 mkdir /es cd /es解壓 Elasticsearch 安裝包 tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz -C /es配置環境變量 編…

寶塔-docker拉取寶塔鏡像,并運行寶塔鏡像

寶塔-拉取寶塔鏡像&#xff0c;并運行鏡像 第1步&#xff1a;查詢 docker search btpanel/baota此docker鏡像由堡塔安全官方發布&#xff0c;鏡像版本為寶塔面板9.2.0正式版和9.0.0_lts 穩定版&#xff0c;鏡像會隨著寶塔面板更新。 目前支持x86_64和arm架構可供下載使用 版本…

使用 Valgrind 檢測 C 程序中的內存問題 -基礎教程

內存泄漏是許多 C 語言程序中的常見問題&#xff0c;它不僅會導致程序性能下降&#xff0c;甚至可能讓系統崩潰。為了檢測和修復這些問題&#xff0c;Valgrind 是一個非常強大的工具&#xff0c;它可以幫助我們分析 C 程序中的內存使用情況&#xff0c;檢測內存泄漏、越界訪問、…

窮舉vs暴搜vs深搜vs回溯vs剪枝專題一>子集

題目&#xff1a; 兩個方法本質就是決策樹的畫法不同 方法一解析&#xff1a; 代碼&#xff1a; class Solution {private List<List<Integer>> ret;//返回結果private List<Integer> path;//記錄路徑&#xff0c;注意返回現場public List<List<Int…

leecode雙指針部分題目

leecode雙指針部分題目 1. 驗證回文串2. 判斷子序列3. 兩數之和 II - 輸入有序數組4. 盛最多水的容器5. 三數之和 1. 驗證回文串 如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后&#xff0c;短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 …

Web 應用如何使用sqlite?使用 sql.js 實現前端 SQLite 數據庫操作

前言 在 Web 應用開發中&#xff0c;前端數據處理的重要性日益增加。為了實現更高效的前端數據管理&#xff0c;特別是在處理結構化數據時&#xff0c;sql.js 提供了一個出色的解決方案。sql.js 是將 SQLite 數據庫編譯為 JavaScript 的庫&#xff0c;允許開發者在瀏覽器環境中…

docker 安裝 mysql8.0容器外無法連接

文章目錄 概要問題描述解決方案其他命令 概要 主要是mysql5.7和mysql8.0的兼容性問題。 排查了很久 其實就是配置文件的一句話的事情 感覺mysql8.0更為嚴謹 這樣可能是考慮杜絕一些漏洞吧 問題描述 在容器內 netstat -an | grep 3306 都不行 在容器外 netstat -an | grep 2…

TCP協議簡單分析和握手揮手過程

TCP介紹 TCP是可靠的傳輸層協議&#xff0c;建立連接之前會經歷3次握手的階段。 確認機制&#xff1a;接受方 收到數據之后會向 發送方 回復ACK重傳機制&#xff1a;發送方 在一定時間內沒有收到 接收方的ACK就會重新發送 握手目的&#xff1a;與端口建立連接 TCP的三次握手 …