Android APP功用及专项测验

发表于:2019-06-17来历:不知道作者:@defias点击数: 标签:
Android功用测验分为两类:1、一类为rom版别(体系)的功用测验2、一类为运用app的功用测验

Android篇

 

1. 功用测验

  • Android功用测验分为两类:
    1、一类为rom版别(体系)的功用测验
    2、一类为运用app的功用测验

  • Android的app功用测验包括的测验项比方:
    1、资源耗费
    2、内存走漏
    3、电量功耗
    4、耗时
    5、网络流量耗费
    6、移动终端相关资源利用率
    7、帧率
    8、烘托等等....

  • 东西:
    (东西的原理都是依据调用android底层的一些api来获取到测验所用到的值)GT等

  • 测验办法
    1、规划场景 :手艺或自动化场景
    2、获取数据:可获取的数据包括:内存、cpu、电量功耗、hprof(内存走漏剖析文件)、呼应时刻等等。。。。合作手艺或自动化场景来获取数据(最很多取几回并且每次合作不同的设备看平均值)作为最终的比照剖析
    3、成果剖析 :拿到数据后剖析哪些模块的数据反常再去Check code定位问题的原因

  • Android体系的几种场景状况:
    1、闲暇状况: 指翻开运用后,点击home键让运用后台运转,此刻运用处于的状况叫做闲暇
    2、中等规范和满规范状况:中等规范和满规范指的是对运用的操作时刻的距离犬牙交错,中等规范时刻较长,满规范时刻较短

 

1.1 内存篇

布景常识:
C/C++恳求的内存空间在native heap中,而java恳求的内存空间则在dalvik heap中。这个是由于Android体系对dalvik的vmheapsize作了硬性约束,当java进程恳求的java空间超越阈值时,就会抛出OOM反常(这个阈值可所以48M、24M、16M等,视机型而定),能够经过adb shell getprop | grep dalvik.vm.heapgrowthlimit检查此值。也便是说,程序发作OMM并不表明RAM缺乏,而是由于程序恳求的java heap方针超越了dalvik vmheapgrowthlimit。也便是说,在RAM足够的状况下,也或许发作OOM。

这样的规划好像有些不合理,可是Google为什么这样做呢?这样规划的意图是为了让Android体系能一起让比较多的进程常驻内存,这样程序发动时就不必每次都从头加载到内存,能够给用户更快的呼应。迫使每个运用程序运用较小的内存,移动设备十分有限的RAM就能使比较多的app常驻其间。可是有一些大型运用程序是无法忍受vmheapgrowthlimit的约束的

实际上dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存约束,运用假如不想在dalvikheap到达heapgrowthlimit约束的时分呈现OOM,需求在Manifest中的application标签中声明android:largeHeap=“true”,声明后运用dalvik heap到达heapsize的时分才会呈现OOM

  1. 内存测验中的测验子项:
    1)闲暇状况下的运用内存耗费状况
    2)中等规范状况下的运用内存耗费状况
    3)满规范状况下的运用内存耗费状况
    4)运用内存峰值状况
    5)运用内存走漏状况
    6)运用是否常驻内存
    7)压力测验后的内存运用状况

  2. 内存问题现象:
    1)内存颤动
    2)大内存方针被分配
    3)内存不断增加
    4)频频GC

  3. 内存数据获取:
    1、各种linux指令(top、free、meminfo…)
    2、经过dumpsys
    adb shell dumpsys meminfo [pakagename | pid]
    3、经过/system/xbin/procrank东西
    adb shell procrank
    阐明:
    VSS – Virtual Set Size 虚拟耗用内存(包括同享库占用的内存)
    RSS – Resident Set Size 实际运用物理内存(包括同享库占用的内存)
    PSS – Proportional Set Size 实际运用的物理内存(份额分配同享库占用的内存)
    USS – Unique Set Size 进程单独占用的物理内存(不包括同享库占用的内存) USS 是针对某个进程开端有可疑内存走漏的状况,是一个程序发动了会发生的虚拟内存,一旦这个程序进程杀掉就会开释。不过USS需求经过root的手机。一般没有root的手机咱们能够获取PSS。而PSS经过如下指令来获取:adb shell dumpsys meminfo <Package Name>|grep TOTAL
    4、经过android供给的procrank
    1)首要去google获取procrank、procmem、libpagemap.so三个文件
    2)然后push文件,履行 adb push procrank /system/xbin adb push procmem
    /system/xbin adb push libpagemap.so /system/lib
    3)赋权 adb shell chmod 6755 /system/xbin/procrank adb shell chmod 6755 /system/xbin/procmem adb shell chmod 6755 /system/lib/libpagemap.so ,
    4)在敞开东西记载 adb shell procrank |grep packagename >/address/procrank.txt
    5、经过android供给的ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个办法是写一个简略的app去监控的时分用到的,简便简略)

 

  1. private void GetMemory()
  2. {
  3. final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  4. ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
  5. activityManager.getMemoryInfo(info);
  6. Log.i(tag,"体系剩下内存:"+(info.availMem >> 10)+"k");
  7. Log.i(tag,"体系是否处于低内存运转:"+info.lowMemory);
  8. Log.i(tag,"当体系剩下内存低于"+info.threshold+"时就当作低内存运转");
  9. }
6、Memory  Monitor (android studio的插件)  【makedown???】

4. /proc/meminfo文件里列出的字段解说:

MemTotal: 一切可用RAM巨细。 MemFree: LowFree与HighFree的总和,被体系藏着未运用的内存。
Buffers: 用来给文件做缓冲巨细。 Cached: 被高速缓冲存储器(cache memory)用的内存的巨细(等于diskcache
minus SwapCache)。 SwapCached:被高速缓冲存储器(cache
memory)用的交流空间的巨细。现已被交流出来的内存,依然被存放在swapfile中,用来在需求的时分很快的被替换而不需求再次翻开I/O端口。
Active: 在活泼运用中的缓冲或高速缓冲存储器页面文件的巨细,除非十分必要,不然不会被移作他用。 Inactive:
在不常常运用中的缓冲或高速缓冲存储器页面文件的巨细,或许被用于其他途径。 SwapTotal: 交流空间的总巨细。 SwapFree:
未被运用交流空间的巨细。 Dirty: 等候被写回到磁盘的内存巨细。 Writeback: 正在被写回到磁盘的内存巨细。
AnonPages:未映射页的内存巨细。 Mapped: 设备和文件等映射的巨细。 Slab:
内核数据结构缓存的巨细,能够削减恳求和开释内存带来的耗费。 SReclaimable:可回收Slab的巨细。
SUnreclaim:不行回收Slab的巨细(SUnreclaim+SReclaimable=Slab)。
PageTables:办理内存分页页面的索引表的巨细。 NFS_Unstable:不稳定页表的巨细。

5. android检查内存走漏进程:

1、运转Monkey进行压力测验:
adb shell monkey -p cn.microinvestment.weitou --pct-touch 100 --ingore-crashes --throttle 1000 -s 100 -v -v 50
2、监控内存值,假如呈现过大等递加反常则保存HPROF文件(hprof文件是Java 虚拟机的Heap快照)用于剖析检查运用内存的指令:
adb shell dumpsys meminfo cn.microinvestment.weitou(进程名)
假如发现内存过大,则保存HPROF文件:adb shell am dumpheap <进程名> <保存途径>
3、剖析hprof文件
用东西MAT来检查,首要还要这个HPROF文件转化成MAT可读的文件
在Android SDK tool里边有个hprof-conv指令:
hprof-conv <原HPROF文件途径> <转化后的HPROF途径>
hprof-conv a.hprof b.hprof
4、用MAT东西翻开转化后的HPROF文件
一般挑选Leak Suspects Report(经过SQL句子来查询方针有没有被开释掉,假如有多个相同的方针,则会存在内存走漏的问题)

 

1.2 CPU篇

  1. CPU测验中的测验子项:
    1)闲暇状况下的运用CPU耗费状况
    2)中等规范状况下的运用CPU耗费状况
    3)满规范状况下的运用CPU耗费状况
    4)运用CPU峰值状况

  2. CPU数据获取:
    1)adb shell dumpsys cpuinfo | grep packagename
    2)top指令
    adb shell top -m 10 -s cpu #检查占用cpu最高的前10个程序(-t 显现进程称号,-s 按指定行排序,-n 在退出前改写几回,-d 改写距离,-m 显现最大数量)
    adb shell top | grep PackageName > /address/cpu.txt

 

1.3 流量篇

  1. 概念:
    中等负荷:运用正常操作
    高负荷:运用极限操作

  2. 流量测验中的测验子项:
    1、运用初次发动流量值
    2、运用后台接连运转 2 小时的流量值
    3、运用高负荷运转的流量峰值
    4、运用中等负荷运转时的流量均值

  3. 获取流量数据:
    1、tcpdump+wireshark
    2、/proc/net/目录下相关文件
    cat /proc/net/dev 获取体系的流量信息
    3、查询运用的pid: adb shell ps | grep tataufo #如:31002
    经过PID获取该运用的流量数据: adb shell cat /proc/31002/net/dev
    (wlan0代表wifi上传下载量标识, 单位是字节能够/1024换算成KB, 翻开手机飞翔形式再关掉就能够将wlan0中的值初始化0)
    4、查询运用的pid: adb shell ps | grep tataufo #如:31002
    经过PID获取UID:adb shell cat /proc//status
    经过UID获取:adb shell cat /proc/net/xt_qtaguid/stats | grep 31002
    5、经过adb shell dumpsys package来获取运用的uid信息,然后在未操作运用之前,经过检查 :
    adb shell cat /proc/uid_stat/uid/tcp_rcv
    adb shell cat /proc/uid_stat/uid/tcp_snd
    获取到运用的开端的接纳及发送的流量,然后咱们再操作运用,再次经过上述2条指令能够获取到运用的完毕的接纳及发送的流量,经过相减及得到运用的全体流量耗费
    6、Android代码:Android的TrafficStats类

 

1.4 功耗篇

  1. 功耗测验中的测验子项:
    1、手机装置方针APK前后待机功耗无显着差异
    2、常见运用场景中能够正常进入待机,待机电流在正常范围内
    3、长时刻接连运用运用无反常耗电现象

  2. 功耗测验办法:
    办法一:软件
    1、选用市场上供给的第三方东西,如金山电池管家之类的。
    2、便是自写东西进行,这儿一般会运用3种办法:
    1)依据android供给的PowerManager.WakeLock来进行
    2)比较复杂一点,功耗的核算=CPU耗费+Wake lock耗费+数据传输耗费+GPS耗费+Wi-Fi衔接耗费
    3)经过 adb shell dumpsys battery来获取
    3、battery-historian(google开源东西)
    办法二:硬件
    一般运用万用表或许功耗仪安捷伦进行测验,运用功耗仪测验的时分,需求制造假电池来进行的,有些不能拔插电池的手机还需求焊接才干进行功耗测验

 

1.5 GPU篇(FPS)

  1. 概念:
    过度制作: 界面显现的activity套接了多层而导致
    帧率:屏幕滑动帧速率
    帧方差: 屏幕滑动滑润度
    **FPS:**Frames Per Second 每秒显现的帧数 依据人眼的生理结构,帧率高于24时就被认为是衔接的。关于游戏画面30fps是最低能承受的,60fps传神感,假如帧率高于屏幕改写频率便是糟蹋。要到达30fps,每帧所占用的时刻要小于33毫秒

  2. GPU测验中的测验子项:
    1、界面过度制作
    2、屏幕滑动帧速率
    3、屏幕滑动滑润度

  3. 过度制作测验:(人工进行测验)
    翻开开发者选项中的显现GPU过度制作(Debug GPU overdraw)
    检验的规范:
    1、不允许呈现黑色像素
    2、不允许存在4x过度制作
    3、不允许存在面积超越屏幕1/4区域的3x过度制作(淡红色区域)

  4. 屏幕滑动帧速率测验:
    办法一:
    1.手机端翻开开发者选项中的启用盯梢后勾选Graphics和View
    2.发动SDK东西Systrace,勾选被测运用,点击Systrace,在弹出的对话框中设置继续抓取时刻,在trace taps下面勾选gfx及view选项
    3.手艺滑动界面能够经过节拍来进行滑动或许扫动,帧率数据会保存到默许途径下,默许称号为trace.html
    4.将trace.html文件拷贝到linux体系下经过指令进行转化,生成trace.csv文件
    grep 'postFramebuffer' trace.html | sed -e 's/.]\W//g' -e 's/:.*$//g' -e 's/.//g' > trace.csv
    5.用excel翻开文件核算得到帧率
    办法二:
    硬件的办法,翻开高速相机,敞开摄像形式,录制手艺滑动或许扫动被测运用的视频,再经过人工或许程序数帧的办法对成果进行核算得到帧率

  5. 屏幕滑动滑润度的测验:
    办法好像帧率测验,仅有的差异便是最终的成果核算公式的差异

  6. 捕获app帧率(android流通度FPS测验):
    1、翻开手机开发者选项,勾选GPU显现配置文件(体系会记载保存每个界面最终128帧图画制作的相关时刻信息)
    2、adb shell dumpsys gfxinfo com.xxx.xxx > zinfo.txt
    3、成果数据剖析
    Profile data in ms部分:
    Draw: 创立显现列表的时刻(DisplayList),一切View方针OnDraw办法占用的时刻
    Process: Android 2D烘托引擎履行显现列表所花的时刻,View越多时刻越长
    Execute:将一帧图画交给合成器(compsitor)的时刻,较小

  7. 其他东西:
    GameBench 测验android app的FPS东西
    Gfxinfo 检查app制作功用东西

 

1.6 呼应时刻篇

  1. 了解:
    1)从单击事情触发到容器发动NativeAPP耗费的时刻(埋点)
    2)NativeAPP完好发动耗费的时刻(能够经过system.log获取)
    3)Native调用RPC恳求办法的推迟时刻(埋点)
    4)RPC恳求发出去进程中的详细数据(req_size req_header req_time等,经过埋点获取)
    5)RPC恳求回来的详细数据(res_size res_header res_time等,经过埋点获取)
    6)本地解析回来数据所耗费的时刻(埋点或许TraceView东西可获取)
    7)界面烘托的时刻(能够经过慢速摄像机或许埋点获取)

  2. android app发动时刻测验
    (安卓Activity发动进程功用剖视: http://www.rudy-yuan.net/archives/59/

  3. 运用的发动时刻的测验,分为三类:
    1)初次发动 --运用初次发动所花费的时刻
    2)非初次发动 --运用非初次发动所花费的时刻
    3)运用界面切换--运用界面内切换所花费的时刻

  4. 运用发动时刻数据获取:
    1、adb logcat > /address/logcat.txt #一切activity打印的日志
    find “Displayed” /address/logcat.txt > /newaddress/fl.txt #经过日志过滤关键字Displayed来过滤
    find “ActivityName” /newaddress/fl.txt > /newaddress/last.txt #经过activity名来过滤获取所测运用
    经过核算activity最终剩下的时刻之和即可
    2、硬件测验, 运用高速相机或许手机选用录像的办法把运用发动进程给录制下来,然后经过人工数帧或许程序数帧的办法核算发动时刻

 

2 弱网测验

  1. 测验办法:
    1、运用实在的SIM卡、运营商网络来进行测验(移动无线测验中存在一些特别的BUG必须在特定的实在的运营商网络下才会发现)
    2、经过署理的办法模仿弱网环境进行测验(charles 硬推迟)
    3、衔接模仿弱网的抢手进行测验

  2. 抢手模仿办法:
    1)经过设置iPhone的开发者形式之后同享抢手(硬推迟)
    2)FaceBook开源的ATC(可运用树莓派来建立ACT环境)

  3. 用户体会需求做的:
    1)在运用中一致弱网加载的界面款式、动画作用、菊花icon等
    2)一致网络过错、服务端过错、超时等展示给用户的界面和提示句子
    3)界说清楚在每个中心进程是的用户交互行为


原文转自:https://www.zybuluo.com/defias/note/592309