• android之常用adb


    目录:

    内存

            获取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、根据包名获取进程信息

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

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

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

            进阶2:获取pid

    1. MB0 ~ % adb shell ps |grep com.tencent.wesing$ | awk '{print $2}'
    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: 当前进程名称        

    1. MB0 ~ % adb shell ps
    2. USER PID PPID VSZ RSS WCHAN ADDR S NAME
    3. root 1 0 42820 2852 0 0 S init
    4. root 2 0 0 0 0 0 S [kthreadd]
    5. root 3 2 0 0 0 0 S [ksoftirqd/0]
    6. root 5 2 0 0 0 0 S [kworker/0:0H]
    7. root 7 2 0 0 0 0 S [rcu_preempt]
    8. MB0 ~ % adb shell ps |grep com.tencent.wesing
    9. u0_a166 13673 523 1820116 147348 0 0 R com.tencent.wesing
    10. u0_a166 13772 523 1544592 89160 0 0 S com.tencent.wesing:service
    11. u0_a166 13791 523 1592212 113056 0 0 S com.tencent.wesing:push

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

    1. MB0 ~ % adb shell dumpsys meminfo com.tencent.wesing
    2. Applications Memory Usage (in Kilobytes):
    3. Uptime: 2434044009 Realtime: 3525696744
    4. ** MEMINFO in pid 13673 [com.tencent.wesing] **
    5. Pss Private Private SwapPss Heap Heap Heap
    6. Total Dirty Clean Dirty Size Alloc Free
    7. ------ ------ ------ ------ ------ ------ ------
    8. Native Heap 37311 37292 0 101 53248 37858 15389
    9. Dalvik Heap 13937 13680 0 9 15570 13522 2048
    10. Dalvik Other 8867 8864 0 0
    11. Stack 108 108 0 0
    12. Ashmem 2 0 0 0
    13. Other dev 313 0 312 0
    14. .so mmap 10493 684 7652 1
    15. .jar mmap 930 928 0 0
    16. .apk mmap 2250 124 668 0
    17. .ttf mmap 102 0 0 0
    18. .dex mmap 36561 20 23772 0
    19. .oat mmap 65 0 0 0
    20. .art mmap 6389 6044 20 0
    21. Other mmap 3008 4 2088 0
    22. GL mtrack 13461 13461 0 0
    23. Unknown 20191 16224 3964 0
    24. TOTAL 154099 97433 38476 111 68818 51380 17437
    25. App Summary
    26. Pss(KB)
    27. ------
    28. Java Heap: 19744
    29. Native Heap: 37292
    30. Code: 33848
    31. Stack: 108
    32. Graphics: 13461
    33. Private Other: 31456
    34. System: 18190
    35. TOTAL: 154099 TOTAL SWAP PSS: 111
    36. Objects
    37. Views: 1171 ViewRootImpl: 1
    38. AppContexts: 7 Activities: 2
    39. Assets: 12 AssetManagers: 0
    40. Local Binders: 45 Proxy Binders: 54
    41. Parcel memory: 53 Parcel count: 212
    42. Death Recipients: 4 OpenSSL Sockets: 14
    43. WebViews: 0
    44. SQL
    45. MEMORY_USED: 3370
    46. PAGECACHE_OVERFLOW: 1679 MALLOC_SIZE: 117
    47. DATABASES
    48. pgsz dbsz Lookaside(b) cache Dbname
    49. 4 36 109 225/85/11 /data/user/0/com.tencent.wesing/databases/cfcd208495d565ef66e7dff9f98764da
    50. 4 1200 85 5557/2886/25 /data/user/0/com.tencent.wesing/databases/113440aeb4556db734142f38baa73e9e
    51. 4 28 84 776/27/7 /data/user/0/com.tencent.wesing/databases/rmonitor_db
    52. 4 116 103 960/172/25 /data/user/0/com.tencent.wesing/databases/google_app_measurement.db
    53. 4 16 28 23/24/2 /data/user/0/com.tencent.wesing/databases/c4ca4238a0b923820dcc509a6f75849b
    54. 4 76 109 9/49/7 /data/user/0/com.tencent.wesing/databases/androidx.work.workdb
    55. 4 8 0/0/0 (attached) temp
    56. 4 60 109 45/36/16 /data/user/0/com.tencent.wesing/databases/bugly_db_
    57. 4 24 49 15/45/10 /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing
    58. 4 24 46 17/41/3 /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing (3)
    59. 4 24 100 53/34/9 /data/user/0/com.tencent.wesing/databases/beacon_db_com.tencent.wesing (2)
    60. 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版本号

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

    4、getprop获取设备信息

    设备信息之android sdk版本号

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

    设备信息之设备型号

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

    5、获取句柄

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

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

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

    1. $ ls -lt /proc/2406/fd
    2.  
    3. lrwx------ 1 root root 64 Dec 24 09:39 77 -> socket:[44377722]
    4. lrwx------ 1 root root 64 Dec 17 15:07 47 -> socket:[29482617]
    5. lr-x------ 1 root root 64 Dec 12 20:18 0 -> pipe:[13282]
    6. l-wx------ 1 root root 64 Dec 12 20:18 1 -> pipe:[13283]
    7. lrwx------ 1 root root 64 Dec 12 20:18 10 -> socket:[12238218]
    8. lrwx------ 1 root root 64 Dec 12 20:18 4 -> anon_inode:[eventpoll]
    9. 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、获取进程开启的线程数量

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

    7、获取cpu时间

    8、获取fps

    adb shell dumpsys gfxinfo packagename

    参考文章:

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

  • 相关阅读:
    Java并发-为什么主线程结束了,程序却没有关闭呢?
    卷积神经网络相比循环神经网络具有哪些特征
    电机行业mes系统解决方案
    Pytest测试框架一键动态切换环境思路及方案
    Apple - Core Image
    排查Linux服务器是否被入侵步骤
    架构每日一学 15:想要提升协作效率,必须先统一语义
    数据结构--单链表操作
    分享im即时通讯开发之WebSocket:概念、原理、易错常识
    Redis cluster集群搭建
  • 原文地址:https://blog.csdn.net/liuqinhou/article/details/126094367