AndroidStudio 中集成了常用的性能分析工具,可以使用它们来进行性能分析。
AndroidStudio性能分析工具
AndroidStudio 给开发者提供了App的内存占用,CPU使用率,Network请求等直观数据,如果用户有打开页面,请求网络等操作,可以直接看到变化。
1.内存分析
Android内存分配机制是对每个应用程序逐步增加, 比如你程序当前使用30M内存, 系统可能会给你分配40M, 当前就有10M空闲,系统如果不能再给你分配额外的内存,程序自然就会OOM(内存溢出)了。 每个应用程序最高可以申请的内存和手机密切相关,有的手机只有可怜的16M或者32M,这样的手机相对于内存溢出的概率非常大了。
内存泄漏分析
内存泄露就是指,本应该回收的内存,还驻留在内存中。一般情况下如果发现退出界面,程序内存迟迟不降低的话,可能就发生了严重的内存泄露。此时先发起一次GC内存回收然后反复进入该界面,然后点击Dump java heap
这个按钮,然后 AndroidStudio
便开始收集堆内存信息了,收集完成后会保存到 hprof
文件中。
hprof: Heap/CPU of Profiling(简要描述)
hprof 文件分析
- 直接使用 AndroidStudio 查看,参考:hprof 文件分析;
- 使用 MAT 内存分析工具查看;
2.Allocation Tracker
Android Monitor 可以收集app中的内存使用情况,Allocation Tracker 可以使我们观察到对象在什么地方被创建,以及对象对占用的占用情况。比如一张图片被在常驻在内存中,我们可以找到该图片的加载位置从而进行优化。
使用 Allocation Traker
来查看内存到底被什么占用了,点一次开始,第二次点击的时候则停止,停止之后信息自动保存到 .alloc
文件中。
如果想查看某个方法的源码,右键选择的方法,点击Jump to source。
3.TraceView
TraceView 是 Android 平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method。它主要用于分析 Android 中应用程序的 hotspot。TraceView 本身只是一个数据分析工具,而数据的采集则需要使用 Android SDK 中的 Debug 类或者利用 DDMS 工具。二者的用法如下:
1. MethodTracing
开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的 startMethodTracing 函数,并在关键代码段结束前调用 stopMethodTracing 函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java 线程)的函数执行情况,并将采集数据保存到 /mnt/sdcard/ 下的一个文件中。开发者然后需要利用 SDK 中的 TraceView 工具来分析这些数据。
2. DDMS
借助 Android SDK 中的 DDMS 工具。DDMS 可采集系统中某个正在运行的进程的函数调用信息。
列名含义:
- Incl Cpu Time :函数占用的 CPU 时间,包含内部调用其它函数的 CPU 时间
- Excl Cpu Time :函数占用的 CPU 时间,但不包含内部调用其它函数的 CPU 时间
- Incl Real Time :函数运行的真实时间,包含内部调用其它函数的真实时间
- Excl Real Time :函数运行的真实时间,不包含内部调用其它函数的真实时间
- Call+Recur Calls/Total :函数被调用次数以及递归调用占总调用次数的百分比
- Cpu Time/Call :函数调用 CPU 时间与调用次数比,即该函数平均执行时间
- Real Time/Call :函数调用真实时间与调用次数比,即该函数平均执行的真实时间
从上图中,可以看到各个方法所占用CPU的时间,如果在某个页面发生卡顿,则可以通过收集 method trace 信息,然后进行分析,查看耗时间比较长的方法,进行优化操作。
hotspot
hotspot 包括两种类型的函数:
- 调用次数不多,但每次调用却需要花费很长时间的函数。
- 自身占用时间不长,但调用却非常频繁的函数。
测试背景:APP 在测试机运行一段时间后出现手机发烫、卡顿、高 CPU 占有率的现象。将应用切入后台进行 CPU 数据的监测,结果显示,即使应用不进行任何操作,应用的 CPU 占有率都会持续的增长。
按照 TraceView 简介中的方法进行测试,TraceView 结果 UI 显示后进行数据分析,在 Profile Panel 中,选择按 Cpu Time/Call 进行降序排序。