android之常用adb

本文介绍了如何使用adb命令获取Android应用的内存使用情况,包括NativeHeap、Graphic、Code、DalvikHeap、PSS等信息,以及如何获取fps、fd数量、线程数、VSS、CPU使用等。此外,还提到了进程内存分类如VSS、RSS、PSS的含义和区别,并展示了如何统计和分析潜在的内存泄漏问题。
摘要由CSDN通过智能技术生成

目录:

内存

        获取Native Heap: dumpsys meminfo |grep "Native Heap"

        获取Graphic: dumpsys meminfo |grep "Graphic"

        获取Code: dumpsys meminfo |grep "Code"

        获取Dalvik Heap: dumpsys meminfo |grep "Dalvik Heap"

        获取PSS:dumpsys meminfo |grep "TOTAL PSS"

获取fps: dumpsys gfxinfo package framestats

统计fd数量 : su -c ls -l /proc/pid(对应具体应用进程id)/fd |wc -l

获取threads:cat /proc/pid(对应具体应用进程id)/status |grep -E "Threads:"

获取VSS: cat /proc/pid(对应具体应用进程id)/status |grep -E "VmSize:"

获取cpu: cat /proc/pid(对应具体应用进程id)/stat xxx

1、进程相关

1、根据包名获取进程信息

MB0 ~ % adb shell ps |grep com.tencent.wesing
u0_a166      13673   523 1793900 154960 0                   0 S com.tencent.wesing
u0_a166      13772   523 1545088  88804 0                   0 S com.tencent.wesing:service
u0_a166      13791   523 1591040 114568 0                   0 S com.tencent.wesing:push

        进阶1:打印包名字段 (awk默认以空格为分隔符)

MB0 ~ % adb shell ps |grep com.tencent.wesing | awk '{print $9}'
com.tencent.wesing
com.tencent.wesing:service
com.tencent.wesing:push

        进阶2:获取pid

MB0 ~ % adb shell ps |grep com.tencent.wesing$ | awk '{print $2}'
13673

注意:$通配符表示以前面的字符串结尾

1、ps内存相关

1、获取进程VSS虚拟内存大小

        adb shell ps命令中包含字段信息依次为USER、PID、PPID、VSZ、RSS、WCHAN、ADDR、S、 NAME。

        USER:当前进程的所有者;

        PID:当前进程的进程id,即process id

        PPID:当前进程的父进程id,即parent process id

        VSZ: 当前进程的VSS虚拟内存大小,单位为KB;

        RSS:当前进程实际占用的内存大小,单位为KB;

        WCHAN:进程正在睡眠的内核函数名称

        ADDR: 计算机中提供要从“存储器”中取出的下一个指令地址的寄存器

        S:当前进程状态,即stat

        NAME: 当前进程名称        

MB0 ~ % adb shell ps                         
USER           PID  PPID     VSZ    RSS WCHAN            ADDR S NAME                       
root             1     0   42820   2852 0                   0 S init
root             2     0       0      0 0                   0 S [kthreadd]
root             3     2       0      0 0                   0 S [ksoftirqd/0]
root             5     2       0      0 0                   0 S [kworker/0:0H]
root             7     2       0      0 0                   0 S [rcu_preempt]



MB0 ~ % adb shell ps |grep com.tencent.wesing
u0_a166      13673   523 1820116 147348 0                   0 R com.tencent.wesing
u0_a166      13772   523 1544592  89160 0                   0 S com.tencent.wesing:service
u0_a166      13791   523 1592212 113056 0                   0 S com.tencent.wesing:push

2、获取进程的PSS--共享内存按比例分配的内存大小

MB0 ~ % adb shell dumpsys meminfo com.tencent.wesing
Applications Memory Usage (in Kilobytes):
Uptime: 2434044009 Realtime: 3525696744

** MEMINFO in pid 13673 [com.tencent.wesing] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    37311    37292        0      101    53248    37858    15389
  Dalvik Heap    13937    13680        0        9    15570    13522     2048
 Dalvik Other     8867     8864        0        0                           
        Stack      108      108        0        0                           
       Ashmem        2        0        0        0                           
    Other dev      313        0      312        0                           
     .so mmap    10493      684     7652        1                           
    .jar mmap      930      928        0        0                           
    .apk mmap     2250      124      668        0                           
    .ttf mmap      102        0        0        0                           
    .dex mmap    36561       20    23772        0                           
    .oat mmap       65        0        0        0                           
    .art mmap     6389     6044       20        0                           
   Other mmap     3008        4     2088        0                           
    GL mtrack    13461    13461        0        0                           
      Unknown    20191    16224     3964        0                           
        TOTAL   154099    97433    38476      111    68818    51380    17437
 
 App Summary
                       Pss(KB)
                        ------
           Java Heap:    19744
         Native Heap:    37292
                Code:    33848
               Stack:      108
            Graphics:    13461
       Private Other:    31456
              System:    18190
 
               TOTAL:   154099       TOTAL SWAP PSS:      111
 
 Objects
               Views:     1171         ViewRootImpl:        1
         AppContexts:        7           Activities:        2
              Assets:       12        AssetManagers:        0
       Local Binders:       45        Proxy Binders:       54
       Parcel memory:       53         Parcel count:      212
    Death Recipients:        4      OpenSSL Sockets:       14
            WebViews:        0
 
 SQL
         MEMORY_USED:     3370
  PAGECACHE_OVERFLOW:     1679          MALLOC_SIZE:      117
 
 DATABASES
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       36            109      225/85/11  /data/user/0/com.tencent.wesing/databases/cfcd208495d565ef66e7dff9f98764da
         4     1200             85   5557/2886/25  /data/user/0/com.tencent.wesing/databases/113440aeb4556db734142f38baa73e9e
         4       28             84       776/27/7  /data/user/0/com.tencent.wesing/databases/rmonitor_db
         4      116            103     960/172/25  /data/user/0/com.tencent.wesing/databases/google_app_measurement.db
         4       16             28        23/24/2  /data/user/0/com.tencent.wesing/databases/c4ca4238a0b923820dcc509a6f75849b
         4       76            109         9/49/7  /data/user/0/com.tencent.wesing/databases/androidx.work.workdb
         4        8                         0/0/0    (attached) temp
         4       60            109       45/36/16  /data/user/0/com.tencent.wesing/databases/bugly_db_
         4       24             49       15/45/10  /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing
         4       24             46        17/41/3  /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing (3)
         4       24            100        53/34/9  /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing (2)
         4       24             49         5/24/4  /data/user/0/com.tencent.wesing/databases/anythink.db

        VSZ:(Virtual Set Size 虚拟耗用内存)指的是进程内存空间的大小,并不代表进程真正用到的内存,因为有些空间会仅在页表中挂个名,也就是说只是虚拟存在着,只有真正用到的时候内核才会把虚拟页面和真正的物理页面映射起来。比如,(malloc或mmap的调用),由于程序中并没有用到这些内存,没有物理内存被分配,也就不应算到进程的帐上。
        RSS:(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。

        Pss:(Proportional Set Size) /proc/[1-9]*/smaps 中的 Pss包含了进程的每一个内存映射的统计值,并把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。

通常情况下它们有着占用大小 VSS >= RSS >= PSS >= USS 的规律。先看下图:

在这里插入图片描述

① 基本内存耗用分类:

● VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

● RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)

● PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

● USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

说明:

a.一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

b.实际在统计查看某个进程内存占用情况的时候,看PSS是比较客观的

② 获取VSS和RSS:

命令:adb shell top -n 1 |findstr "packageinfo"

③ 获取PSS

命令:adb shell dumpsys meminfo pakagename

参考文章:

       adb中ps命令详解

        VSZ、RSS、Pss的区别和含义

        VSS、RSS、PSS、USS 内存使用分析(超详细)

        adb查看手机cpu使用率_通过 adb 命令获取手机应用性能数据 (CPU、内存、流量)

3、pm命令

1、获取app版本号

MB0 ~ % adb shell pm dump com.tencent.wesing | grep versionName| awk '{print $1}'
versionName=5.49.3.662

4、getprop获取设备信息

设备信息之android sdk版本号

MB0 ~ % adb shell getprop ro.build.version.release
9

设备信息之设备型号

MB0 ~ % adb shell getprop | grep model | awk  -F: 'NR==1{print}' | awk '{print $2,$3}'
[Redmi 6A]

5、获取句柄

        统计/proc/[pid]/fd目录下的fd数量(读取/proc/13673/fd目录需要root权限,所以手机需要刷机)。

ls -lt /proc/13673/fd | wc -l

        /proc/[pid]/fd 是一个目录,包含进程打开文件的情况。举例如下:

$ ls -lt /proc/2406/fd
 
lrwx------ 1 root root 64 Dec 24 09:39 77 -> socket:[44377722]
lrwx------ 1 root root 64 Dec 17 15:07 47 -> socket:[29482617]
lr-x------ 1 root root 64 Dec 12 20:18 0 -> pipe:[13282]
l-wx------ 1 root root 64 Dec 12 20:18 1 -> pipe:[13283]
lrwx------ 1 root root 64 Dec 12 20:18 10 -> socket:[12238218]
lrwx------ 1 root root 64 Dec 12 20:18 4 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Dec 12 20:18 40 -> socket:[19378614]

        目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符。
如果fd数量一直增长,可能存在内存泄漏风险。

         linux系统对每个进程都有fd的数量限制, android 同样也有,android 的限制是1024.

        当fd满了后,创建fd就会失败,并返回有些信息如:Too many open files

造成的原因

        1、file 未close

        2、HandlerThread 创建太多 且没退出,内部有looper、messageQueue,使用了cpp的looper,创建了epollfd和eventFd两个fd。

        3、java Thread 创建太多,可能需要虚拟机,创建JNIENV需要打开Fd失败

        4、InputChannel使用Ashmem匿名共享内存来传递数据,它由一个fd文件描述符指向,同时read端和write端各占用一个fd

binder:binder 创建需要使用fd, parcel 传递data有些也需要fd

shared memory进程间数据共享

native_handle_t :fd 的共享

参考文章

        查看内存fd是否泄露

        fd 的泄漏

6、获取进程开启的线程数量

cat /proc/13673/status |grep -E 'VmSize:|Threads:' 
VmSize:	 1804732 kB
Threads:	137

7、获取cpu时间

8、获取fps

adb shell dumpsys gfxinfo packagename

参考文章:

        【学习笔记】APP性能---用adb命令测试Android中APP的FPS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值