自从工作越来越忙后,越来越懒得写文章了,趁着1024程序员节,仪式性地写篇文章,分享一下最近调试设备经常用到的adb指令~
dumpsys是查看系统服务信息的一个常用指令,可以用dumpsys -l
查看系统所有的服务,dumpsys meminfo可以查看到应用最详细的内存占用情况,主要有两大用途
命令查询的数据示例如下:
Applications Memory Usage (in Kilobytes):
Uptime: 195423478 Realtime: 195423478
** MEMINFO in pid 23209 [com.example.myfirstapp] **
Pss Private Private Swap Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 8406 8284 0 0 20620 17082 3537
Dalvik Heap 988 900 0 0 2962 1426 1536
Dalvik Other 481 476 0 0
Stack 56 56 0 0
Ashmem 7 0 0 0
Other dev 12 0 12 0
.so mmap 2123 160 8 0
.jar mmap 1737 0 24 0
.apk mmap 1027 0 0 0
.ttf mmap 48 0 0 0
.dex mmap 1944 4 1936 0
.oat mmap 66 0 0 0
.art mmap 5883 5508 0 0
Other mmap 60 20 0 0
Unknown 725 688 0 0
TOTAL 23563 16096 1980 0 23582 18508 5073
App Summary
Pss(KB)
------
Java Heap: 6408
Native Heap: 8284
Code: 2132
Stack: 56
Graphics: 0
Private Other: 1196
System: 5487
TOTAL: 23563 TOTAL SWAP (KB): 0
Objects
Views: 17 ViewRootImpl: 1
AppContexts: 6 Activities: 1
Assets: 2 AssetManagers: 0
Local Binders: 9 Proxy Binders: 28
Parcel memory: 2 Parcel count: 10
Death Recipients: 0 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
PSS表示应用程序占用的共享内存和私有内存的总和,该参数能比较精确地表示应用占用的内存大小。
如果dumpsys meminfo
不带包名,则会打印出系统整体所有应用的内存占用,并且还能看到应用的进程等级,对于系统性能调优用途很大。
top命令比dumpsys命令的优点是实时性高,缺点是无法查看到PSS的数值,要自己估算出实际的内存占用情况。top命令还能查看当前应用的cpu占用率及内存占用情况,这是top命令一个常用用途。
-s 6
参数含义是用RSS列进行排序,让内存占用最高的在最前边,默认排序是CPU占用率,应用在未操作时会排到很后,有可能会看不到当前的应用。
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Mem: 1.9G total, 1.7G used, 175M free, 23M buffers
Swap: 0 total, 0 used, 0 free, 968M cached
400%cpu 11%user 1%nice 8%sys 380%idle 0%iow 0%irq 0%sirq 0%host
PID USER PR NI VIRT [RES] SHR S %CPU %MEM TIME+ ARGS
515 system 18 -2 7.7G 295M 199M S 4.6 14.7 29:48.69 system_server
683 u0_a100 20 0 5.2G 205M 149M S 2.6 10.2 40:35.52 com.android.systemui
8036 system 20 0 4.6G 166M 116M S 0.0 8.2 0:03.29 com.android.settings
935 u0_a102 20 0 4.8G 163M 110M S 0.0 8.1 0:21.57 com.android.launcher3
176 root 20 0 5.1G 147M 122M S 0.0 7.3 0:02.27 zygote64
999 u0_a115 20 0 4.6G 139M 99M S 0.0 6.9 0:03.67 com.android.inputmethod.latin
3250 u0_a116 20 0 4.5G 131M 85M S 0.0 6.5 0:01.33 com.dfl.android.bestpractice
764 radio 20 0 4.9G 123M 94M S 0.3 6.1 2:24.95 com.android.phone
16167 u0_a56 20 0 4.4G 114M 79M S 0.0 5.7 0:00.23 com.android.documentsui
1136 u0_a99 20 0 4.5G 113M 78M S 0.0 5.6 0:00.48 com.android.dialer
23209 u0_a123 10 -10 4.4G 111M 78M S 0.0 5.5 0:00.35 com.example.myfirstapp
748 network_sta+ 20 0 4.6G 107M 80M S 0.0 5.3 0:25.21 com.android.networkstack
2515 system 20 0 4.5G 105M 63M S 0.0 5.2 0:00.71 com.android.keychain
1907 u0_a67 20 0 4.5G 102M 68M S 0.0 5.0 0:00.48 com.android.permissioncontroller
1942 u0_a65 20 0 4.4G 96M 62M S 0.0 4.8 0:00.39 com.android.providers.calendar
1311 radio 20 0 4.4G 94M 60M S 0.0 4.6 0:00.24 com.android.ims.rcsservice
838 u0_a58 20 0 4.5G 93M 67M S 0.0 4.6 0:00.62 android.ext.services
16269 u0_a54 20 0 4.4G 90M 57M S 0.0 4.5 0:00.06 com.android.mtp
1288 secure_elem+ 20 0 4.4G 90M 57M S 0.0 4.5 0:00.21 com.android.se
16209 u0_a64 20 0 4.4G 90M 56M S 0.0 4.4 0:00.04 com.android.externalstorage
16237 u0_a54 20 0 4.4G 90M 63M S 0.0 4.4 0:00.07 android.process.media
PSS的内存=RES(进程当前实际占用的物理大小)-SHR(共享内存大小)/共享进程数量,RES的内存值包含了和其他进程共享内存的数据,所以其值会比实际应用占用的内存值PSS要偏大。另外也可使用命令procrank可查看应用的内存占用排名。
该命令可查看到关于内存的详细信息,包含内存总大小及各个细分类型的内存大小,其中的CmaTotal与CmaFree是一个重要的参数,表示可分配的连续物理内存,如果cma的内存不足,会导致无法打开新界面或弹窗,或出现黑屏的问题。
MemTotal: 7708608 kB
MemFree: 125148 kB
MemAvailable: 2150096 kB
Buffers: 2096 kB
Cached: 1959024 kB
SwapCached: 31456 kB
Active: 1425944 kB
Inactive: 1842408 kB
Active(anon): 781092 kB
Inactive(anon): 797336 kB
Active(file): 644852 kB
Inactive(file): 1045072 kB
Unevictable: 193320 kB
Mlocked: 193320 kB
SwapTotal: 5767164 kB
SwapFree: 740944 kB
Dirty: 208 kB
Writeback: 0 kB
AnonPages: 1497100 kB
Mapped: 1086956 kB
Shmem: 84136 kB
KReclaimable: 639856 kB
Slab: 644596 kB
SReclaimable: 185208 kB
SUnreclaim: 459388 kB
KernelStack: 137728 kB
PageTables: 188484 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 9621468 kB
Committed_AS: 198069204 kB
VmallocTotal: 263061440 kB
VmallocUsed: 235160 kB
VmallocChunk: 0 kB
Percpu: 13568 kB
CmaTotal: 372736 kB
CmaFree: 0 kB
IonTotalCache: 178616 kB
IonTotalUsed: 428572 kB
GPUTotalUsed: 450368 kB
我手机打印出的CmaFree为0kb,但手机还是能正常使用,这一块与我的认识不太一样,只能推测为手机系统自已做过内存管理模块相关的修改。
该命令可以查看CPU的核心数,及架构信息。
Processor : AArch64 Processor rev 0 (aarch64)
processor : 0
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0xd
CPU part : 0x805
CPU revision : 14
processor : 1
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0xd
CPU part : 0x805
CPU revision : 14
...
processor : 7
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd0d
CPU revision : 0
Hardware : Qualcomm Technologies, Inc SM8250_AC
我手机的基本信息是64位8核cpu,高通芯片。
该命令会以M为单位,列出系统上所有目录及其分区,最主要用途是查看哪个分区占用了较大的存储。
Filesystem Size Used Avail Use% Mounted on
/dev/block/dm-15 650M 650M 0 100% /
tmpfs 3.6G 2.0M 3.6G 1% /dev
tmpfs 3.6G 24K 3.6G 1% /mnt
/dev/block/dm-16 1.0G 1.0G 0 100% /system_ext
/dev/block/dm-17 2.3M 2.3M 0 100% /product
overlay-overlay 3.4M 3.4M 0 100% /product/app
overlay-overlay 3.4M 3.4M 0 100% /product/priv-app
overlay-overlay 3.4M 3.4M 0 100% /product/lib64
overlay-overlay 3.4M 3.4M 0 100% /product/lib
overlay-overlay 3.4M 3.4M 0 100% /product/overlay
overlay 511M 511M 0 100% /product/etc/permissions
overlay 511M 511M 0 100% /product/framework
/dev/block/dm-18 930M 930M 0 100% /vendor
/dev/block/dm-19 237M 237M 0 100% /odm
/dev/block/dm-7 2.1G 2.1G 0 100% /my_stock
/dev/block/dm-12 1.0G 1.0G 0 100% /my_preload
/dev/block/dm-14 822M 822M 0 100% /my_bigball
/dev/block/dm-13 368K 368K 0 100% /my_manifest
tmpfs 3.6G 16K 3.6G 1% /apex
/dev/block/sda9 404M 40M 351M 11% /cache
/dev/block/dm-49 106G 103G 2.8G 98% /data
...
/dev/block/loop31 232K 116K 112K 51% /apex/com.android.scheduling@339990000
/dev/block/loop32 720K 692K 16K 98% /apex/com.android.sdkext@339990000
/dev/block/loop33 232K 80K 148K 36% /apex/com.android.ondevicepersonalization@339990000
/dev/fuse 106G 103G 2.8G 98% /storage/emulated
/data/media 106G 103G 2.8G 98% /storage/emulated/0/Android/data
如果想查看某个目录下哪个文件或目录占用的存储最大,可使用命令df -sh *
来查看,先进入指令的目录,再执行该指令。
3.5K ARDebug
12K Alarms
18G Android
59M AnkiChina
12K Audiobooks
201M BaiduNetdisk
15K Browser
3.5K ByteDownload
15K Ccb
231K ColorOS
2.7G DCIM
5.4M DingTalk
3.5M Documents
1.2G Download
...
该命令可查看到系统预置的一些属性值,有一些功能相关联的信息可以通过反射比较方便要从prop中取出。
[vendor.media.vpp.osie.enable]: [0]
[vendor.media.vpp.osie.internal.enable]: [1]
[vendor.media.vpp.osie.internal.version]: [osie2.0]
[vendor.media.vpp.sr.internal.enable]: [1]
[vendor.modem_dump_action]: [1]
[vendor.opengles.version]: [196610]
[vendor.oplus.dalvik.vm.heapgrowthlimit]: [384m]
[vendor.oplus.dalvik.vm.heapmaxfree]: [8m]
[vendor.oplus.dalvik.vm.heapminfree]: [512k]
[vendor.oplus.dalvik.vm.heapsize]: [512m]
[vendor.oplus.dalvik.vm.heapstartsize]: [16m]
[vendor.oplus.dalvik.vm.heaptargetutilization]: [0.75]
[vendor.oplus.sap.interface]: [wlan2]
[vendor.vidc.debug.level]: [1]
[vendor.vold.serialno]: []
[vold.fbe.decrypted]: [1]
[vold.has_adoptable]: [0]
[vold.has_compress]: [0]
[vold.has_quota]: [1]
[vold.has_reserved]: [1]
[vold.storage.prepared]: [1]
如果有root权限,还可以通过命令setprop key 值,修改参数的值。
查看设备的分辨率wm size
,
查看设备的dpiwm density
emulator64_arm64:/ $ wm size
Physical size: 1920x1080
$ wm density
Physical density: 160
该指令需要先执行su切换成root用户,适用于可进行root的设备。可用于验证白天黑夜模式快速切换下界面是否有异常
cmd uimode night yes
Night mode: yes
emulator64_arm64:/ # cmd uimode night no
Night mode: no
emulator64_arm64:/ # cmd uimode night auto
Night mode: auto
input支持的输入的类型有
input text 123
input keyevent 4
,返回back;3回到主页homeinput tap 100 100
,点击(100,100)对应的位置点input swipe 10 20 30 40
,从(10,20)坐标滑动到(30,40)input draganddrop 10 20 30 40
,从(10,20)坐标拖动到(30,40)input press 200 300
,按下(200,300)坐标,不会触发点击事件input roll 100 100
,向右滚动100像素,向下滚动100像素