产品 / 解决方案
平台 / 框架

在 Android 平台开发中,出现 CPU 占用率过高、设备发热的问题该如何分析?

产品 / 插件:实时音视频 / 实时语音 / 超低延迟直播

平台 / 框架:Android

更新时间:2023-12-11 10:36


本文档旨在帮助使用 ZEGO SDK 的 Android 开发人员分析 CPU 方面的性能问题,因为此类问题经常导致 App 的 UI 卡顿、手机设备发热、音视频不实时(延时较大)等问题,影响客户使用体验。

为了提升客户体验和服务,此文档分别就 CPU 使用率过高的问题展开分析,帮助开发人员定位问题根因,确认是否是 ZEGO SDK 导致的性能问题。

1 进程分析

执行 top 命令,查看 App 占用 CPU 是否过高,以及对应的 PID(Process Identification,进程标识号)。

例如:当前 App 的 CPU 占用率为 106%,PID 为 27056。

/Pics/FAQ/Performance/cpu_top.png

2 线程分析

执行 top -H -p 命令,按 %CPU 使用率排行,查找对应 PID 下各个线程所占用的 CPU,其中包含了系统级,C/C++(lib层)、Java 层自研的线程情况。

例如:top -H -p 30959 -O Tid 命令的执行结果如下:

/Pics/FAQ/Performance/cpu_top_p.png

从中可以看到 com.zegodemo.dynamicfunction 进程里面的主线程消耗了较高的 CPU。

Profiler ⼯具

Android Studio ⾃带的分析⼯具 Profiler,也可直接查看 CPU 占用率过高的线程。

  1. Android Studio 安装 Debug 版本,连接到⼿机设备,打开 Profiler ⼯具,选择要分析的 App 对应的包名。

  2. 点击 CPU,进⼊ CPU 分析⻚⾯。

    • 上半部分可以看到当前 App 占⽤的 CPU ⽐例、以及⼿机上其他进程占⽤的 CPU ⽐例。

      /Pics/FAQ/Performance/Profiler_cpu.png

    • 下半部分可以看到当前所有的线程、以及线程所占⽤的 CPU 时间⽚。CPU 占⽤率,指⼀段时间内某个线程所占⽤的 CPU 时间,即线程 running 态时间占总时间的⽐率。

      绿⾊条的⻓度代表线程 running 态的时间。如果其中存在较⻓的绿⾊条、或者⼀段时间内非常频繁地出现绿⾊条,表示 CPU 占用率大。

      /Pics/FAQ/Performance/Profiler_cpu_running.png

例如:App 的主线程 running 态的时间呈现⼤批绿⾊⻓条,⿏标移动到绿⾊条上,可以看到 running 态的时间很多超过了 1s,可以推测主线程有耗时操作。

/Pics/FAQ/Performance/Profiler_cpu_running1.png

3 函数细节

定位到具体的耗时线程后,进⼀步分析⽬标线程内部的操作,根据需要详细分析的线程所在层级。

Java 层

  1. 如需 Debug 主线程或其他上层 Java 线程中的 Java 层 CPU 问题,选择:Sample Java Methods,点击 Record,复现 CPU 占⽤⾼的问题。

  2. 再点击 Stop 停止,Profiler 会⾃动解析该段时间的线程 Java ⽅法调⽤情况。

    /Pics/FAQ/Performance/funcion_record_stop.png

  3. 根据 Java 方法名称,查看线程占用率。例如:下图可以看出主线程⾥⾯的 onClick ⻓度条明显占据 CPU 较⻓时间。

    点击 main 线程中的该函数,右侧⾯板会展示出 Record 时间范围内该函数的最⻓的⼏次执⾏时间。对系统 API 的函数调⽤显示为橙⾊,对应⽤⾃有函数的调⽤显示为绿⾊(重点排查),对第三⽅ API(包括 Java 语⾔ API)的函数调⽤显示为蓝⾊。

    /Pics/FAQ/Performance/funcion_record_example.png

    /Pics/FAQ/Performance/funcion_record_example1.png

C/C++ 层

如果是 C/C++ 层占用 CPU 较高,选择Sample C/C++ Functions

查询 ZEGO SDK 的 so 当中对 CPU 资源的使⽤情况。Zego lib.so 中常⻅线程如下:

Thread name 功能
decoder
解码线程(音频/视频)
CWelsTaskThread
H.264 分层编码线程
audio_encode
⾳频编码线程
Vcap_enc
视频采集编码线程
avert-play-udp
拉流线程
cap_thread
采集线程
video_filter
外部滤镜线程

开发者如果遇到上述线程的问题,请保存 C/C++ 的 trace ⽂件、logcat 信息、导出 ZEGO SDK、以及保存 SD 卡内的 log 等,联系 ZEGO 技术支持处理。

/Pics/FAQ/Performance/funcion_record_cpp_cpu.png

本篇目录
下载 PDF