dumpsys
ابزاری است که بر روی دستگاه های اندرویدی اجرا می شود و اطلاعاتی در مورد خدمات سیستم ارائه می دهد. با استفاده از Android Debug Bridge (ADB) از خط فرمان dumpsys
برای دریافت خروجی تشخیصی برای همه سرویسهای سیستمی که روی دستگاه متصل اجرا میشوند، تماس بگیرید.
این خروجی معمولاً بیشتر از آنچه میخواهید پرمخاطب است، بنابراین از گزینههای خط فرمان در این صفحه برای دریافت خروجی فقط برای سرویسهای سیستمی مورد نظر خود استفاده کنید. این صفحه همچنین نحوه استفاده از dumpsys
را برای انجام کارهای رایج، مانند بازرسی ورودی، رم، باتری یا عیبیابی شبکه شرح میدهد.
نحو
نحو کلی برای استفاده از 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
خروجی بسته به نسخه اندرویدی که روی دستگاه متصل اجرا می شود متفاوت است. بخشهای زیر نوع اطلاعاتی را که معمولاً میبینید شرح میدهند.
وضعیت مرکز رویداد
در زیر نمونهای از آنچه ممکن است هنگام بازرسی وضعیت مرکز رویداد عیبیابی ورودی مشاهده کنید، آمده است:
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
مسئول ارسال رویدادهای ورودی به برنامه ها است. همانطور که در خروجی نمونه زیر نشان داده شده است، حالت dump آن اطلاعاتی را در مورد اینکه کدام پنجره لمس می شود، وضعیت صف ورودی، اینکه آیا 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
درست است. اگر دستگاه دارای صفحه کلید داخلی نباشد، شناسه باید-2
باشد. در غیر این صورت، باید شناسه صفحه کلید داخلی باشد. - اگر مشاهده کردید که
BuiltInKeyboardId
-2
نیست اما باید باشد، یک فایل نقشه کاراکتر کلیدی برای یک صفحه کلید عملکرد خاص را از دست داده اید. دستگاههای صفحهکلید عملکرد ویژه باید فایلهای نقشه نویسههای کلیدی داشته باشند که فقط حاویtype SPECIAL_FUNCTION
باشند.
وضعیت خواننده ورودی:
- همه دستگاه های ورودی مورد انتظار وجود دارند.
- هر دستگاه ورودی به درستی پیکربندی شده است. به ویژه بررسی کنید که صفحه لمسی و محورهای جوی استیک درست باشند.
وضعیت توزیع کننده ورودی:
- همه رویدادهای ورودی همانطور که انتظار می رود پردازش می شوند.
- پس از لمس صفحه لمسی و اجرای
dumpsys
به طور همزمان، خطTouchStates
پنجره ای را که لمس می کنید به درستی شناسایی می کند.
تست عملکرد UI
مشخص کردن سرویس gfxinfo
خروجی با اطلاعات عملکرد مربوط به فریمهای انیمیشنی که در مرحله ضبط رخ میدهند، ارائه میکند. دستور زیر از gfxinfo
برای جمعآوری دادههای عملکرد رابط کاربری برای نام بسته مشخص شده استفاده میکند:
adb shell dumpsys gfxinfo package-name
همچنین میتوانید گزینه framestats
را برای ارائه اطلاعات دقیقتر زمانبندی فریمها از فریمهای اخیر در نظر بگیرید تا بتوانید مشکلات را با دقت بیشتری ردیابی و اشکالزدایی کنید:
adb shell dumpsys gfxinfo package-name framestats
برای کسب اطلاعات بیشتر در مورد استفاده از gfxinfo
و framestats
برای ادغام اندازهگیریهای عملکرد رابط کاربری در روشهای آزمایشی، به نوشتن یک Macrobenchmark مراجعه کنید.
عیب یابی شبکه را بررسی کنید
مشخص کردن سرویس netstats
آمار استفاده از شبکه را ارائه می دهد که از زمان راه اندازی دستگاه قبلی جمع آوری شده است. برای خروجی اطلاعات اضافی، مانند اطلاعات دقیق شناسه کاربری منحصر به فرد (UID)، گزینه detail
را به شرح زیر اضافه کنید:
adb shell dumpsys netstats detail
خروجی بسته به نسخه اندرویدی که روی دستگاه متصل اجرا می شود متفاوت است. بخشهای زیر نوع اطلاعاتی را که معمولاً میبینید شرح میدهند.
رابط های فعال و رابط های 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 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]
با استفاده از dump نمونه قبلی، به دنبال خطوطی باشید که uid=10007
دارند. دو خط از این قبیل وجود دارد - اولی یک اتصال تلفن همراه و دومی نشان دهنده اتصال Wi-Fi است. در زیر هر خط، می توانید اطلاعات زیر را برای هر پنجره دو ساعته مشاهده کنید، که bucketDuration
آن را بر حسب میلی ثانیه مشخص می کند:
-
set=DEFAULT
استفاده از شبکه پیش زمینه را نشان می دهد، در حالی کهset=BACKGROUND
نشان دهنده استفاده از پس زمینه است.set=ALL
بر هر دو دلالت دارد. -
tag=0x0
نشان دهنده تگ سوکت مرتبط با ترافیک است. -
rxBytes
وrxPackets
نشان دهنده بایت های دریافتی و بسته های دریافتی در بازه زمانی مربوطه هستند. -
txBytes
وtxPackets
نشان دهنده بایت های ارسال شده (ارسال شده) و بسته های ارسال شده در بازه زمانی مربوطه هستند.
عیب یابی باتری را بررسی کنید
مشخص کردن سرویس batterystats
دادههای آماری در مورد استفاده از باتری در دستگاه تولید میکند که با شناسه کاربر منحصر به فرد (UID) سازماندهی شده است. برای یادگیری نحوه استفاده از dumpsys
برای آزمایش برنامه خود برای Doze و App Standby، به تست با Doze و App Standby مراجعه کنید.
دستور batterystats
به شرح زیر است:
adb shell dumpsys batterystats options
برای مشاهده لیستی از گزینه های اضافی موجود برای batterystats
، گزینه -h
را قرار دهید. مثال زیر آمار مصرف باتری را برای یک بسته برنامه مشخص از آخرین بار شارژ شدن دستگاه نشان می دهد:
adb shell dumpsys batterystats --charged package-name
خروجی معمولاً شامل موارد زیر است:
- تاریخچه رویدادهای مرتبط با باتری
- آمار جهانی دستگاه
- مصرف تقریبی انرژی برای هر UID و جزء سیستم
- میلی ثانیه در هر بسته تلفن همراه برای هر برنامه
- آمار جمع آوری UID سیستم
- آمار جمع آوری UID برنامه
برای کسب اطلاعات بیشتر در مورد استفاده از batterystats
و ایجاد تصویرسازی HTML از خروجی، که درک و تشخیص مشکلات مربوط به باتری را آسانتر میکند، نمایه استفاده از باتری را با Batterystats و Battery Historian بخوانید.
خروجی ماشین پسند را بررسی کنید
با استفاده از دستور زیر می توانید خروجی batterystats
در قالب CSV قابل خواندن توسط ماشین تولید کنید:
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 یا سطح سیستم باشد. داده ها بر اساس سودمندی آن در تجزیه و تحلیل عملکرد باتری برای گنجاندن انتخاب می شوند. هر ردیف نشان دهنده یک مشاهده با عناصر زیر است:
- یک عدد صحیح نگهدارنده مکان
- شناسه کاربری مرتبط با مشاهده
- حالت تجمع:
-
i
برای اطلاعاتی که به وضعیت شارژ / شارژ نشده مرتبط نیست. -
l
برای--charged
(استفاده از آخرین شارژ). -
u
برای--unplugged
(استفاده از آخرین قطع برق). در اندروید 5.1.1 منسوخ شده است.
-
- شناسه بخش، که نحوه تفسیر مقادیر بعدی در خط را تعیین می کند.
جدول زیر شناسه بخش های مختلفی را که ممکن است مشاهده کنید توضیح می دهد:
شناسه بخش | توضیحات | فیلدهای باقی مانده |
---|---|---|
| نسخه | |
| UID | |
| APK | |
| فرآیند | |
| سنسور | |
| ویبراتور | |
| پیش زمینه | |
| زمان ایالت | |
| ویک لاک | |
| همگام سازی | |
| شغل | |
| Kernel Wake Lock | |
| دلیل بیداری | |
| شبکه | |
| فعالیت کاربر | |
| باتری | |
| تخلیه باتری | |
| سطح باتری | |
| وای فای | |
| وای فای جهانی | |
| بلوتوث جهانی | |
| متفرقه | |
| شبکه جهانی | |
| روشنایی صفحه نمایش | |
| زمان اسکن سیگنال | |
| زمان قدرت سیگنال | |
| شمارش قدرت سیگنال | |
| زمان اتصال داده | |
| تعداد اتصال داده | |
| زمان وضعیت Wi-Fi | |
| تعداد وضعیت Wi-Fi | |
| زمان حالت درخواست کننده Wi-Fi | |
| تعداد درخواست کننده Wi-Fi | |
| زمان قدرت سیگنال Wi-Fi | |
| شمارش قدرت سیگنال Wi-Fi | |
| زمان وضعیت بلوتوث | |
| تعداد حالت بلوتوث | |
| خلاصه استفاده از نیرو | |
| مورد مصرف برق | |
| مرحله تخلیه | |
| مرحله شارژ | |
| زمان تخلیه باقی مانده است | |
| زمان شارژ باقی مانده است | |
توجه : قبل از Android 6.0، مصرف برق برای رادیو بلوتوث، رادیو تلفن همراه و Wi-Fi در دسته m
(متفرقه) ردیابی میشد. در اندروید 6.0 و بالاتر، مصرف برق برای این مؤلفهها در بخش pwi
(مورد مصرف انرژی) با برچسبهای جداگانه ( wifi
، blue
، cell
) برای هر مؤلفه ردیابی میشود.
مشاهده تخصیص حافظه
می توانید میزان استفاده از حافظه برنامه خود را به یکی از دو روش بررسی کنید: در یک دوره زمانی با استفاده از procstats
یا در یک نقطه خاص از زمان با استفاده از meminfo
. بخش های زیر نحوه استفاده از هر دو روش را به شما نشان می دهد.
procstats
procstats
این امکان را به شما میدهد که ببینید برنامه شما در طول زمان چگونه عمل میکند، از جمله مدت زمانی که در پسزمینه اجرا میشود و در این مدت چقدر حافظه مصرف میکند. این به شما کمک می کند تا به سرعت ناکارآمدی ها و رفتارهای نادرست را در برنامه خود پیدا کنید، مانند نشت حافظه، که می تواند بر عملکرد آن تأثیر بگذارد، به خصوص هنگام اجرا بر روی دستگاه های با حافظه کم. حالت dump آن آمار مربوط به زمان اجرا، اندازه مجموعه متناسب (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: +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 وجود دارد، بنابراین نمیتوان آن را به فضای ذخیرهسازی صفحه کرد، زیرا اندروید از آن استفاده نمیکند. مبادله تمام تخصیصهای Dalvik و Heap بومی که انجام میدهید RAM کثیف خصوصی هستند. Dalvik و تخصیص های بومی که با فرآیند Zygote به اشتراک می گذارید، RAM کثیف مشترک هستند.
- اندازه مجموعه متناسب (PSS)
- این اندازهگیری میزان استفاده از رم برنامه شما است که اشتراکگذاری صفحات در بین فرآیندها را در نظر میگیرد. هر صفحه RAM که منحصر به فرآیند شما باشد مستقیماً به مقدار PSS آن کمک می کند، در حالی که صفحاتی که با سایر فرآیندها به اشتراک گذاشته می شوند فقط به نسبت مقدار اشتراک گذاری به مقدار PSS کمک می کنند. به عنوان مثال، یک صفحه به اشتراک گذاشته شده بین دو فرآیند، نیمی از اندازه خود را به PSS هر فرآیند کمک می کند.
یکی از ویژگی های اندازه گیری PSS این است که می توانید PSS را در تمام فرآیندها جمع کنید تا حافظه واقعی مورد استفاده همه فرآیندها را تعیین کنید. این بدان معناست که PSS معیار خوبی برای وزن واقعی RAM یک فرآیند و برای مقایسه با استفاده از RAM سایر فرآیندها و کل RAM موجود است.
به عنوان مثال، خروجی فرآیند Map در دستگاه 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
در اینجا یک dumpsys
قدیمی در Dalvik از برنامه Gmail است:
** 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
- RAM مورد استفاده توسط تخصیص Dalvik در برنامه شما.
Pss Total
شامل تمام تخصیصهای Zygote میشود که بر اساس اشتراک آنها در فرآیندها، همانطور که در تعریف PSS توضیح داده شده است، وزن میشود. شمارهPrivate Dirty
همان RAM واقعی است که فقط به پشته برنامه شما متعهد شده است، متشکل از تخصیصهای خودتان و هر صفحه تخصیص Zygote که از زمان قطع فرآیند برنامه شما از Zygote تغییر کرده است.توجه: در نسخههای پلتفرم جدیدتر که دارای بخش
Dalvik Other
هستند، اعدادPss Total
وPrivate Dirty
برای Dalvik Heap شامل سربار Dalvik نمیشوند، مانند جمعآوری بهموقع (JIT) و حسابداری GC، در حالی که فهرست نسخههای قدیمیتر همه اینها تحت نظرDalvik
ترکیب شد.Heap Alloc
مقدار حافظه ای است که Dalvik و تخصیص دهنده Heap بومی برای برنامه شما ردیابی می کنند. این مقدار بزرگتر ازPss Total
وPrivate Dirty
است زیرا فرآیند شما از Zygote جدا شده است و شامل تخصیص هایی است که فرآیند شما با سایرین به اشتراک می گذارد. -
.so mmap
و.dex mmap
- RAM برای کدهای
.so
(بومی) و.dex
(Dalvik یا ART) نگاشت شده استفاده می شود. شمارهPss Total
شامل کد پلت فرم است که در بین برنامه ها به اشتراک گذاشته شده است.Private Clean
کد خود برنامه شماست. به طور کلی، اندازه واقعی نقشه برداری بزرگتر است. RAM در اینجا تنها چیزی است که در حال حاضر برای کدهایی که توسط برنامه اجرا شده است در RAM وجود دارد. با این حال،.so mmap
یک کثیف خصوصی بزرگ دارد، که به دلیل رفع مشکل کد اصلی هنگام بارگذاری در آدرس نهایی آن است. -
.oat mmap
- این مقدار RAM است که توسط تصویر کد استفاده می شود. این بر اساس کلاس های از پیش بارگذاری شده است که معمولاً توسط چندین برنامه استفاده می شود. این تصویر در همه برنامه ها به اشتراک گذاشته شده است و برنامه های خاصی بر آن تأثیر نمی گذارد.
-
.art mmap
- این مقدار RAM است که توسط تصویر پشته استفاده می شود. این بر اساس کلاس های از پیش بارگذاری شده است که معمولاً توسط چندین برنامه استفاده می شود. این تصویر در همه برنامه ها به اشتراک گذاشته شده است و برنامه های خاصی بر آن تأثیر نمی گذارد. حتی اگر تصویر ART حاوی نمونههای
Object
باشد، در اندازه پشته شما حساب نمیشود. -
.Heap
(فقط با پرچم-d
) - این مقدار حافظه پشته برای برنامه شما است. این شامل اشیاء در تصویر و فضاهای بزرگ اشیاء نمی شود، اما شامل فضای Zygote و فضای غیر متحرک می شود.
-
.LOS
(فقط با پرچم-d
) - این مقدار RAM است که توسط فضای شی بزرگ ART استفاده می شود. این شامل اجسام بزرگ Zygote می شود. اشیاء بزرگ همگی تخصیص آرایه های اولیه بزرگتر از 12 کیلوبایت هستند.
-
.GC
(فقط با پرچم-d
) - این هزینه سربار برای جمع آوری زباله است. هیچ راهی برای کاهش این سربار وجود ندارد.
-
.JITCache
(فقط با پرچم-d
) - این مقدار حافظه ای است که توسط حافظه پنهان داده و کد JIT استفاده می شود. به طور معمول، این صفر است، زیرا همه برنامه ها در زمان نصب کامپایل می شوند.
-
.Zygote
(فقط با پرچم-d
) - این مقدار حافظه استفاده شده توسط فضای Zygote است. فضای Zygote در هنگام راه اندازی دستگاه ایجاد می شود و هرگز اختصاص داده نمی شود.
-
.NonMoving
(فقط با پرچم-d
) - این مقدار RAM است که توسط فضای غیر متحرک ART استفاده می شود. فضای غیر متحرک شامل اشیاء غیر متحرک خاصی مانند فیلدها و روش ها می باشد. میتوانید با استفاده از فیلدها و روشهای کمتر در برنامه خود، این بخش را کاهش دهید.
-
.IndirectRef
(فقط با پرچم-d
) - این مقدار RAM است که توسط جداول مرجع غیر مستقیم ART استفاده می شود. معمولاً این مقدار کم است، اما اگر خیلی زیاد باشد، ممکن است بتوانید با کاهش تعداد مراجع محلی و جهانی JNI استفاده شده، آن را کاهش دهید.
-
Unknown
- هر صفحه RAM که سیستم نمی تواند در یکی از موارد خاص دیگر طبقه بندی کند. در حال حاضر، این عمدتاً شامل تخصیصهای بومی است که به دلیل تصادفیسازی طرحبندی فضای آدرس (ASLR) توسط ابزار هنگام جمعآوری این دادهها قابل شناسایی نیست. مانند Heap Dalvik،
Pss Total
forUnknown
اشتراک گذاری با Zygote را در نظر می گیرد وPrivate Dirty
RAM ناشناخته ای است که فقط به برنامه شما اختصاص داده شده است. -
TOTAL
- کل رم متناسب با اندازه مجموعه (PSS) مورد استفاده فرآیند شما. این مجموع تمام فیلدهای PSS بالای آن است. وزن کلی حافظه پردازش شما را نشان می دهد که می تواند مستقیماً با سایر فرآیندها و کل RAM موجود مقایسه شود.
Private Dirty
وPrivate Clean
مجموع تخصیص های موجود در فرآیند شما هستند که با سایر فرآیندها به اشتراک گذاشته نمی شوند. هنگامی که فرآیند شما از بین می رود، تمام RAM از این تخصیص ها به سیستم باز می گردد.Private Clean
همچنین میتواند قبل از از بین رفتن فرآیند شما صفحهبندی و منتشر شود، اماPrivate Dirty
فقط در صورت تخریب فرآیند منتشر میشود.رم کثیف صفحاتی هستند که اصلاح شده اند و بنابراین باید به رم متعهد بمانند زیرا تعویضی وجود ندارد. Clean RAM صفحاتی هستند که از یک فایل ثابت مانند کد در حال اجرا نقشه برداری شده اند و در صورت عدم استفاده برای مدتی می توان آنها را صفحه بندی کرد.
-
ViewRootImpl
- تعداد بازدیدهای ریشه ای که در فرآیند شما فعال هستند. هر نمای ریشه با یک پنجره مرتبط است، بنابراین می تواند به شما کمک کند نشت حافظه مربوط به دیالوگ ها یا پنجره های دیگر را شناسایی کنید.
-
AppContexts
وActivities
- تعداد اشیاء
Context
وActivity
برنامه که در حال حاضر در فرآیند شما زندگی می کنند. این می تواند به شما کمک کند تا به سرعت اشیاءActivity
لو رفته را شناسایی کنید که به دلیل ارجاعات ثابت روی آنها قابل جمع آوری نیست، که معمول است. این اشیاء اغلب دارای تخصیص های بسیار دیگری هستند که آنها را راهی مناسب برای ردیابی نشت های حافظه بزرگ می کند.