adb命令是安卓开发经常会用到的命令之一,熟悉adb命令使用,往往能让我们开发达到事半功倍的效果。
结论
1.dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大;
2.procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;
3.cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况;
4.free适用场景: 只查看系统的可用内存;
5.showmap适用场景: 查看进程的虚拟地址空间的内存分配情况;
6.vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;
使用场景
1. 获取设备对进程限制
在低版本不限制,高版本已不可用命令:
adb shell cat /system/build.prop
在7.0系统上还可用,9.0、10.0均会提示没有权限,如下,即使添加sudo也没用。
zhouhao@zhouhaodeMacBook-Pro ~ % sudo adb shell cat /system/build.prop
Password:
cat: /system/build.prop: Permission denied
那我们想看当前设备的为每个进程分配了多少初始大小,最大占用内存大小,及开启最大内存申请后的极限大小呢?
查看单个应用程序最大内存限制的指令:
adb shell getprop|grep heapgrowthlimit
应用启动后分配的初始内存,这个值是厂商定制,在系统启动时候可以设置参数控制,
adb shell getprop|grep dalvik.vm.heapstartsize
单个 java 虚拟机最大的内存限制
adb shell getprop|grep dalvik.vm.heapsize
上面3条命令的结果如下,目前使用设备是华为P30pro,我们拿到这个结果可以做什么?
1.我们可以获取当前设备上的应用常规内存的限制,比如我现在是384M,当在开发过程中,超过这个值就很可能发生OOM;
2.manifest中设置了largeHeap=true之后,可以使用的最大内存值,但是Android官方建议应该努力减少内存的使用,最好是回收、复用 而不是去更大申请,因为越大,每次GC耗时更多,性能会下降。
zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep heapgrowthlimit
[dalvik.vm.heapgrowthlimit]: [384m]
zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep dalvik.vm.heapstartsize
[dalvik.vm.heapstartsize]: [8m]
zhouhao@zhouhaodeMacBook-Pro ~ % adb shell getprop|grep dalvik.vm.heapsize
[dalvik.vm.heapsize]: [512m]
当然我们还可以使用以下方式在代码中获取:
ActivityManager am = (ActivityManager)MoEnvironment.getInstance().getContext().getSystemService(Context.ACTIVITY_SERVICE);
am.getMemoryClass()
2.安卓对前后台是否可见对应用也有明确的划分,如果你的APP切到后台,并且不可见了,那么它会系统杀掉的概率也就大得多,使用ADB也能轻松查看到等级!
步骤1:先执行这个找到你自己APP对于的PID,
adb shell top
步骤2:执行这个命令可以查看,连上你的手机,试试切前台,切后台看看,当然这个数值越大,越容易被干掉。我个人理解有点像赏金猎人一样!
oom_adj 【-16 到15 】 数字越小越不容易被杀, AMS 中 oom_scope_adj -1000。1000
adb shell
cat /proc/29251/oom_adj //其中29251就是步骤1找到的对于的APP的进程号
3.查看某个进程的线程数,分析你的APP线程是否合理
在进入adb shell后可以执行ps命令 ,查看,之前我们的项目150M的大小,不管是自身的业务,还是第三方的业务肯定涉及到很多的线程、线程池,我们之前线上经常出现OOM,很多时候就是我们线程数过多,因为华为手机是单个进程的线程数也是有限制,毕竟这个线程资源是珍惜的。
执行以下命令,能看到你执行的进程里面到底有哪些线程在跑:
比如pool- 开头的就是线程池创建的,包括了binder的 Glide 的,以及网络ok的等等;
之前的项目就遇到一个比较诡异的问题,最终通过这种方式定位到第三方的每个请求,开了一个线程,下面两个还是有点区别。
列出了由进程号为的进程创建的所有线程。
$ ps -T -p
要让top输出某个特定进程并检查该进程内运行的线程状况
$ top -H -p
当然监控线程肯定不止这种方式,我这里大致提下:还可以使用AS自带的profiler,运行起来后点进GPU,里面左边一栏就能显示,缺点是没有排序!
HWCLT:/ $ ps -T -p 29251
USER PID TID PPID VSZ RSS WCHAN ADDR S CMD
u0_a1199 29251 29251 623 2688620 253520 0 0 S .paic.mo.+
u0_a1199 29251 29258 623 2688620 253520 0 0 S Jit threa+
u0_a1199 29251 29266 623 2688620 253520 0 0 S Signal Ca+
u0_a1199 29251 29268 623 2688620 253520 0 0 S HeapTaskD+
u0_a1199 29251 29269 623 2688620 253520 0 0 S Reference+
u0_a1199 29251 29270 623 2688620 253520 0 0 S Finalizer+
u0_a1199 29251 29271 623 2688620 253520 0 0 S Finalizer+
u0_a1199 29251 29273 623 2688620 253520 0 0 S Binder:29+
u0_a1199 29251 29274 623 2688620 253520 0 0 S Binder:29+
u0_a1199 29251 29282 623 2688620 253520 0 0 S Profile S+
u0_a1199 29251 29283 623 2688620 253520 0 0 S .paic.mo.+
u0_a1199 29251 29287 623 2688620 253520 0 0 S .paic.mo.+
u0_a1199 29251 29288 623 2688620 253520 0 0 S .paic.mo.+
u0_a1199 29251 29296 623 2688620 253520 0 0 S Thread-2
u0_a1199 29251 29299 623 2688620 253520 0 0 S DB_Thread
u0_a1199 29251 29301 623 2688620 253520 0 0 S PALog-Wri+
u0_a1199 29251 29302 623 2688620 253520 0 0 S PALog-Exe+
u0_a1199 29251 29305 623 2688620 253520 0 0 S .paic.mo.+
u0_a1199 29251 29306 623 2688620 253520 0 0 S Binder:29+
u0_a1199 29251 29310 623 2688620 253520 0 0 S queued-wo+
u0_a1199 29251 29313 623 2688620 253520 0 0 S
...省略些
4. 查看内存、内存泄漏
我们也可以进入adb shell ,然后执行 dumpsys meminfo可以看到下面的信息,我删除了很多,太多了,重点看下这些:
zhouhao@zhouhaodeMacBook-Pro ~ % adb shell
HWCLT:/ $ dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 87567669 Realtime: 124091566
Total PSS by process:
497,445K: com.paic.mo.client (pid 29251 / activities)
410,785K: com.tencent.mm (pid 7479 / activities)
384,717K: com.android.systemui (pid 2725)
356,569K: system (pid 1460)
285,256K: [email protected] (pid 644)
209,319K: com.paic.mo.client:push (pid 29388)
202,098K: com.paic.mo.client:QALSERVICE (pid 919)
202,073K: com.paic.mo.client:livepush (pid 29694)
178,759K: com.tencent.mm (pid 23493)
。。。。
我们直接执行包名看吧:
解释下属性:
HWCLT:/ $ dumpsys meminfo --package com.paic.mo.client
Applications Memory Usage (in Kilobytes):
Uptime: 88252204 Realtime: 124776101
** MEMINFO in pid 919 [com.paic.mo.client:QALSERVICE] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 57727 57688 0 96 88576 85415 3160
Dalvik Heap 1408 1152 0 41 3548 1500 2048
Dalvik Other 136213 136208 0 6
Stack 40 40 0 0
Other dev 4 0 4 0
.so mmap 345 104 0 86
.jar mmap 81 0 0 0
.dex mmap 8 8 0 0
.oat mmap 248 0 0 0
.art mmap 1800 916 0 242
Other mmap 2205 2196 0 0
Unknown 1602 1572 0 13
TOTAL 202165 199884 4 484 92124 86915 5208
App Summary
Pss(KB)
------
Java Heap: 2068
Native Heap: 57688
Code: 112
Stack: 40
Graphics: 0
Private Other: 139980
System: 2277
TOTAL: 202165 TOTAL SWAP PSS: 484
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 4 Activities: 0
Assets: 7 AssetManagers: 0
Local Binders: 6 Proxy Binders: 24
Parcel memory: 7 Parcel count: 30
Death Recipients: 0 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 155
PAGECACHE_OVERFLOW: 19 MALLOC_SIZE: 117
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 20 32 1/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db
** MEMINFO in pid 29388 [com.paic.mo.client:push] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 5054 5012 0 55680 92672 88658 4013
Dalvik Heap 2327 2104 0 57 4387 2339 2048
Dalvik Other 19845 19844 0 117393
Stack 32 32 0 16
Ashmem 0 0 0 0
Other dev 4 0 4 0
.so mmap 501 36 4 141
.jar mmap 158 0 0 0
.dex mmap 0 0 0 8
.oat mmap 548 0 8 0
.art mmap 1894 996 0 236
Other mmap 221 88 8 2176
Unknown 593 564 0 1293
TOTAL 208177 28676 24 177000 97059 90997 6061
App Summary
Pss(KB)
------
Java Heap: 3100
Native Heap: 5012
Code: 48
Stack: 32
Graphics: 0
Private Other: 20508
System: 179477
TOTAL: 208177 TOTAL SWAP PSS: 177000
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 6 Activities: 0
Assets: 7 AssetManagers: 0
Local Binders: 13 Proxy Binders: 29
Parcel memory: 13 Parcel count: 52
Death Recipients: 1 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 642
PAGECACHE_OVERFLOW: 93 MALLOC_SIZE: 117
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 32 63 5717/25/8 /data/user/0/com.paic.mo.client/databases/paim_push_service.db
4 28 31 82/20/3 /data/user/0/com.paic.mo.client/databases/data_collect.db
4 28 38 25/21/4 /data/user/0/com.paic.mo.client/databases/mpush.db
4 20 32 87/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db
** MEMINFO in pid 29694 [com.paic.mo.client:livepush] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 1187 1156 0 56755 88576 85707 2868
Dalvik Heap 1568 1316 0 41 3704 1656 2048
Dalvik Other 21782 21780 0 114721
Stack 16 16 0 20
Other dev 4 0 4 0
.so mmap 257 24 0 149
.jar mmap 68 0 0 0
.dex mmap 0 0 0 8
.oat mmap 280 0 0 0
.art mmap 1692 816 0 326
Other mmap 49 48 0 2176
Unknown 308 280 0 1333
TOTAL 202740 25436 4 175529 92280 87363 4916
App Summary
Pss(KB)
------
Java Heap: 2132
Native Heap: 1156
Code: 24
Stack: 16
Graphics: 0
Private Other: 22112
System: 177300
TOTAL: 202740 TOTAL SWAP PSS: 175529
Objects
Views: 1 ViewRootImpl: 0
AppContexts: 4 Activities: 0
Assets: 7 AssetManagers: 0
Local Binders: 10 Proxy Binders: 24
Parcel memory: 8 Parcel count: 34
Death Recipients: 1 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 312
PAGECACHE_OVERFLOW: 38 MALLOC_SIZE: 117
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 32 42 64/22/5 /data/user/0/com.paic.mo.client/databases/live_im_push_service.db
4 20 32 1/19/2 /data/user/0/com.paic.mo.client/databases/aladdin.db
** MEMINFO in pid 29251 [com.paic.mo.client] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 70996 70920 0 179444 356864 275747 81116
Dalvik Heap 18483 18280 0 268 24837 18628 6209
Dalvik Other 46449 46448 0 102641
Stack 44 44 0 240
Ashmem 4 4 0 0
Other dev 49 12 36 0
.so mmap 3289 1248 1160 2384
.jar mmap 381 0 32 0
.apk mmap 738 24 68 128
.dex mmap 1234 1188 36 5424
.oat mmap 1540 0 8 0
.art mmap 3557 2584 0 193
Other mmap 2050 772 188 2176
GL mtrack 30848 30848 0 0
Unknown 10215 10208 0 13498
TOTAL 496273 182580 1528 306396 381701 294375 87325
App Summary
Pss(KB)
------
Java Heap: 20864
Native Heap: 70920
Code: 3764
Stack: 44
Graphics: 30848
Private Other: 57668
System: 312165
TOTAL: 496273 TOTAL SWAP PSS: 306396
Objects
Views: 1063 ViewRootImpl: 2
AppContexts: 15 Activities: 3
Assets: 12 AssetManagers: 0
Local Binders: 111 Proxy Binders: 51
Parcel memory: 69 Parcel count: 285
Death Recipients: 2 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 7721
PAGECACHE_OVERFLOW: 3951 MALLOC_SIZE: 117
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 32 65 1155/25/8 /data/user/0/com.paic.mo.client/databases/paim_push_service.db
4 28 107 359/67/13 /data/user/0/com.paic.mo.client/files/SkyEyeHRXskyEye.db
4 36 30 3/23/2 /data/user/0/com.paic.mo.client/databases/pa_b_permission.db
4 36 109 173/54/24 /data/user/0/com.paic.mo.client/databases/tes_db
4 20 81 2/25/5 :memory:
4 28 78 452/24/7 /data/user/0/com.paic.mo.client/databases/data_collect.db
4 44 24 0/27/2 /data/user/0/com.paic.mo.client/databases/pajk_hm_run_room.db
4 12 0/0/0 (attached) temp
4 44 46 1/16/2 /data/user/0/com.paic.mo.client/databases/pajk_hm_run_room.db (2)
4 36 30 11/25/2 /data/user/0/com.paic.mo.client/databases/group_meeting.db
4 28 32 8/20/3 /data/user/0/com.paic.mo.client/databases/mpush.db
4 1904 109 4833/193/25 /data/user/0/com.paic.mo.client/databases/ims.db
4 72 36 3/23/4 /data/user/0/com.paic.mo.client/databases/hrxapp
4 24 33 3/26/4 /data/user/0/com.paic.mo.client/databases/tz_http_cookie.db
4 24 60 3/19/4 /data/user/0/com.paic.mo.client/databases/tz_http_cookie.db (2)
4 2960 109 1107/423/25 /data/user/0/com.paic.mo.client/databases/user_db_GEYDCMBQGAYDAMBSHE3TOOJYGUZA====.db
4 28 108 108/70/16 /data/user/0/com.paic.mo.client/files/SkyEyeskyEye.db
4 32 42 66/22/5 /data/user/0/com.paic.mo.client/databases/live_im_push_service.db
4 20 28 5/19/2 /data/user/0/com.paic.mo.client/databases/account_kick.db
4 20 41 17/21/4 /data/user/0/com.paic.mo.client/databases/aladdin.db
4 24 42 14/51/7 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client
4 24 33 2/17/2 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client (4)
4 24 58 26/19/5 /data/user/0/com.paic.mo.client/databases/tbsbeacon_db_com.paic.mo.client (3)
4 60 109 64/30/13 /data/user/0/com.paic.mo.client/databases/bugly_db_
HWCLT:/ $
1.上面会显示你APP的所有进程的数据,一般我们逐个分析;一般关注 DalvikHeap 总的, Dirty 清空可以释放多少 Heap size 堆上用了多少, 剩下多少
一些不是那么重要的
1.查看当前手机内存大小,比如我买的手机是6G内存的,可用的780M,不够了总有应用会被回收的!
adb shell cat /proc/meminfo
效果如下:
2.启动activity
adb shell am start -n /.
3、获得应用的启动时间,可以很方便地获取应用的启动时间
adb shell am start -W /.
4.日志相关:
adb logcat > c:\test.log //将日志保存到文件test.log
5.数据库相关
数据库的操作和今天的主题关系不大,增删改查操作不再列举。但是平时的开发过程中只是查看数据库中某个表或者某个字段,也无需每次都pull出来之后再查看,用命令行会更加方便快捷,进入到test.db的目录后,运行如下命令
sqlite3 test.db
6.查看手机sdk版本
adb shell getprop | grep version
7、查看手机型号信息
adb shell getprop | grep product
运行此命令之后,能看到product,board,brand和cpu等等的型号
8.查看屏幕分辨率
zhouhao@zhouhaodeMacBook-Pro ~ % adb shell wm size
Physical size: 1080x2240
9.获取单个应用的电量消耗信息
adb shell dumpsys batterystats > > xxx.txt
这个一般用的少,还是要用adb bugreport 然后使用google 的battery histogram分析
10、获得应用的启动时间,可以很方便地获取应用的启动时间
adb shell am start -W /.