• android基于adb的性能测试


    应用CPU、内存、点亮、流量等数据,是应用测试的重要性能指标。本次以UC浏览器为例。
    当前app测试中,每个正式版本都会专门做一轮性能测试,测试数据包括:

    • 1小时内存数据
    • 1小时CPU数据
    • 24小时电量数据

    1.内存

    调用dumpsys命令,获取数据后,再进行数据处理。

    1.1 测试前的准备工作:

    内存、CPU测试前,手机环境需要为纯净的系统,避免其他干扰,需要删除无关的应用,只安装待测的app。建议手机重置

    1.2 获取app信息

    #获取包名:执行下一行命令后,进入app
    adb shell am monitor
    #获取当前应用的进程
    adb shell ps|grep com.UCMobile
    

    结果如下:

    u0_a227      30023   620 2464956 352744 0                   0 S com.UCMobile
    u0_a227      30195   620 1901864  78448 0                   0 S com.UCMobile:SearchBackgroundProcess
    u0_a227      30258   620 1910232  82752 0                   0 S com.UCMobile:MediaPlayerService
    u0_a227      30425   620 1909840  86436 0                   0 S com.UCMobile:push
    u0_a227      30475   620 1894068  77416 0                   0 S com.UCMobile:game
    u0_a227      30558   620 1878216  70328 0                   0 R com.UCMobile:DownloadService
    u0_a227      30583   620 1820128  55784 0                   0 R com.UCMobile:wificore
    u0_a227      30637   620 1820128  55824 0                   0 R com.UCMobile:ppappstore
    

    1.3 按进程或包名查看内存占用

    adb shell dumpsys meminfo com.UCMobile
    

    原文:https://blog.csdn.net/bigconvience/article/details/35553983
    重点关注如下几个字段:
    (1) Native/Dalvik 的 Heap 信息
    具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
    参数含义:
    dalvik : dalvik使用的内存
    native : native堆上的内存,指CC++堆的内存(android 3.0以后bitmap就是放在这儿)
    other : 除了dalvik和native的内存,包含CC++非堆内存······
    Pss : 该内存指将共享内存按比例分配到使用了共享内存的进程
    allocated : 已使用的内存
    free : 空闲的内存
    private dirty : 非共享,又不能被换页出去的内存(比如linux系统中为了提高分配内存速度而缓冲的小对象,即使你的进程已经退出,该内存也不会被释放)
    share dirty : 共享,但有不能被换页出去的内存

    (2) Total 的 PSS 信息
    这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

    1.4 编写脚本grabMem.sh,每隔一段时间获取应用和进程的占用的内存。

    #!/bin/sh
    #传入2个参数。第1个参数用于指定文件的前缀,便于区分
    #第2个参数用于多设备时,指定设备
    for i in `seq 1 5400`;do
    	if [[ $2 == "" ]];then
    		adb shell dumpsys meminfo com.UCMobile > $1_mem_package.text
    		adb shell dumpsys meminfo com.UCMobile:SearchBackgroundProcess > $1_mem_package_SearchBackgroundProcess.text
    		adb shell dumpsys meminfo com.UCMobile:MediaPlayerService > $1_mem_package_MediaPlayerService.text
    		adb shell dumpsys meminfo com.UCMobile:push > $1_mem_package_push.text
    		adb shell dumpsys meminfo com.UCMobile:game > $1_mem_package_game.text
    		adb shell dumpsys meminfo com.UCMobile:DownloadService > $1_mem_package_DownloadService.text
    		adb shell dumpsys meminfo com.UCMobile:wificore > $1_mem_package_wificore.text
    		adb shell dumpsys meminfo com.UCMobile:ppappstore > $1_mem_package_ppappstore.text
    	else
    		adb -s $2 shell dumpsys meminfo com.UCMobile > $1_mem_package.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:SearchBackgroundProcess > $1_mem_package_SearchBackgroundProcess.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:MediaPlayerService > $1_mem_package_MediaPlayerService.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:push > $1_mem_package_push.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:game > $1_mem_package_game.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:DownloadService > $1_mem_package_DownloadService.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:wificore > $1_mem_package_wificore.text
    		adb -s $2 shell dumpsys meminfo com.UCMobile:ppappstore > $1_mem_package_ppappstore.text
    	fi
    	sleep 1
    done
    

    1.5 步骤要点:

    • 1.设备链接电脑,确保应用已安装
    • 2.电脑上启动原始数据手机脚本./grabMem.sh version

    2. cpu

    https://blog.csdn.net/houzhizhen/article/details/79474427

    pid: 进程ID. √
    comm: task_struct结构体的进程名 √
    state: 进程状态, 此处为S 
    ppid: 父进程ID (父进程是指通过fork方式,通过clone并非父进程) 
    pgrp:进程组ID 
    session:进程会话组ID 
    tty_nr:当前进程的tty终点设备号 
    tpgid:控制进程终端的前台进程号 
    flags:进程标识位,定义在include/linux/sched.h中的PF_*, 此处等于1077952832 
    minflt: 次要缺页中断的次数,即无需从磁盘加载内存页. 比如COW和匿名页 
    cminflt:当前进程等待子进程的minflt 
    majflt:主要缺页中断的次数,需要从磁盘加载内存页. 比如map文件 
    majflt:当前进程等待子进程的majflt 
    utime: 该进程处于用户态的时间,单位jiffies,此处等于166114 √
    stime: 该进程处于内核态的时间,单位jiffies,此处等于129684 √
    cutime:当前进程等待子进程的utime √
    cstime: 当前进程等待子进程的utime √
    priority: 进程优先级, 此次等于10. 
    nice: nice值,取值范围[19, -20],此处等于-10 
    num_threads: 线程个数, 此处等于221 
    itrealvalue: 该字段已废弃,恒等于0 
    starttime:自系统启动后的进程创建时间,单位jiffies,此处等于2284 
    vsize:进程的虚拟内存大小,单位为bytes 
    rss: 进程独占内存+共享库,单位pages,此处等于93087 
    rsslim: rss大小上限 
    说明:
    
    第10~17行主要是随着时间而改变的量; 
    内核时间单位,sysconf(_SC_CLK_TCK)一般地定义为jiffies(一般地等于10ms) 
    starttime: 此值单位为jiffies, 结合/proc/stat的btime,可知道每一个线程启动的时间点 
    1500827856 + 2284/100 = 1500827856, 转换成北京时间为2017/7/24 0:37:58 
    第四行数据很少使用,只说一下该行第7至9个数的含义:
    
    signal:即将要处理的信号,十进制,此处等于6660 
    blocked:阻塞的信号,十进制 
    sigignore:被忽略的信号,十进制,此处等于36088
    
    #进程的cpu,只要关注utime,stime,cutime,cstime4列数值即可
    adb shell cat /proc/23183/stat
    #总的CPU,除了idle的不获取,其他的全部获取
    adb shell cat /proc/stat|head -n 1
    

    cpu.shell

    #!/bin/sh
    for i in `seq 1 10`;do
    	echo "pid,process,uesr time,kernel time,cutime,cstime"
    	for pid in `adb shell ps|grep com.UCMobile|awk '{print $2}'`;do
    		adb shell cat /proc/${pid}/stat |awk '{print $1,$2,$14,$15,$17,$17}'|sed 's/ /,/g'
    	done
    	echo 'proc/stats,user,nice,system,iowait,irq,softirq,steal,guest,guest_nice'
    	adb shell cat /proc/stat|head -n 1|awk '{print $1,$2,$3,$4,$6,$7.$8,$9,$10,$11}'|sed 's/ /,/g'
    	sleep 1
    done
    

    sh cpu.sh > cpu.csv
    将结果导入Excel表格中,应用的CPU差值除以CPU的总值,即可获取CPU的占用率

    3.电量

    4.应用启动时间

    #获取应用启动activity
    adb shell dumpsys activity activities |grep intent|grep --color com.UCMobile
    #停止应用
    adb shell am force-stop com.UCMobile
    #观察日志
    adb logcat -s ActivityManager
    #启动应用
    adb shell am start -n com.UCMobile/com.uc.browser.InnerUCMobile
    #在手动启动对比下
    

    5.adb采集流量数据

    新的安卓系统已经没有uid_stat目录,这个方法过时了

    adb shell cat /proc/uid_stat/UID/tcp_rcv
    adb shell cat /proc/uid_stat/UID/tcp_snd
    

    6.参考:

    https://blog.csdn.net/bigconvience/article/details/35553983
    https://blog.csdn.net/houzhizhen/article/details/79474427
    https://www.jianshu.com/p/6c0cfc25b038

  • 相关阅读:
    flask 返回json数据
    flask 中文乱码
    flask 参数校验
    AOP集成防止连续多次点击问题
    关于横竖屏切换导致的Activity重建问题
    Flutter工程无法找到Android真机或Android模拟器
    Failed to find configured root that contains
    Unable to resolve dependency问题解决
    双重ScrollView,RecyclerView联动实例
    RecyclerView联动滑动失败
  • 原文地址:https://www.cnblogs.com/csj2018/p/9917142.html
Copyright © 2020-2023  润新知