Systrace分析知识点

news2024/11/24 13:31:30

3bd3725ddfbbfe4024051d3feb0e61fc.gif

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

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

一、抓取Systrace
二、CPU模块知识点
三、input 点击事件处理流程
四、Vsync 事件处理
五、Android 绘制一帧流程分析
六、Camx Trace TAG开启方法
七、参考文献

一、抓取Systrace

1.1 使用手机抓取

使用Google 预留的开发者模式中的 系统跟踪 功能抓取systrace。
步骤:
设置--开发者模式--系统跟踪
trace文件保存路径:
/data/local/traces

96c4cd77cd18255af1deb45af08fd3f1.png

手机抓取trace

抓取完之后使用adb 命令 pull 出来即可

C:\Users\ >adb pull /data/local/traces .
/data/local/traces/: 1 file pulled, 0 skipped. 95.1 MB/s (51342186 bytes in 0.515s)

C:\Users\ >
1.2 python 命令抓取

参考命令如下:

python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

比较麻烦,需要安装环境,不推荐,有成熟脚本除外。

二、CPU模块知识点

2.1 CPU频率,CPU loading 计算

CPU loading 计算公式
CPU 负载loading = Wall duration ÷ 选择CPU 个数÷ 选择CPU的范围

80562a33d5cea77347db37ce700f334e.png

CPU Loading

2.2 Thread 在CPU中的状态
  • 绿色:运行中 Running
    对于在CPU上执行的进程,需要查看其运行时间、是否跑在该跑的核上、频率是否够等。

  • 浅绿色:可运行 Runnable
    对于在等待序列中的进程,需要查看是否有过多任务在等待、等待时间是否过长等。

  • 白色:休眠中 Sleeping
    这里一般是在等事件驱动。

  • 橘色:不可中断的睡眠态_IO_Block Uninterruptible Sleep | WakeKill - Block I/O
    线程在I / O上被阻塞或等待磁盘操作完成。

  • 紫色:不可中断的睡眠态 Uninterruptible Sleep
    线程在另一个内核操作(通常是内存管理)上被阻塞。

举例如下:

d814f64bf9635e2d91f0288ab67bc84b.png

Thread 在CPU中的状态

2.3 CPU 唤醒关系查看
  1. 首先点击查看当前线程正在哪个 CPU 中运行

14b98fe1ba04aca93fdd7d051d132664.png

CPU 唤醒关系查看一

  1. 点击查看 Thread 的 箭头,既可以查看是被谁唤醒的

22f0d0117c987277d9edb5d4afc0e595.png

CPU 唤醒关系查看二

三、input 点击事件处理流程

3.1 Android 点击事件处理流程概览
  1. SystemServer AppLaunch_dispatchPtr:Up 处理点击up事件

  2. SystemServer 通过InputReader读取屏幕点击事件后,将点击事件通过InputDispatcher 进行分发

  3. SystemServer OutboundQueue 接收存放即将派发给AppConnection 的点击事件

  4. SystemServer WaitQueue接收存放已经派发给AppConnection ,但 App还在处理且没有返回成功的点击事件

  5. Launcher deliverInputEvent: Launcher 桌面 被input事件唤醒

  6. Camera APP bind 通过跟SystemServer bind 调用,开始启动Camera

3.2 Android 点击事件处理流程图

Android 点击事件处理流程图如下:

b33acce6fdc85db948c92b9f4302a628.png

Android 点击事件处理流程图

3.2 Android 点击事件处理关键TAG
TAG名字所在进程备注
AppLaunch_dispatchPtr:DownSystemServer点击Down事件
AppLaunch_dispatchPtr:UpSystemServer点击up事件
InputReaderSystemServer点击事件读取
InputDispatcherSystemServer点击事件分发
oqSystemServerOutBoundQueue 点击事件存放
wqSystemServerWaitQueue 点击事件待消费返回
deliverInputEventLauncherapp 点击事件消费

四、Vsync 事件处理

Vsync 信号可以由硬件产生,也可以用软件模拟,不过现在基本上都是硬件产生,负责产生硬件 Vsync 的是 HWC,HWC 可生成 VSYNC 事件并通过回调将事件发送到 SurfaceFlinger , DispSync 将 Vsync 生成由 Choreographer 和 SurfaceFlinger 使用的 VSYNC_APP 和 VSYNC_SF 信号

4.1 VSYNC_app信号app处理

第一阶段:
App 在收到 Vsync-App 的时候,在主线程进行 measure、layout、draw(构建 DisplayList , 里面包含 OpenGL 渲染需要的命令及数据) 。这里对应的 Systrace 中的主线程 doFrame 操作

第二阶段:
CPU 将数据上传(共享或者拷贝)给 GPU, 这里 ARM 设备 内存一般是 GPU 和 CPU 共享内存。这里对应的 Systrace 中的渲染线程的 flush drawing commands 操作

第三阶段:
通知 GPU 渲染,真机一般不会阻塞等待 GPU 渲染结束,CPU 通知结束后就返回继续执行其他任务,使用 Fence 机制辅助 GPU CPU 进行同步操作

第四 阶段:
swapBuffers,并通知 SurfaceFlinger 图层合成。这里对应的 Systrace 中的渲染线程的 eglSwapBuffersWithDamageKHR 操作
VSYNC_app信号处理流程如下:

c1c3d5949f3dd1c400180a1cabf2c6e2.png

VSYNC_app信号处理

4.2 VSYNC_sf 信号SF处理

第五阶段:
SurfaceFlinger 开始合成图层,如果之前提交的 GPU 渲染任务没结束,则等待 GPU 渲染完成,再合成(Fence 机制),合成依然是依赖 GPU,不过这就是下一个任务了.这里对应的 Systrace 中的 SurfaceFlinger 主线程的 onMessageReceived 操作(包括 handleTransaction、handleMessageInvalidate、handleMessageRefresh)SurfaceFlinger 在合成的时候,会将一些合成工作委托给 Hardware Composer,从而降低来自 OpenGL 和 GPU 的负载,只有 Hardware Composer 无法处理的图层,或者指定用 OpenGL 处理的图层,其他的 图层偶会使用 Hardware Composer 进行合成

第六阶段 :
最终合成好的数据放到屏幕对应的 Frame Buffer 中,固定刷新的时候就可以看到了
VSYNC_sf 信号SF处理流程如下:

6cff8eeb03c65e8aa2d48f53ff87470c.png

VSYNC_sf 信号SF处理

五、Android 绘制一帧流程分析

5.1 显示一帧流程概览

58ba18e40d50889bf256c183a67cac0a.jpeg

程序员Android

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-5d802da2815c12f2.png

5.1.1 Android 显示一帧大致分为下面 八步:
  1. App 接收到 vsync-app 信号后开始工作。

  2. App 主线程被Message唤醒,执行onVsync。

  3. App 执行 doFrame ,处理input、animation、traversal、draw等。

  4. App UIThread 跟RenderThread sync 数据。

  5. App 执行DrawFrame,从SurfaceFlinger(后续简称SF) 的 BufferQueue 中 Dequeue buffer,取出一个bufffer后,执行渲染绘制,接着将绘制好的Buffer 通过queuebuffer 放回到。BufferQueue中给 SF消费。

  6. App queuebuffer 后, SF 中对应的 app buffer 会增加 +1。

  7. Vsync-sf 到来后,SF 从BufferQueue 中 acquireBuffer一个Buffer 进行消费, 对应SF 中的 app buffer 会减 - 1 , SF 消费处理后,通过 releaseBuffer 将buffer 归还到BufferQueue 中。

  8. SF 通过 bind 跟 Hardware Composer HAL(简称HWC) 进行通信,通过一些处理后显示到手机屏幕上。

5.2 生产者,消费者 BufferQueue 流转图

ea6988879b7506d93bb7d02257404735.jpeg

生产者,消费者 BufferQueue 流转图

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png

  1. dequeue(生产者发起) :
    当生产者需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和使用标记。

  2. queue(生产者发起):
    生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。

  3. acquire(消费者发起) :
    消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容

  4. release(消费者发起) :
    当消费者操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列

5.3 App ,SF Buffer 交互图

f89fb0a2fca8ceb921b8407479f25d4d.jpeg

App ,SF Buffer 交互图

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png

  1. App 通过bind 向SF dequeuebuffer 进行buffer申请

  2. SF 对端完成对bufferQueue 的dequeuebuffer的申请

  3. App 处理合成完后,通过binder向SF queuebuffer 申请buffer 入队。

  4. SF 对端通过queuebuffer 完成buffer 对BufferQueue的入队申请,供SF消费并显示到屏幕上

5.4 SF 跟 HWC 交互图

SurfaceFlinger 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。

7f05696f8d835e51e6f880273fa5bdd7.jpeg

SF 送显图

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.png

3fa9358396cb572b40c6f56d714cddbd.jpeg

SF 跟 HWC 交互图

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png

  1. vsync-sf 周期到来,SF 开始绘制准备工作

  2. SF 通过 acquirebuffer 从BufferQueue 中取出一帧进行消费

  3. App 对应的BufferQueue 在SF acquirebuffer 后对那个的值会 -1

  4. App 对应的buffer 值为 2

  5. App 对应的buffer值 在SF acquirebuffer 后变为 1

  6. SF 跟HWC 通过binder 通信处理完后,通过rleasebuffer将buffer 归还到BufferQueue中,紧接着一帧就可以显示出来

六、Camx Trace TAG开启方法

6.1 打开 Camx HAL 层 camx log tag

执行以下命令,打开camx trace log tag

adb root
     adb remount
     adb shell mkdir /vendor/etc/camera
     adb shell rm -rf  /vendor/etc/camera/camxoverridesettings.txt
     adb shell touch  /vendor/etc/camera/camxoverridesettings.txt
     adb shell "echo traceGroupsEnable=0x10080 >> /vendor/etc/camera/camxoverridesettings.txt"
     adb shell "echo traceErrorEnable=TRUE >> /vendor/etc/camera/camxoverridesettings.txt"
     adb shell "echo traceOutputEnable=0x10080 >> /vendor/etc/camera/camxoverridesettings.txt"
     adb shell cat /vendor/etc/camera/camxoverridesettings.txt
     adb reboot
6.2 重启手机后打开kernel 的trace开关

重启后打开kernel trace 开关

adb root
       adb remount
       adb shell "echo 1 > /sys/kernel/tracing/events/camera/enable"

七、参考文献

【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

126be1c45f15ceac8393f68cbf7b709b.jpeg

点击阅读原文,为大佬点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理类联考——英语——趣味篇——刷题需要实现什么目的?

刷题需要实现什么目的?  第一:在真题中巩固考研英语基础 在掌握一定的词汇量和句子分析能力后,开始一字不漏、逐字逐句的完成历年真题的超精读。抄写真题中生词,继续夯实词汇、分析长难句翻译,弄清楚题目中正确选项为…

Science: 功能饮料里面的这种添加剂会使动物寿命更长——这对人类意味着什么尚不清楚...

一项研究表明,当喂食大量牛磺酸(一种常见的健康补充剂和能量饮料成分,最早从牛黄中分离出来)时,老年小鼠、线虫和猴子可以活得更长或更健康。研究人员证明,这种天然氨基酸的水平与动物的衰老有关&#xff0…

STM32之外设DMA

DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或…

Triton教程 -- 模型仓库

Triton教程 – 模型仓库 文章目录 Triton教程 -- 模型仓库存储库布局模型存储库位置本地文件系统 具有环境变量的云存储谷歌云存储S3Azure 存储带凭证文件的云存储(测试版) 模型版本模型文件TensorRT 模型ONNX 模型TorchScript 模型TensorFlow 模型OpenV…

滴滴实时数据链路建设组件选型实践篇

写在前面 随着滴滴内部技术栈的不断统一,实时相关技术组件资源的不断整合,各业务线实时数据相关开发经验的不断沉淀,基本形成了一套面向公司不同业务场景需求的最佳技术选型和具体落地方案。但同时我们也发现,大部分实时开发同学在…

React基础教程(一):React简介

React基础教程(一):React简介 1、React是什么? 发生请求获取数据处理数据(过滤,整理格式等)操作DOM呈现页面 2、谁开发的 由Facebook的软件工程师 Jordan Walke创建于2011年部署于Facebook的newsfeed随后在2012年部…

一本书让你彻底搞懂安卓系统性能优化

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Transformer详解,中文版架构图

2.2.1 “编码器-解码器”架构 Seq2Seq 思想就是将网络的输入输出分别看作不同的序列,然后实现序列到序列 的映射,其经典实现结构就是“编码器-解码器”框架。编码器-解码器框架如图 2.7 所 示。 图2.7 编码器-解码器的基本框架 在 Seq2Seq 思想应用于自然…

机器鸟实现摆动尾巴功能

1. 功能说明 本文示例将实现R329样机机器鸟摆动尾巴的功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 电路连接…

新的挑战:WebGL

这段时间一直在死磕 Chromium 的 8K 高清视频播放,虽然之前写过一些关键技术的实现,主要难点差不多攻破,但投入到产品中,依然还要解决很多实际中的问题,比如卡顿、格式支持、音视频不同步等等。前期的相关文章&#xf…

RocketMQ基础API使用以及基本原理探究

文章目录 同步发送异步发送单向发送拉模式随机获取一个queue的消息指定一个queue的消息 顺序消息广播消息延迟消息批量消息过滤消息Tag过滤sql过滤 事务消息RocketMQ常见问题RocketMQ如何保证消息不丢失?RocketMQ的消息持久化机制RocketMQ如何保证消息顺序RocketMQ事…

Day07 Python函数详解

文章目录 第四章 Python函数使用4.1. 函数介绍4.2. 函数的定义与使用4.2.1. 函数的定义4.2.2. 调用 4.3. 函数的参数4.4. 函数的返回值4.4.1. 返回值介绍4.4.2. None类型 4.5. 函数说明4.5.1. 函数注释4.5.2. 函数的4中定义方式4.5.3. 函数的调用 4.6. 函数的嵌套调用4.7. 函数…

哪款 IMG BXS GPU 适合您的汽车?

Imagination 是汽车行业领先的图形处理器供应商。Imagination 的 GPU IP 经过了九代更新迭代,为车辆提供了舒适性和安全性,在汽车行业的总出货量接近 5 亿。通过将响应迅速的 HMI(人机界面)与功能日益强大的高级驾驶员辅助系统相结…

Linux:主机状态监控

查看系统的资源占用 可以通过top命令,查看系统CPU、内存使用情况 top命令内容详解: 第一行:top:命令名称,10.49.16:当前系统时间,up 4:40:启动了4小时40分,4 users&#…

Aspose.Pdf使用教程:为PDF文件添加swf注释

Aspose.PDF 是一款高级PDF处理API,可以在跨平台应用程序中轻松生成,修改,转换,呈现,保护和打印文档。无需使用Adobe Acrobat。此外,API提供压缩选项,表创建和处理,图形和图像功能&am…

STL之priority_queue与仿函数

目录 一.仿函数1.介绍2.示例 二.priority_queue1.介绍2.成员函数3.模拟实现4.使用 三.其他1.typename Container::value_type 一.仿函数 1.介绍 函数对象,又称仿函数,是可以像函数一样使用的对象,其原理就是重载了函数调用符:()…

浅谈数据中台之标签管理平台

在现如今的大数据时代,相信大家一定了解或者听说过下列几个场景: 购物APP:千人千面,意思不同用户使用相关的产品感觉是不一样的,不同用户看到的购物APP首页推荐内容和其他相关推荐流信息可能是完全不同的。 社交APP&…

实例:使用网络分析仪进行电缆测试

本应用测试针对非标称50Ω的线缆,包括同轴、双绞线、差分高速数据线的测试,包括阻抗参数、S参数(插损、驻波、Smith图等等),也可以绘制眼图。 根据电缆的性能,如频率范围、长度、是否差分,设置…

Linux:root用户

root用户对Linux系统拥有最大的操作权限。 普通用户的权限一般都在home目录下,超过home目录后,普通用户在很多地方只有只读和执行的权限,但没有修改权限。 1、su命令:切换到root用户的命令语法: su -root “-”符号是可…

精密空调监控:不会这个技巧,千万不要尝试

随着科技的不断进步和信息化的发展,精密空调设备被广泛应用于数据中心、通信基站、医疗设施、实验室等对温度和湿度要求严格的环境中,以保证设备的正常运行和数据的安全性。 借助动环监控系统,精密空调可以实时了解设备的运行状态、温湿度的变…