性能优化常用到的adb技巧

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的进程号
image.png
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 

效果如下:


image.png

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 /.

你可能感兴趣的:(性能优化常用到的adb技巧)