Android 系统使用 Perfetto 抓取 trace 教程

本文介绍如何使用Perfetto在Android设备上抓取trace数据,包括配置trace服务、命令行抓取方法及Perfetto UI在线抓取。通过实例演示不同场景下的抓取技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:Android 系统使用 Perfetto 抓取 trace 教程 - 知乎

1. 简介

Perfetto 支持在 Android 设备上抓取 trace 数据以供分析。

2. trace 抓取

在我们开始使用 Perfetto 之前,有个配置要注意下,Perfetto 是基于 Android 的系统追踪服务, 这个配置在 Android11(R) 之后是默认打开的,但是如果你是 Android 9 (P) 或者 10 (Q) ,那么就需要手动设置一下相应的 prop 属性。

# Needed only on Android 9 (P) and 10 (Q) on non-Pixel phones.
adb shell setprop persist.traced.enable 1

在设置完 trace 服务可用后,下面我们就可以开始抓取相应的 trace 了。目前,主要有两个方式可以实现 trace 抓取。一个是通过命令行抓取,一个是通过 Perfetto UI 在线抓取。

2.1 命令行抓取

命令行抓取 trace 方式的前提是你的电脑是已经安装了 adb 驱动,电脑能够通过 adb 命令成功连接到你的 Android 设备,如果没有的话,可以去官网 下载相关驱动安装。

使用命令行抓取又可以分为两种方式:

  • 使用 Android 设备预置的 perfetto 执行程序
  • 使用谷歌推荐的 record_android_trace 脚本

2.1.1 /system/bin/perfetto 抓取

首先,我们可以通过 adb 命令看下这个可执行程序是否真的存在于我们的 Android 设备中,如果这个程序都没有,那我们后面的操作也是无法进行的。

这里我用华为P20手机操作了一下,可以看到手机里已经有这个服务的了,那我们就可以接下来的操作了,执行如下命令:

adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

这个命令先简单的解释下:

-o /data/misc/perfetto-traces/trace_file.perfetto-trace
# -o 表示抓取文件的输出目录,这里我们是输出到 /data/misc/perfetto-traces/ 目录下的 trace_file.perfetto-trace 文件。
-t 20s 
# -t 表示抓取的时间,这里设置了 20s,默认情况下是 10s。
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
# 这里表示我们想要抓 trace 的相关模块。

执行上述 adb 命令即可开始抓取所配置的 trace 文件,如下图所示:

这里需要注意下,如果通过 adb shell perfetto 的方式抓取 trace 是需要我们手动执行 ctrl + c 的方式结束我们的抓取操作。抓取的文件被保存在了 /data/misc/perfetto-traces/trace_file.perfetto-trace 中,我们通过 adb pull 的方式把这个文件拉到在电脑里。

trace 文件抓取成功后,接下来要做的就是怎么使用这个抓到的产物。如果还有印象的话,上一篇文章我们已经讲过 Pefetto 已经为我们提供了一个可视化的网站(https://ui.perfetto.dev/),专门来解析我们所抓取的 trace 文件。

打开 https://ui.perfetto.dev/ 后,我们直接把已经抓到的 trace_file.perfetto-trace 文件拖进去即可,就会展示如下的解析之后的结果:

到这里,使用 adb shell perfetto 命令抓取 trace 文件并在网页展示的最基础的方法我们已经学会了。但可能有人会有疑问,你的抓取命令后面跟了那么长的一大串具体是什么东东,而且看着异常别扭显得很繁杂,有没有更精简的方法?答案是:有!

Perfetto 为我们提供了一种更方便更加灵活的配置化式的 trace 抓取方案: trace config 。让我们先来看一下官方提供的 config 样例 config.pbtx:

duration_ms: 10000

buffers: {
    size_kb: 8960
    fill_policy: DISCARD
}
buffers: {
    size_kb: 1280
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
            ftrace_events: "ftrace/print"
            atrace_categories: "gfx"
            atrace_categories: "view"
            atrace_categories: "webview"
            atrace_categories: "camera"
            atrace_categories: "dalvik"
            atrace_categories: "power"
        }
    }
}
data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}

注意,这是一个以 .pbtx 为后缀名的文件,使用时,我们需要先将这个文件 push 到手机目录下,而后执行如下抓取命令:

adb push config.pbtx /data/local/tmp/config.pbtx
adb shell 'cat /data/local/tmp/config.pbtx | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace'

可以看到,我们通过这种的方式也是抓取成功的,通过 config 的方式我们可以自定义抓取规则,更大的契合了各种业务的需要。

2.1.2 record_android_trace 抓取

除了 adb shell perfetto 的方式,Perfetto 还帮我们提供了一个保姆式服务的抓取脚本 record_android_trace ,它其实跟 adb shell perfetto 是同样的效果,但是它帮我们实现了傻瓜式操作,只要执行下脚本命令,后续文件抓好后会自动导入网页解析展示出来,我们直接开始分析就行,这也是 Perfetto 推荐的抓取方法。

record_android_trace 获取方式:

curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace

搭配上面讲到的 config 方式,执行如下命令即课可开启抓取:

python record_android_trace.py -c config.pbtx -o trace_file.perfetto-trace

执行完上述命令后,脚本会自动帮我们把抓到的文件导入浏览器,并可视化展现,非常方便。

2.2 Perfetto UI 抓取

除了上面的命令行抓取方式外,Perfetto 还提供了一种网页抓取的方式 Perfetto UI。

Perfett UI:https://ui.perfetto.dev/#!/record

通过网页的方式抓取要保证电脑连接你的 Android 设备后,网页端也要识别到设备的存在。然后点击右侧的 Record new trace 即可开始抓取。如果我们需要配置抓取的规则,可以通过下面的配置页面进行设置,比如抓取时长,buffer 大小等。

3. 总结

通过前面的学习,我们现在已经掌握了最简单的使用 Perfetto 抓取 trace 的三种方法:

  • adb shell perfetto
  • record_android_trace
  • Perfetto UI

然而这才只是开始,后面我们会更加深入的学习 trace 的抓取和分析,纸上得来终觉浅,小伙伴们还是要自己去尝试着操作一下,加深理解。

参考资料:https://perfetto.dev/docs/quick

<think>好的,我现在需要回答用户关于“Android camera trace”的问题。首先,我需要明确用户的问题到底在问什么。可能用户想了解的是Android系统中的摄像头追踪技术,或者是调试摄像头问题时使用的跟踪工具,比如日志或trace文件。接下来,我需要确认这两个方向的内容,然后组织回答。 首先,Android摄像头追踪可能涉及几个方面:硬件层面的摄像头传感器追踪,软件层面的图像处理或算法追踪,或者是开发调试时的日志追踪。用户提到的“trace”可能更偏向于后者,即调试和分析摄像头问题时使用的工具或方法。 接下来,我应该回顾Android系统中与摄像头相关的框架。Android Camera Framework分为应用层、Java API、Native框架、HAL层,以及驱动层。当出现摄像头问题时,trace通常涉及从应用层到底层驱动的日志收集和分析。这时候可能需要启用不同层次的日志,比如CameraService的日志、HAL层的调试信息,或者使用systrace等工具进行性能分析。 然后,我需要考虑用户可能的实际需求。如果是开发者,他们可能想知道如何启用摄像头相关的日志,如何抓取trace,或者使用哪些工具来分析摄像头性能问题。如果是普通用户,可能的问题是如何排查摄像头无法使用的情况,但普通用户可能不会直接使用trace工具,所以更可能是开发者或技术支持人员需要这些信息。 接下来,我需要整理Android中常用的trace工具和方法。例如,使用adb logcat来查看日志,通过设置属性启用详细日志(如persist.camera.log.enable),使用systracePerfetto进行系统级性能跟踪,或者使用厂商提供的特定工具。此外,在Android的相机应用中可能存在隐藏的开发者选项,可以启用更详细的日志记录。 另外,Android的Camera2 API和后来的CameraX库可能提供了不同的调试方法。需要检查这些API的文档,看看是否有相关的追踪或日志功能。例如,在Camera2中,可以通过设置相机会话的参数来获取回调信息,帮助追踪摄像头状态。 还需要考虑到不同Android版本之间的差异。比如,在Android 10及以上,项目主线(Project Treble)可能改变了HAL层的结构,影响trace的方法。此外,某些厂商可能定制了自己的摄像头堆栈,trace的方法可能有所不同,需要参考特定厂商的文档。 然后,我应该组织这些信息,分步骤解释如何启用trace,收集日志,分析问题。可能需要包括具体的adb命令,如adb shell setprop log.tag.Camera VERBOSE,或者使用systrace的步骤。同时,提醒用户在抓取trace时复现问题,以确保日志中包含相关事件。 此外,可能存在的常见问题场景,比如摄像头启动失败、预览卡顿、拍照失败等,可以举例说明如何通过trace来定位问题。例如,如果摄像头无法打开,可以检查HAL层的日志是否有权限错误或硬件初始化失败的信息。 最后,需要验证信息的准确性,确保提到的工具和方法适用于当前主流的Android版本,并注意区分通用方法和厂商特定方法。同时,建议用户查阅官方文档或资源,如Android开发者网站或AOSP代码库,以获取最新信息。</think>Android Camera Trace 通常指用于调试、分析摄像头问题(如性能、异常行为)的追踪工具或日志系统。以下是逐步介绍: --- ### 一、Android 摄像头架构分层 1. **应用层**:调用 Camera API 的 App。 2. **Java Framework**:提供 `Camera`/`Camera2` API。 3. **Native Framework**:`CameraService`(核心服务)、`CameraProvider`(HAL 接口)。 4. **HAL 层**:厂商实现的硬件抽象层(如 `android.hardware.camera.provider@2.4`)。 5. **内核驱动**:Linux 内核的摄像头驱动(如 V4L2)。 --- ### 二、关键 Trace 工具与方法 #### 1. **Logcat 日志 - **启用摄像头详细日志**: ```bash adb shell setprop persist.camera.log.enable 1 adb shell setprop log.tag.Camera VERBOSE adb logcat -c && adb logcat -v threadtime > camera.log ``` - 过滤关键字:`CAMERA`、`CameraService`、`HAL`。 #### 2. **Camera HAL 调试 - 修改 HAL 层日志级别(需 root): ```bash adb shell setprop vendor.camera.hal.debug 5 # 部分厂商使用此属性 ``` #### 3. **Systrace/Perfetto - **抓取系统Trace**: 1. 启用 `systrace` 或 `Perfetto` 工具。 2. 添加 `camera` 和 `graphics` 类别。 3. 复现问题后分析关键线程(如 `CameraService`、`Binder` 调用)。 #### 4. **厂商专用工具 - 高通:使用 `QCXLog` 或 `QCAT` 分析摄像头流水线。 - 联发科:通过 `MTKLogger` 抓取底层日志。 --- ### 三、常见问题定位 #### 场景 1:摄像头启动失败 1. **检查 Logcat**: - 搜索 `CameraService::connect` 错误,确认权限或 HAL 返回码。 - 示例错误:`STATUS_ERROR_ENUMERATE`(设备未找到)。 2. **HAL 日志**: - 检查 `camx` 或 `mm-camera` 日志(厂商相关),确认传感器初始化是否超时。 #### 场景 2:预览卡顿 1. **Systrace 分析**: - 观察 `SurfaceView` 的帧提交间隔。 - 检查 `dequeueBuffer` 是否阻塞(可能 GPU 或 Buffer 不足)。 2. **CPU/GPU 负载**: - 使用 `top` 或 `dumpsys gfxinfo` 查看资源占用。 --- ### 四、高级调试 - **启用 Camera2 调试**: ```java CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); // 使用 `dumpsys media.camera` 查看设备状态 ``` - **AOSP 源码分析**: - 关键代码路径:`frameworks/av/services/camera/libcameraservice` --- ### 五、注意事项 1. **版本差异**:Android 10+ 强制要求 Treble 架构,HAL 实现可能不同。 2. **厂商定制**:部分日志属性或工具需参考厂商文档(如高通/MTK/华为)。 通过以上步骤,可系统性定位摄像头问题(从 API 调用到驱动层)。建议结合官方文档与具体设备信息进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值