内存
获取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、根据包名获取进程信息
- 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、获取进程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查看手机cpu使用率_通过 adb 命令获取手机应用性能数据 (CPU、内存、流量)
1、获取app版本号
- MB0 ~ % adb shell pm dump com.tencent.wesing | grep versionName| awk '{print $1}'
- versionName=5.49.3.662
设备信息之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]
统计/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 的共享
参考文章:
- 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