MTK 相机多帧拍照systrace 拆解笔记

MTK多帧拍照流程systrace分析

ed1816b631d504c7d60440cb4db3af28.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、多帧拍照请求概览
二、多帧拍照回帧概览

一、多帧拍照请求概览

多帧拍照请求概览如下:

aef2754401b19746660f9493dc936698.png
多帧拍照请求
1.1 APP 下发拍照请求到 Camera Framework
1.1.1 Trace关键字如下:

APP:
deliverInputEvent: app 点击事件处理
CameraUnitCamera2ImplTakePicture: app 下发拍照请求
binder transaction :通过bind 跟FWK交互

FWK:
binder reply :响应app 下发的bind
submitRequestList:Camera FWK提交拍照请求给HAL,并包含拍照帧数
captureList
submitRequestsHelper
createCaptureRequest :比如多帧会下发4 帧
queueRequestList
unpauseForNewRequests:暂停新的拍照请求

1.1.2 详细请看下面trace 截图
fdf135ffc597a6156009bedce53eb972.png
1.1.3 下发4帧请求createCaptureRequest
daec626958b76d6e2c9f28685056d141.png
请求4帧
1.2 Camera Framework下发拍照请求到 camera HAL中
1.2.1 Trace关键字如下:

FWK:
sendRequestsBatch:Camera FWK 下发批处理请求
CameraHal::processBatchCaptureRequests: Camera FWK 每帧请求到HAL
HIDL::ICameraDeviceSession::processCaptureRequest_3_4::client: Camera 向Camera HAL请求一帧
binder transaction

CAM HAL:
binder reply
HIDL::ICameraDeviceSession::processCaptureRequest_3_4::server :Camera HAL接受处理Camera FWK 请求
processCaptureRequest_3_4
processCaptureRequest
submitOneRequest
onRequest_EvaluateRequest
evaluateRequest
FeatureSettingPolicy::evaluateRequest
evaluateCaptureSetting
negotiate
onRequest_ProcessEvaluatedFrame
processEvaluatedFrame
onProcessEvaluatedFrame
submitZslRequest:Camera HAL 提交拍照请求帧
makePipelineFrame
queue|requestNo:97 frameNo:97
onFrameUpdated

1.2.2 详细请看下面trace 截图
13e10068f46a8aa592a1590aa6eeb83a.png
1.2.3 拍照log关键字:

control.captureIntent:2|capture req#
拍照log 如下:

01-02 09:05:10.695442  1161  1642 I mtkcam-PipelineModelSession: [submitRequest] <Default/1> requestNo:94 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:2 control.enableZsl:1 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:2 }
01-02 09:05:10.695560  1161  1642 I mtkcam-FeatureSettingPolicy: [evaluateCaptureSetting] (0xb4000075a3a43020) capture req#:94
01-02 09:05:10.734815  1161  1642 I mtkcam-PipelineModelSession: [submitRequest] <Default/1> requestNo:95 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:2 control.enableZsl:1 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:2 }
01-02 09:05:10.734937  1161  1642 I mtkcam-FeatureSettingPolicy: [evaluateCaptureSetting] (0xb4000075a3a43020) capture req#:95
01-02 09:05:10.770126  1161  1645 I mtkcam-PipelineModelSession: [submitRequest] <Default/1> requestNo:96 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:2 control.enableZsl:1 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:2 }
01-02 09:05:10.770526  1161  1645 I mtkcam-FeatureSettingPolicy: [evaluateCaptureSetting] (0xb4000075a3a43020) capture req#:96
01-02 09:05:10.795720  1161  1645 I mtkcam-PipelineModelSession: [submitRequest] <Default/1> requestNo:97 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:2 control.enableZsl:1 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:2 }
01-02 09:05:10.795846  1161  1645 I mtkcam-FeatureSettingPolicy: [evaluateCaptureSetting] (0xb4000075a3a43020) capture req#:97
01-02 09:05:10.958217  1161  1642 I mtkcam-FeatureSettingPol
<think>首先,用户的问题是:“我想查找使用systrace拆解内存信息的方法 请问如何使用systrace拆解内存信息”。所以,我需要提供关于如何使用Systrace来分析和拆解内存信息的方法。 回想系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户提供的引用: - 引用[1]:讨论了camera性能问题的分类,性能分析工具包括Systrace、perfetto trace、Simpleperf等。还提到区分性能问题和内存问题的方法。 - 引用[2]:关于内存泄漏在Camera HAL3中的分析,具体到max_buffers和maxNumBuffers。 用户的问题是针对Systrace和内存信息的,所以我需要专注于Systrace如何用于内存分析。 关键点: - Systrace主要用于性能分析,追踪系统事件、CPU使用、线程调度等。它可能不是直接用于内存分析的工具。 - 引用[1]中提到:“Systrace & perfetto trace:推荐使用perfetto,图形化界面非常友好,目前比较流行”。但用户的问题是使用Systrace拆解内存信息。 - 内存分析通常使用其他工具,如Simpleperf(火焰图)、meminfo、Valgrind等。引用[1]提到内存问题时使用dump meminfo和backtrace。 - Systrace可能不是最佳工具用于详细内存占用分析;它更地关注性能事件。 如何回应: - 我需要诚实回答:Systrace主要用于性能追踪,而不是直接内存分析。 - 但可以提供相关信息:Systrace可以与内存事件结合使用,或者使用其他工具如Perfetto(Systrace的后继者)来进行更全面的分析。 - 参考引用:引用[1]中提到perfetto trace是更现代的推荐工具。 结构化回答: 1. **澄清Systrace的用途**:解释Systrace主要用于性能分析,而不是内存分析。 2. **提供替代方案**:建议使用更适合内存分析的工具,如Perfetto、Simpleperf、adb shell dumpsys meminfo等。 3. **如果可能,指导如何使用Systrace相关工具**:Perfetto是Systrace的升级版,可能支持更事件,包括内存。 4. **生成相关问题**:在回答结束时,添加相关问题。 确保中文回答。 步骤: - 引入:解释Systrace的主要功能。 - 详细方法:描述如何使用Systrace或相关工具来间接分析内存。 - 引用来源:自然地添加引用标识,基于提供的引用。 - 结束:添加相关问题。 可能的回答大纲: 1. Systrace主要用于追踪系统性能事件,如CPU调度、率、应用启动时间等。它不是专为内存分析设计的。 2. 对于内存分析,推荐使用其他工具: - Perfetto:类似Systrace但更强大,支持内存事件(如果有相应的事件源)。 - Simpleperf:用于函数级性能分析,包括内存使用。 - adb shell dumpsys meminfo:直接获取内存信息。 3. 如果用户坚持使用Systrace,解释如何配置以捕获内存相关事件(但Systrace的标准事件可能不包括详细内存)。 4. 基于引用[1],强调区分性能问题和内存问题的方法。 生成相关问题: - Systrace的进阶使用方法有哪些? - 如何利用Perfetto进行内存泄漏分析? - 在Android开发中,常见的内存分析工具有哪些? 添加引用标识: - 在提到引用内容时,自然地添加[^1]或[^2]。 最终回答结构: - 开头回答用户问题。 - 分步骤解释。 - 结尾生成相关问题。 </think>### 回答:如何使用Systrace拆解内存信息 Systrace 是一款强大的 Android 性能分析工具,主要用于追踪系统级事件(如 CPU 调度、线程阻塞、率和应用启动时间等),但它**并非专为内存分析设计**。Systrace 侧重于性能瓶颈的识别,而非直接展示内存占用细节(如堆分配、泄漏检测)。不过,通过结合其他工具和配置,可以间接利用 Systrace 辅助分析内存相关性能问题。以下是具体方法,分步骤说明: #### 1. **理解 Systrace 的局限性** - Systrace 的核心功能是捕捉内核事件和用户空间事件。它**无法直接显示内存占用数据**(如详细堆大小或对象分配),因为内存分析通常需要专用工具(如 Simpleperf 或 Perfetto)。 - 在引用[^1]中提到,Systrace 和 Perfetto 是性能分析的常用工具,但内存问题(如泄漏)需依赖其他方法,例如解析堆栈或 dump meminfo。 - 建议:优先使用 Systrace 排查性能问题(如响应延迟),内存分析则转向专用工具。 #### 2. **间接拆解内存信息:结合 Systrace 与内存事件** 虽然 Systrace 不原生支持内存指标,但可以通过以下配置间接关联内存事件: - **启用内存相关 Trace 事件**(需 Android 系统支持): - 在 Systrace 命令中添加 `-t <trace-time> --app=<your-package-name> sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory`。 - 关键参数 `memory` 尝试捕获内存事件(如分配/回收),但并非所有设备都完整支持此事件源。 - 示例命令(终端执行): ```bash python systrace.py -t 10 -o trace.html memory sched gfx ``` 这将生成 HTML 报告,查看 `memory` 事件段是否包含内存操作(如 `malloc` 或 `free`),但数据往往较抽象。 - **分析性能事件中的内存线索**: - Systrace 报告中的线程阻塞或高 CPU 使用可能间接指向内存问题(如 GC 频繁触发导致卡顿)。 - 例如:在报告中查找 `binder` 或 `hal` 事件,如果这些事件耗时异常长,可能暗示内存泄漏导致资源竞争[^1]。 #### 3. **推荐替代工具:更适合内存分析** 由于 Systrace 的内存分析能力有限,建议结合以下工具进行完整内存拆解: - **Perfetto**(Systrace 的后继者): - Perfetto 提供更强大的内存追踪功能,支持捕获堆分配、内存映射等事件。 - 用法:在 Perfetto UI 中启用 `Memory` 事件源,生成火焰图查看函数级内存调用关系。 - 优势:图形化界面友好,可直接关联性能与内存数据[^1]。 - **Simpleperf(火焰图)**: - 专为函数级分析设计,可追踪内存分配路径(例如 `malloc` 调用)。 - 用法:通过 `simpleperf record` 捕获数据,生成火焰图定位高内存函数。 - **adb 命令**: - `adb shell dumpsys meminfo <package-name>`:直接查看应用内存状态(如 heap size)。 - `adb shell procrank`:获取系统级内存使用排名。 - 在引用[^1]中强调,内存泄漏问题需结合 `dump meminfo` 和代码排查。 - **集成分析**: - 先用 Systrace 识别性能瓶颈点(如某 HAL 层耗时过高),再切换至 Perfetto 或 Simpleperf 深入分析内存原因。例如,如果 Camera HAL 事件在 Systrace 中显示延迟,可怀疑是缓冲区内存问题(如引用[^2]中提到的 `camera3_stream_t max_buffers` 配置错误)。 #### 4. **最佳实践和注意事项** - **场景适配**:针对 Camera 等场景(如引用[^1]中的启动或拍照类问题),优先区分性能 vs. 内存问题。内存问题通常伴随 `total` 内存异常增长或 backtrace 日志[^1]。 - **复现问题**:本地复现测试场景后,使用组合工具: 1. Systrace 或 Perfetto 捕获整体事件。 2. Simpleperf 分析函数内存。 3. `dumpsys meminfo` 验证内存泄漏。 - **工具局限**:Systrace 在内存拆解上较弱,Perfetto 是更优选择;复杂内存泄漏需代码审查或 Valgrind。 总之,Systrace 主要用于性能事件追踪,拆解内存信息需依赖 Perfetto 或 Simpleperf 等工具。始终结合测试场景和数据对比定位问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值