安卓性能监控小工具

流量监控

  • 获取被测试App的UID:
    原理:执行adb Shell读取/data/system/packages.list,并通过apk的找到对应的UID
    例子:cat /data/system/packages.list | grep com.gift.android
    输出值:com.gift.android 10055 0 /data/data/com.gift.android default 1028,1015,1023,3003,3002,3001
    其中10055即为App的UID

  • 获得App的接收流量(tcp_rcv)
    原理:执行adb Shell读取/proc/uid_stat//tcp_rcv,其中为被测试App的UID
    例子:cat /proc/uid_stat/10055/tcp_rcv
    输出值:1566512
    1566512即为接收流量的值

  • 获得App的发送流量(tcp_snd)
    原理:执行adb Shell读取/proc/uid_stat//tcp_snd,其中为被测试App的UID
    例子:cat /proc/uid_stat/10055/tcp_snd
    输出值:486847
    486847即为发送流量的值

  • 总体的流量数值计算
    采集到前后两次流量数值后,即可计算得到某段时间内耗费的总流量。
    例子
    root@android:/ # cat /proc/uid_stat/10055/tcp_rcv
    1566512
    root@android:/ # cat /proc/uid_stat/10055/tcp_snd
    486847
    --- 在app上执行某些操作----
    root@android:/ # cat /proc/uid_stat/10055/tcp_rcv
    1978338
    root@android:/ # cat /proc/uid_stat/10055/tcp_snd
    548128
    计算:该端时间内消耗总流量 = (548128 + 1978338) - (486847 + 1566512) bytes

  • 其他流量测法,通过 tcpdump 抓包,再通过 wireshake 直接读取包信息来获得流量。

总内存和进程内存监控

  • 总内存获取
    原理:adb shell读取/proc/meminfo
    例子: cat /proc/meminfo
    MemFree: 560352 kB
    Buffers: 136576 kB
    Cached: 418460 kB
    Active: 626888 kB
    Inactive: 314720 kB
    Active(anon): 354828 kB
    Inactive(anon): 39584 kB
    Active(file): 272060 kB
    Inactive(file): 275136 kB
    Dirty: 52 kB
    Writeback: 0 kB
    Mapped: 135096 kB
    Slab: 23068 kB

  • 被测试App进程内存
    原理:adb shell执行 dumpsys meminfo 其中为被测进程的PID
    例子:dumpsys meminfo 15045
    | | Pss Total | Private Dirty | Private Clean | Swapped Dirty | Heap Size | Heap Alloc | Heap Free | | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | | Native Heap | 5061 | 5028 | 0 | 0 | 16480 | 13207 | 124 | | Dalvik Heap | 28780 | 40972 | 0 | 0 | 41156 | 40069 | 1087 |

总CPU和进程CPU监控

  • CPU获取
    原理:dumpsy meminfo取进程内存时额外CPU开销大,会导致dumpsys cpu不准;系统自带top命令单次获取数据时间长且精度不够,利用busybox获取CPU使用情况(在获取内存数据前先取CPU),执行adb Shell命令:busybox top -b -n 1
    例子:
    adb push busybox /data/local/tmp
    adb shell chmod 755 /data/local/tmp/busybox

当前时刻显示的Activity


原理:adb shell执行,dumpsys window w|grep mFocusedApp|busybox awk '{print $5}'|busybox tr -d '}'

当前时刻的时间


原理:adb shell执行,date +%Y/%m/%d" "%H:%M:%S

系统启动后运行时间


原理:adb shell执行,busybox awk -F. 'NR==1{print $1}' /proc/uptime 依此为基础来分析执行监控的时刻及准确的获取数据间隔