文章目录
- 官方查询地址
- 一、什么情况有使用adb命令诉求?
- 二、设备信息
- 2.1 查看安卓版本 返回9,10,11
- 2.2 获取系统api版本:返回28,29
- 2.3 查询内存信息
- 2.4 查询cpu信息
- 2.5 查询机型
- 2.6 屏幕相关
- 2.6.1 像素密度
- 2.6.2 分辨率
- 2.7 查询电池信息
- 三、分析性能常用命令
- 3.1 查看内存占用
- 3.2 查看cpu占用
- 3.3 根据包名查询pid(进程号)
- 四、开发者选项相关
- 4.1 ANR相关
- 不保留后台Activity
- 五、package相关信息
- 查看apk版本:
一、什么情况有使用adb命令诉求?
- Android开发已不仅限于手机
虽然Android Studio及其三方GUI插件已经很完备了,但是Android应用很广,手机只是一个应用场景,还有诸如:TV、手表、机车、或别的定制系统,可能无法使用GUI工具、USB插口等情况,可能是通过串口等方式直接连到对应的Android系统中,我们平时使用的adb shell xxx其实就是用的Android系统的一些命令。 - 命令行有时候更高效
- GUI工具可能无法覆盖到一些命令使用场景
- 可结合shell脚本编写更高效的脚本
举个例子,假如现在一个系统开机之后就立刻启动的app,比如Launcher(系统桌面,不一定是Android系统的那个Launcher,可能一些三方定制系统有自己做这个系统桌面。)这种应用,出现了系统刚启动时的性能裂化(卡顿、ANR、启动速度变慢等等),但启动之后过一段时间就恢复正常了。这种问题,其实一般都会推测是开机阶段系统负载比较重引起的。针对这种情况,我们想要通过AS-Profiler、Systrace等工具分析App在刚开机时整个系统的CPU、内存、IOWait等指标,目前是无法实现的(起码我觉得还做不到,有好的方式的大佬请不吝赐教~),这时候我们就可以结合shell脚本和top命令,让应用启动时就去执行这个shell脚本,打印top的结果到文件中(其实有些性能测试脚本也是这样做的),这样就能从宏观上筛查是不是自己应用CPU、内存占用过高,或者别的其他应用占用过高引起的。
- ADB idea插件:
- 跨端(Flutter开发)的AndroidADBTool
开源地址:https://github.com/EaniaHuui/android_tool
- GUI工具并不能满足所有的需求场景:比如查看内存、cpu信息,通过shell脚本输出内存、cpu占用、帧率曲线等。虽然有Profiler这种强大的工具,但是目前使用的情况,获取到的数据经常还存在误差。
注:adb shell命令本质上是对于Android系统的操作命令。
二、设备信息
2.1 查看安卓版本 返回9,10,11
adb shell getprop ro.build.version.release
2.2 获取系统api版本:返回28,29
adb shell getprop ro.build.version.sdk
2.3 查询内存信息
在linux系统中,/proc/目录下都会用文件的方式,存储着各种设备相关信息。比如:cpuinfo、meminfo、version(linux内核版本)等信息
adb shell cat /proc/meminfo
输出:
MemTotal: 5815012 kB //总的内存大小
MemFree: 424212 kB
MemAvailable: 3162140 kB //可用内存大小
Buffers: 232832 kB
Cached: 2057404 kB
SwapCached: 10700 kB
Active: 2610536 kB
Inactive: 690156 kB
Active(anon): 835188 kB
Inactive(anon): 309728 kB
Active(file): 1775348 kB
Inactive(file): 380428 kB
...
或者使用dumpsys meminfo命令:
adb shell dumpsys meminfo [packageName] //需要指定查看某个包名对应进程占用内存时,后面带上packageName即可
输出结果:
Applications Memory Usage (in Kilobytes):
Uptime: 179965454 Realtime: 2420253989
Total PSS by process:
253,766K: system (pid 1589)
252,549K: com.android.systemui (pid 3672 / activities)
238,455K: com.miui.home (pid 20309 / activities)
176,473K: com.tencent.mm (pid 21083)
145,484K: com.tencent.mm:push (pid 1625)
91,356K: com.iflytek.inputmethod.miui (pid 7621)
...
Total PSS by OOM adjustment:
432,299K: Native
49,474K: android.hardware.camera.provider@2.4-service (pid 653)
49,335K: surfaceflinger (pid 723)
29,461K: logd (pid 546)
22,543K: android.hardware.graphics.composer@2.1-service (pid 661)
17,958K: zygote (pid 611)
11,974K: webview_zygote (pid 3734)
10,159K: qcrild (pid 1119)
...
Total PSS by category:
530,002K: Native
288,069K: .dex mmap
227,496K: .art mmap
217,753K: Dalvik
153,504K: .so mmap
129,412K: .oat mmap
...
Total RAM: 5,815,012K (status normal) //总内存大小和/proc/meminfo中是一样的
Free RAM: 3,828,092K ( 387,360K cached pss + 2,426,516K cached kernel + 595,148K cached ion + 419,068K free)
Used RAM: 2,653,523K (2,112,671K used pss + 540,852K kernel)
Lost RAM: 1,028,308K
ZRAM: 93,492K physical used for 445,500K in swap (2,621,436K total swap)
Tuning: 256 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)
2.4 查询cpu信息
adb shell cat /proc/cpuinfo
可看到cpu是几核,厂商信息。
Processor : AArch64 Processor rev 12 (aarch64)
processor : 0
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 1
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 2
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 3
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 4
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 5
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 6
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
processor : 7
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
Hardware : Qualcomm Technologies, Inc SDM710
如上面是查看小米8SE的cpu信息,8核,高通的处理器。
2.5 查询机型
adb shell getprop ro.product.model
比如小米8SE输出:
MI 8 SE
2.6 屏幕相关
2.6.1 像素密度
adb shell wm density
2.6.2 分辨率
adb shell vm size
如果是修改像素密度,在上述命名后跟具体数值即可,设备界面上也会实时应用新的密度。
2.7 查询电池信息
adb shell dumpsys battery
三、分析性能常用命令
3.1 查看内存占用
adb shell dumpsys meminfo [packageName]
比如查看微信的内存信息:adb shell dumpsys meminfo com.tencent.mm
如下所示,该命令还能看到四大组件的数量,可用于分析Activity泄漏等性能问题。
dumpsys meminfo com.tencent.mm
Applications Memory Usage (in Kilobytes):
Uptime: 182816715 Realtime: 2423105250
** MEMINFO in pid 21083 [com.tencent.mm] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 34177 34144 0 15484 88064 68780 19283
Dalvik Heap 19662 19648 0 133 22771 11386 11385
Dalvik Other 8554 8552 0 253
Stack 84 84 0 24
Ashmem 2 0 0 0
Gfx dev 11528 11528 0 0
Other dev 36 0 36 0
.so mmap 5534 500 2120 4535
.jar mmap 32 28 4 336
.apk mmap 2353 0 884 0
.ttf mmap 623 0 152 0
.dex mmap 58593 0 57668 20
.oat mmap 2424 0 0 0
.art mmap 19564 19208 8 20240
Other mmap 805 4 280 0
EGL mtrack 27744 27744 0 0
GL mtrack 2644 2644 0 0
Unknown 3980 3980 0 2261
TOTAL 241625 128064 61152 43286 110835 80166 30668
App Summary
Pss(KB)
------
Java Heap: 38864
Native Heap: 34144
Code: 61356
Stack: 84
Graphics: 41916
Private Other: 12852
System: 52409
TOTAL: 241625 TOTAL SWAP PSS: 43286
Objects
Views: 518 ViewRootImpl: 2
AppContexts: 8 Activities: 2 //Activity数量能帮助分析内存泄漏
Assets: 11 AssetManagers: 0
Local Binders: 77 Proxy Binders: 146
Parcel memory: 37 Parcel count: 149
Death Recipients: 94 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 732
PAGECACHE_OVERFLOW: 228 MALLOC_SIZE: 117
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 96 109 11/79/13 /data/user/0/com.tencent.mm/no_backup/androidx.work.workdb
4 8 0/0/0 (attached) temp
4 96 34 2/15/3 /data/user/0/com.tencent.mm/no_backup/androidx.work.workdb (3)
4 28 56 167/36/6 /data/user/0/com.tencent.mm/databases/Scheduler.db
3.2 查看cpu占用
当app卡顿时,排除代码逻辑上的问题,关注cpu的占用也很重要,比如很多时候发生ANR时CPU占用率都挺高的。一般来说,内存占用高,系统频繁GC,也会间接导致CPU站用很高。
- 第一种:dumpsys cpuinfo,但不是及时刷新的,是一段时间的平均值
adb shell dumpsys cpuinfo
输出:
Load: 0.0 / 0.0 / 0.0
CPU usage from 248217ms to 184018ms ago (2022-09-03 13:58:59.522 to 2022-09-03 14:00:03.722):
47% 21083/com.tencent.mm: 34% user + 13% kernel / faults: 7825 minor
28% 723/surfaceflinger: 18% user + 10% kernel
13% 661/android.hardware.graphics.composer@2.1-service: 6.8% user + 6.2% kernel / faults: 44 minor
5.3% 239/crtc_commit:99: 0% user + 5.3% kernel
3.7% 246/kgsl_worker_thr: 0% user + 3.7% kernel
2.8% 27448/kworker/u16:4: 0% user + 2.8% kernel
2.5% 4533/irq/103-1436400: 0% user + 2.5% kernel
2.2% 240/crtc_event:99: 0% user + 2.2% kernel
1.9% 27447/kworker/u16:0: 0% user + 1.9% kernel
1.7% 1589/system_server: 0.8% user + 0.8% kernel / faults: 1071 minor
1.5% 27450/kworker/u16:12: 0% user + 1.5% kernel
0.7% 3672/com.android.systemui: 0.6% user + 0% kernel / faults: 317 minor
0.6% 668/android.hardware.sensors@1.0-service: 0.2% user + 0.3% kernel
0.5% 7/rcu_preempt: 0% user + 0.5% kernel
第二种:top命令,是linux系统的原生命令,是瞬时的,及时刷新的
adb shell top -n 1 //类似于windows的任务管理器,查看cpu占用情况
输出:
Tasks: 706 total, 1 running, 704 sleeping, 0 stopped, 0 zombie
Mem: 5815012k total, 5731852k used, 83160k free, 235892k buffers
Swap: 2621436k total, 422028k used, 2199408k free, 2200852k cached
800%cpu 69%user 0%nice 48%sys 676%idle 0%iow 3%irq 3%sirq 0%host
PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
21083 u0_a168 10 -10 4.9G 217M 186M S 51.7 3.8 26:28.20 com.tencent.mm
723 system -2 -8 2.0G 24M 18M S 31.0 0.4 53:30.95 surfaceflinger
27538 shell 20 0 11M 4.2M 3.2M R 24.1 0.0 0:00.08 top -n 1
661 system -3 -8 66M 7.7M 4.4M S 13.7 0.1 22:17.03 android.hardwar+
26139 root 20 0 0 0 0 S 6.8 0.0 0:20.59 [kworker/u16:5]
26567 root 20 0 0 0 0 S 3.4 0.0 0:01.54 [kworker/0:0]
4533 root RT 0 0 0 0 S 3.4 0.0 5:38.84 [irq/103-143640+
4448 root RT 0 0 0 0 S 3.4 0.0 8:47.64 [sugov:6]
1589 system 18 -2 4.8G 284M 284M S 3.4 4.9 143:57.82 system_server
246 root -3 0 0 0 0 S 3.4 0.0 6:46.47 [kgsl_worker_th+
239 root RT 0 0 0 0 S 3.4 0.0 31:17.51 [crtc_commit:99]
61 root 20 0 0 0 0 S 3.4 0.0 0:37.33 [rcuop/6]
27537 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:1H]
27536 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u16:9]
27535 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u16:6]
27534 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u16:2]
27512 root 20 0 0 0 0 S 0.0 0.0 0:00.02 [kworker/1:1]
27468 u0_a36 20 0 3.7G 101M 88M S 0.0 1.7 0:00.46 com.android.cam+
27467 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:2]
27460 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/2:1]
如上图可见,top命令能看到更多的信息:
- 总的cpu比例,上面的设备是8核,所以总共是800%
- 空闲cpu比例,idle这一列
- Task…:这一行显示目前进程的总量和进程状态,running/sleeping/stopped/zombie,特别注意:如果zombie这一列不是0,则指示可能存在僵尸进程。
- Mem…: 表示当前的物理内存
- Swap…:表示虚拟内存
- 800%cpu….这一行,显示CPU的整体负载,0%iow这一列代表的是I/OWait,通常系统变慢都是I/O产生的问题,需要关注这个选项占用的CPU资源
- PID: 进程id
- USRE:进程所属用户
- PR: Priority的缩写,进程优先级,越小越早被执行
- NI:Nice的缩写,越小越早被执行
- %CPU: CPU使用率
- %MEM: 内存使用率
- TIME+:CPU: 使用时间累加
3.3 根据包名查询pid(进程号)
adb shell pidof packag_name
举例:查询com.tencent.mm的进程号
四、开发者选项相关
4.1 ANR相关
// 将设置更改为显示对话框:
adb shell settings put global anr_show_background 1
// 将设置更改为不显示对话框:
adb shell settings put global anr_show_background 0
// 如果是系统应用,则使用以下的方式:
// 将设置更改为显示对话框:调试时ANR不会直接退出进程,而是弹出一个对话框让用户选择退出进程,还是等待。
settings put secure anr_show_background 1
// 将设置更改为显示对话框:调试时ANR会直接退出进程,导致debug中断
settings put secure anr_show_background 0
不保留后台Activity
开启:
adb shell settings put global always_finish_activities 1
关闭:
adb shell settings put global always_finish_activities 0