总述
Android Profiler 提供了四种工具,分别对 CPU、内存、流量、电量进行监测,本系列将分别讲解这四种工具:CPU Profiler、Memory Profiler、Network Profiler 和 Energy Profiler。
本文基于 Android Studio 3.6.3,Android 9.0。主旨在 CPU Profiler 快速入门,更多细节可以参考官方文档。
通过 CPU Profiler 查看 CPU 的运行情况,可以找出 CPU 占用率高、耗时长的函数,以便定向优化项目。
基础说明
打开 CPU Profiler
1.点击工具栏中的 Profiler 图标。
2.点击 CPU 时间轴上的任意位置以打开 CPU Profiler。
基础图示说明
1.事件时间轴
显示 Activity 生命周期的不同状态、以及用户的交互事件,如点击。
2.CPU 时间轴
显示 CPU 实时占用率。其中绿色块表示的才是应用自身的 CPU 占用,灰色块表示的是其他应用的 CPU 占用,白色虚线表示的是应用当前的线程总数。
3.线程活动时间轴
每一行表示一个线程,列出了应用程序的每个线程、以及它们的活动情况。
绿色:活动中或准备使用 CPU;
黄色:活动中,但在等待 I/O。
灰色:休眠。
实战
应用运行中使用 CPU Profiler
为了说明 CPU Profiler 的用法,这里写了个简单的 Demo。
package com.dixon.profiledemo;
import ...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startAty(View view) {
CatonUtils.caton();
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
}
在启动 SecondActivity()
之前,调用了 CatonUtils.caton()
函数,它是我手写的耗时方法,代码如下:
public class CatonUtils {
// 仅仅是模拟耗时计算 可以随意替换
public static void caton() {
long sum = 0;
for (long i = 0; i <= Integer.MAX_VALUE / 4; i++) {
sum += i;
}
}
}
也就是说在启动新的 Activity 之前,它会因耗时操作而导致启动过程卡顿。
我们的目标就是:通过 CPU Profiler,找到卡顿点是 CatonUtils.caton()
这个函数。
步骤
1.开始测试卡顿点前,点击 Record。
2.执行卡顿场景。放在本例中,就是点击跳转按钮(调用 startAty()
)。
3.点击 stopRecord。
这样我们就拿到了卡顿期间的数据,此时界面如下。
分析
1.CPU 时间轴
可以明显看到时刻内 CPU 在占用率很高的情况下维持了很长一段时间。
2.THREADS 栏
选中卡顿线程,本例中为主线程,以包名命名。
将鼠标拖动到 THREADS 一栏的绿色方块上,可以看到函数耗时。
3.Call Chart
Call Chart 以图形的方式呈现方法跟踪数据。
其中:
橙色:系统 API 调用;
绿色:应用自有方法;
蓝色:第三方、包括 Java 语言 API 调用。
由于函数由上至下层层调用,因此通过判断自有函数间的长度间距,即可判断耗时长短。
在本例中,com.dixon.profiledem.CatonUtils.caton()
为最后执行的函数,它的耗时时间最长,此时使用 右键 - jump to source
即可定位到耗时代码。
4.Top Down
Top Down 同样由上至下列出了函数调用列表,通过 Total 可以轻松的定位出耗时函数。
应用启动时使用 CPU Profiler
上述点选 Record 按钮的方式只能在应用进程启动后,如果我们想优化应用的 启动耗时,则需要另外的方式。
- 依次选择 Run > Edit Configurations。
- 在 Profiling 标签中,勾选 Start recording CPU activity on startup,点击 Apply。
- 选择 Run > Profile。
- 完全启动后,点击 stop Record,出现结果数据,使用上述分析方式分析即可。
其它
CPU Profiler 还有其它使用方式,如导出导入 CPU Profiler 分析数据、检查帧渲染数据等等,详情查看 官方文档,本文只说明 CPU Profiler 开发过程中的常见用法。
上述示例演示了大量计算导致的应用卡顿,同样,内存占用过高、导致频繁 GC 同样会导致应用卡顿,下节将使用 Memory Profiler
定位内存问题。
下节 Android Profiler(二)Memory Profiler