Android性能相关--工具篇

性能测试平台

百度MTC、腾讯GT、bita、Bugly、阿里云效、科大讯飞iTest、网易Emmagee、华为DevEco、Testin

网易Emmagee

地址:https://github.com/NetEase/Emmagee
App的整体性能分析

腾讯随身调

地址:https://github.com/TencentOpen/GT
官网:https://gt.qq.com/
GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment)。利用GT,仅凭一部手机,无需连接电脑,您即可对APP进行快速的性能测试(CPU、内存、流量、电量、帧率/流畅度等等)、开发日志的查看、Crash日志查看、网络数据包的抓取、APP内部参数的调试、真机代码耗时统计等

Monkey 和 Monkey Demons

常规压力测试、大数据/操作的峰值压力测试、长时间运行的稳定性测试等

//随机操作49000次
adb shell monkey 490000
//启动包名为com.tencent.mobileqq的应用并随机操作49000次
adb shell monkey -p com.tencent.mobileqq 49000

Monkey Demons : 针对性的Monekey https://m.aliyun.com/yunqi/articles/73859

Android SysTrace 性能数据采样和分析工具

针对:发现性能瓶颈
功能:跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统(如Surfaceflinger、WindowManagerService等Framework关键模块)的运行状况。
Tip:主要用于发现性能瓶颈,可展示每个Frame的情况(Frame),查看有性能问题的点(Alert),不适合做针对性的问题定位和分析。
用法:

方法一:代码跟踪

//Java层 成对出现,并将这段时间内的数据收集到/sdcard/systrace.txt中
Trace.beginSection("systrace.txt");
Trace.endSection();
//framework中Java层
Trace.traceBegin(Trace.TRACE_TAG_VIEW,"systrace.txt");
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
//framework中Naitve层
ATRACE_INIT();
ATRACE_CALL();

方法二:python命令 \sdk\platform-tools\systrace

python systrace.py --time=10 -o mynewtrace.html sched gfx view wm

这里写图片描述

方法三:Android Device Monitor工具 【sdk\tools\lib\monitor-x86_64】

Android Device Monitor -> Device -> Capture System Wide Trace ;收集一段时间内某进程的信息

这里写图片描述

数据分析:使用浏览器打开生成html文件
这里写图片描述

这里写图片描述
Alerts:标记性能有问题的点,点击可查看详情,右边侧边栏可以查看每个类型的Alerts数量

这里写图片描述
Frame:显示为黄色或红色则表示渲染时间超过16.6ms,使用W键放大查看该帧做了什么

这里写图片描述

Traceview

针对:卡顿、OOM、ANR
功能:展示每个方法的用时,调用次数及调用栈
用法:

方法一:代码

//生成/mnt/sdcard/traceview.trace文件
Debug.startMethodTracing("traceview");
Debug.stopMethodTracing();

方法二:Android Device Monitor 工具【sdk\tools\lib\monitor-x86_64】

点击【start method profile】开始 ==> 点击【stop method profile】结束
获取这段时间的trace文件

这里写图片描述

方法三:Android Studio 【3.1.2】 Profiler

点击【Record a method trace】开始 ==> 点击【stop Recording】结束

这里写图片描述

Call Chart:水平方向表示方法的执行时间,垂直方向表示方法的调用
Flame Chart:反向的Call Chart ???
Top Down:显示方法调用的列表,扩展方法节点显示其callees
Bottom Up:显示一个方法调用列表,扩展方法的节点显示其调用者

HierarchyViewer

针对:布局优化
功能:查看UI布局信息,优化布局
用法:Android Device Monitor -> Device -> Dump View HierachyViewer for UI automator
PS:工具栏中点击【Obtain layout times for tree rooted at selected node】按钮可查看某View的耗时

这里写图片描述

MAT

针对:内存泄露
功能:内存泄露分析
Tip:个人经验,内存泄露就是无用的对象无法被GC回收,很粗浅的一个判断就是,假设你怀疑一个Activity有内存泄露情况,可以在AndroidStudio中观察内存变化,然后进入Activity做操作,退出再进入再操作如此重复N次,如果内存不断地增加则很有可能发生内存泄露了。而MAT可以帮我们找出泄露的是哪个对象。MAT的用法这里引用大神的一个系列

用法:
方法一:下载eclipse插件工具 Eclipse Memory Analyzer
下载地址:https://eclipse.org/mat/downloads.php
1、获取HPROF文件,点击【Update Heap】按钮,操作应用,点击【Dump HPROF File】按钮,生成HPROF文件
2、文件转换 ./hprof-conv in.hprof out.hprof 然后用MAT打开这个hprof文件

方法二:Android Device Monitor
点击【Update Heap】开始 ==> 点击【Dump HPROF file】结束并获取.hprof文件

方法三:Android Studio
这里写图片描述

数据分析:有Histogram、Dominator Tree、Top Consumers、Leak Suspects几个分析纬度
Histogram:列出内存中的所有实例对象,对象的个数及大小,并支持正则表达式查找
Dominator Tree:列出最大的对象及其依赖存活的Object,分析流程和Histogram大同小异,但Dominator Tree可更方便的看出引用关系
右键选择要跟踪的Java类型,【Merge Shortest Paths to GC Root】-【exclude all phantom/weak/soft etc referrence】显示GC Root并排除虚引用、弱引用、软引用;可以看到该对象被那个对象持有,若是该问题在适当地方置为null即可
Top Consumers:通过图形列出最大的Object,了解应用内存都被哪些类型占用了
这里写图片描述
但这部分信息包含了系统框架层的信息,用以下方式可以将系统框架的信息隔离,只显示应用层的信息
方法一:转换的时候加入-z参数

hprof-conv [-z] <infile><outfile>
-z: exclude non-app heaps, such as Zygote

方法二:针对转换后的hprof,使用OQL查询来提取信息。
在数据中寻找应用的Application类对象,将对象地址转换为十
进制后输入以下查询语句

select * from instanceof java.lang.Object s where s.@objectAddress > 1107296256

提取后结果如下
这里写图片描述

Leak Suspects通过MAT自动分析泄露的原因和泄露的一份总体报告,Leak Suspects列出了内存泄漏点和泄露大小。
Shallow Heap对象自身占用的内存大小
Retained Heap对象自身占用内存大小+其所引用的对象占用内存大小的总和

PS:也可通过制造相同场景下的两个不同的hprof(一个正常无泄漏,一个异常有泄漏)进行对比,查看异常hprof哪个地方持有引用明显多于正常hprof从而定位问题


手机自带功能

  • Debug GPU Overdraw:用来检测UI的重绘次数
  • Profile GPU Rendering:用来检测UI绘制帧的速率和耗时,测出绘制每一帧在屏幕上用了多少时间
  • 窗口动画缩放/过渡动画缩放/动画程序时长缩放:动效出问题的时候用得上,能帮你看到许多东西
  • 严格模式:报告与线程及虚拟机相关的策略违例,监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码(包括:主线程里:disk读、disk写、网络访问)
  • adb shell dumpsys gfxinfo com.letv.android.supermanager 查看掉帧率
  • adb shell am start -W 包名/Activity路径 查看Activity启动时间,调用后会自动启动Activity。eg:adb shell am start -W com.android.demo/.activity.DemoActivity
  • adb shell dumpsys meminfo com.letv.android.supermanager 查看当前的内存分布
** MEMINFO in pid 15548 [com.paisheng.pp] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    13573    13508       12        0    29184    20268     8915
  Dalvik Heap    29066    29020       12        0    56681    40297    16384
 Dalvik Other     3333     3332        0        4
        Stack       48       48        0       20
       Ashmem        2        0        0        0
      Gfx dev    18808    18808        0        0
    Other dev       13        0       12        0
     .so mmap     1507      212      228      263
    .jar mmap        0        0        0        0
    .apk mmap      235       20        0       80
    .dex mmap     2820        0     2412        8
    .oat mmap     2140        0      792        0
    .art mmap     2511     2180        0       72
   Other mmap     1207        4     1180        0
   EGL mtrack    36992    36992        0        0
    GL mtrack     4504     4504        0        0
      Unknown     2390     2376        8    21633
        TOTAL   141229   111004     4656    22080    85865    60565    25299

内存分为Natvie和Dalvik,两者相加超过一定限制就会OOM,Dalvik即Java堆内存,而Bitmap则是在Native上直接分配的。
Native Heap Native代码分配的内存,虚拟机和Android框架本身也会分配
Dalvik Heap Java代码分配的对象
Dalvik Other 类的数据结构和索引
so mmap Native代码和常量
dex mmap Java代码和常量(dex mmap在Android应用中的作用是映射classes.dex文件。Dalvik虚
拟机需要从dex文件中加载类信息、字符串常量等,还需要在调用函数的时候直接从mmap内存中读取函数代码来执行)

Pss:进程实际使用的物理内存
Shared Dirty:zygote加载的Android框架部分
Private Dirty:应用new出来的对象
Heap Size:最大分配空间
Heap Alloc:统计的是由虚拟机分配的所有应用实例的内存,zygote部分也会计算进去,通常比Pss略大。反映Java代码分配的内存
Heap Free:剩余空间

am、pm命令

一、am
1.am启动一个activity,可以输出activity启动时间
adb shell am start -W -n com.android.gallery3d/.MainActivity
-n使用包名加类名,还有a动作,c CATEGORY等
2.am发送一个广播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER
3.am发送一个带参数的广播,使用action
adb shell am broadcast -a magcomm.action.TOUCH_LETTER –es letter “e”
4.am启动一个服务,不带参数时默认使用包名加类名启动,参数时n,a,c
adb shell am startservice com.android.music/.MediaPlaybackService
5.关闭一个activity或者服务之类,使用包名就行,只是强制退出,相当于Home按键,应用处于后台
adb shell am force-stop com.android.gallery3d

二、pm
1、可以列出手机上安装的apk与对应的软件包,由于使用命令删除apk时,需要知道包名,通过这条命令加上grep或者find就能找到需要的软件的包名
adb shell pm list packages -f
2、找出对应包的安装目录路径,两条指令结合,可以知道要拷贝给别人的软件位于手机什么地方
adb shell pm path com.android.gallery3d
2.可以列了使用的权限
adb shell pm list permission-groups
adb shell pm list permissions

cpu命令查看

命令:cat /proc/stat
这里写图片描述
这里写图片描述


其他

  • Battery Historian:耗电分析工具
  • Bugly:定位各种闪退的BUG http://bugly.qq.com/
  • GT:各种测 http://gt.tencent.com/index.html
  • BlockCanary(阿里)ANR检测
  • LeakCanary 内存泄露自动探测,一个Android和Java的内存泄露检测库,可以大幅度减少了开发中遇到的OOM问题
  • 弱网络环境工具:Fiddler http://blog.csdn.net/kittyboy0001/article/details/38492567
  • 动手自己做卡顿监控方案:利用MainLooper每次调用dispatchMessage前后都会利用Printer打印日志,如果dispatchMessage执行超时则卡顿出现,只需记录dispatchMessage执行时间超过一定时间则记录相关信息。代码示例
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值