安卓性能专项

紧张的9.0专项测试告已段落,现把android平台的专项测试方法总结如下,主要从电量、流量、内存、性能、弱网、安装包大小6个方面进行总结。

一.电量

1.1 cpu耗电

  通过top –m 5 –t –d 1命令监控耗CPU的钱包线程,通过kill -3 PID生成trace文件,通过adb pull /data/anr/traces.txt LocalDirectory获取线程调用堆栈,结合代码,分析是什么因素在耗CPU。
  PS:使用kill -3捕获线程调用堆栈时,多kill几次,确保CPU飙高时执行了kill操作。
  示例:
  image
  image
  如图所示,钱包线程耗CPU为7%+1%=8%,kill -3 2328捕获线程调用堆栈,然后在traces.txt中搜索两个线程的TID 2328、3130,结合代码,分析是什么在耗CPU。

1.2 持续定位耗电

  安装可切环境包,发起持续定位logcat会输出日志requestLocationUpdatesContinuous;停止持续定位logcat会输出日志removeUpdatesContinuous

  通过检查日志输出,确认持续定位被及时停止。

1.3 cpu唤醒耗电

  安装可切环境包,cpu唤醒logcat会输出日志Call WakeLock.acquire();释放cpu唤醒logcat会输出日志Call WakeLock.release()

  通过检查日志输出,确认cpu唤醒后及时被释放。

1.4 传感器耗电

  安装可切环境包,注册传感器logcat会输出日志Call sensorManager.registerListener();反注册logcat会输出日志Call SensorManager.unRegisterListener()

  通过检查日志输出,确认打开的传感器及时释放。

二.流量

  fiddler抓包分析,附fiddler配置方法链接(http://www.trinea.cn/android/android-network-sniffer/)

三.内存

  总体上来说,导致内存泄漏的原因可归类为两类:1.引用了某个东东未释放;2.资源使用不合理。以下具体分类说明。

3.1 activity内存泄漏

  登录钱包到首页,在eclipse中切换到DDMS视图,选中钱包主进程com.eg.android.AlipayGphoneRC,点击image ,点击【Cause GC】,稍停10s左右,点击image,生成初始hprof文件。
  image
  操作要测试的功能模块,把所有界面都走一遍,最后回到首页,点击【Cause GC】,稍停10s左右,点击image ,生成hprof文件,点击下图1指向的图标,然后点击2指向的图标,选择初始hprof文件进行对比,
  image
之后在Class Name列中输入activity,Objects列中输入>0,若有activity内存泄漏,此时即在窗口中显示。
  image
  进一步分析activity内存泄漏的原因,需要点击image ,找到上图窗口中显示的泄漏的activity类名,然后在类名上点右键,选择Merge Shortest Paths to GC Roots->exclude weak/soft references,找到activity的引用关系,示例如下图所示:
  image

3.2 大对象常驻内存

  打开hprof文件后,点击image ,关注retained heap列如下图所示:
  image
  依次在retained heap大于100KB的钱包相关类名上点右键,选择Merge Shortest Paths to GC Roots->exclude weak/soft references,如下图所示,单个对象占用内存超过3M,对象引用关系一目了然。
  image

3.3 bitmap图片内存泄漏

3.3.1 线程未退出,导致bitmap图片内存泄漏

  打开hprof文件后,点击image,关注retained heap列,在android.graphics.Bitmap上点右键Path To GC Roots-> exclude weak/soft references。
  image
  如下图红色框所示,线程未退出,导致1.308M bitmap图片内存泄漏。
  image

3.3.2 静态类常驻内存,导致bitmap图片内存泄漏

  打开hprof文件后,点击image ,关注retained heap列,在android.graphics.Bitmap上点右键Path To GC Roots-> exclude weak/soft references。
  如下图所示,UiUtil被声明为静态,导致bitmap图片内存泄漏。
  image

3.3.3 退出activity未清除缓存,导致bitmap图片内存泄漏

  如下图所示,TemplateImageLoader在商户浏览页面长时间滑动列表后,占用超过30M内存,并且不再回收。
  判断方法: DDMS视图VM Heap页面中部有一个data object选项,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量。在商户浏览页面长时间滑动列表后,Total Size值增长了30M左右,手动GC也不回收。
  image

3.3.4 handler泄漏,导致bitmap图片内存泄漏

  打开hprof文件后,点击image ,关注retained heap列,在android.graphics.drawable.BitmapDrawable上点右键Path To GC Roots-> exclude weak/soft references。
  如下图所示,handler泄漏导致BannerViewPager无法回收,进而导致209KB图片泄漏。
  image

3.3.5 service中持有了图片,导致bitmap图片内存泄漏

  service一般占100KB左右内存是合理的,当超过100KB时就需要看一下了。
  打开hprof文件后,点击image ,关注retained heap列,在相关service上点右键Path To GC Roots-> exclude weak/soft references
  如下图所示,AppManageService消耗了1M多内存,其中有未释放的bitmap图片。
  image

3.4 native内存泄漏

分析native内存泄露,略微麻烦,需要刷了工程机Rom的机器配合,主要步骤如下:

1、设备准备

  • 准备一部使用userdebug/eng版本Rom的开发机,一般的官方ROM都是user的,可以刷入工程版CM替换原生系统,查看命令:adb shell getprop ro.build.type

2、设备设置

  • adb shell setprop libc.debug.malloc 1
  • 注:这里有四种prop可以设置,1是mem leak,5和10是内存越界,20是虚拟机。可悲的是5和10并没有被libc_malloc_debug库完美地支持,所以只有1好用。
  • adb shell stop
  • adb shell start

3、DDMS设置

  • 将ddms.cfg文件最后增加一行native=true并保存。ddms.cfg位于C:\Users\yourusername.android目录下。
  • 重启DDMS

4、内存信息Dump及分析

  • 打开单独的ddms(确保eclipse没有在跑),选择Native Heap页面,点击snapshot按钮。snapshot的过程有点慢。最后能看到每个so占用了多少内存以及百分比。过一段时间snapshot一次就能看到每个so的趋势了。
  • 查看Native内存信息,并进行分析。我们可以在程序刚启动和使用一段时间后,分别抓取NativeHeap的快照,进行对比来分析哪些地方可能存在消耗内存较多或者内存泄露的地方。

NativeHeap

四.性能

4.1 关键操作RPC耗时采集方法

  推荐使用工具组开发的浮窗工具进行采集,连线上环境,可拿到基于线上环境的RPC数据。注意安装包需要是debug包,多操作几遍,默认满50条日志记录才会上传,上传时框架层会广播此埋点日志,浮窗工具监听到此广播后捕获数据。 具体使用方法如下:
  1)打开浮窗工具中的rpc开关;
  2)点击子浮窗“点击开始监控”,状态变为“运行中”;
  3)进行相关操作,点击“运行中”,结束监控;
  4)点击右上角的结果button,选择对应结果,结果界面如图,包含所做操作的总流量消耗、rpc性能数据、CPU、内存;
  image
  5)点击rpc数据下的查看button,rpc性能数据如图,包含了上行流量、下行流量、rpc耗时;
  image

4.2 流畅度

平台 指标
android fps值越大越好,60fps最优(即达到平滑效果),单帧消耗的时间越小越好,在中端机型上(如MI4 android 4.4.4),avgFPS>=30,minFPS>=24
iOS 代表机型iPhone4s,iOS7:avgFPS>=45,minFPS>=30

  最简单的方法:直观的判断列表滑动、动画渲染、页面切换时有无卡顿。
  量化的判断方法:
  1)将开发者模式中强制GPU渲染和GPU呈现模式分析打开(计算adb shell dumpsys gfxinfo中的呈现时间);
  2)操作要度量流畅度的功能,操作完成执行此命令:adb shell dumpsys gfxinfo com.eg.android.AlipayGphone;
  3)得到Profile data in ms这三列数据,Excel生成“堆积柱形图”,看avgfps和minfps是否达标。

五.弱网

  弱网环境搭建方法:用iOS手机中的系统设置->开发者->status->very bad network,进行如图所示的参数设置:(2G、3G、4G卡均可,因为只要外部网络畅通,热点的网速、丢包率、延时已被限制)。
  image
设置完毕,别忘把Enable打开,如图所示:
  image
关闭wifi,打开个人热点,然后android手机连接此热点,至此弱网环境搭建完成。

六.安装包大小

猜你喜欢

转载自www.cnblogs.com/SouthRain/p/6688095.html