perfetto 分析camera启动性能

将启动过程拆解成 APP 、Framework、HAL 三层,分别统计三层的启动耗时

1. 启动模拟器

H:
cd H:\Sdk\emulator
.\emulator.exe -list-avds
.\emulator.exe -writable-system -avd Pixel_XL_API_32_6  -no-snapshot-load -qemu

在这里插入图片描述

2. 抓取trace

再开启一个 cmd 窗口 ,输入下面的命令

H:
cd H:\Sdk\emulator
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

在这里插入图片描述

点击 camera app 的图标,等待抓取10秒后自动结束
在这里插入图片描述

将 trace 拷贝到电脑

adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace

在这里插入图片描述
在这里插入图片描述
打开下面的网址

https://ui.perfetto.dev/

在这里插入图片描述

将 trace 文件拖到这个网页
在这里插入图片描述

3.将camera启动拆解为6个部分分析

3.1 APP层OpenCamera耗时

app Icon按下后抬起来 -----> 开始调用CameraServer的connectDevice函数

3.1.1 找到并标记 luncher 进程的第二个 deliverInputEvent

在搜索栏里面搜索 deliverInput
找到 launcher 进程里面的 deliverInputEvent, deliverInputEvent 代表点击事件,都是成对出现的,第一个deliverInputEvent 按下,第二个deliverInputEvent 代表抬起。

在这里插入图片描述

所以,我们要找到 launcher 进程里面的第二个 deliverInputEvent。先用鼠标滚轮将网页的页面缩小,这样在右面就可以看到第二个 deliverInputEvent。
在这里插入图片描述
点击 deliverInputEvent 右侧的星星
在这里插入图片描述
可以看到 deliverInputEvent 已经被抬升到最顶层,这样就很方便了
在这里插入图片描述
下面将第二个 deliverInputEvent 的耗时标记出来
鼠标左键点击 deliverInputEvent

在这里插入图片描述
然后按 shit+m,这样可以永久选中 deliverInputEvent
在这里插入图片描述

3.1.2 找到并标记 CameraServer的connectDevice函数

在搜索栏搜索 connectDevice,然后敲回车键
在这里插入图片描述
按 f 键定位到 connectDevice(有时候可能看不到定位的目标,可以上下滑动一下就看到了)
在这里插入图片描述
点击选中 connectDevice,然后按 shift+m 永久选中

在这里插入图片描述
然后点击 connectDevice 右边的星星,让其置于top层
最后,测量两个trace之间的距离,课可以看出app层打开 camera 的耗时是 1.1秒

在这里插入图片描述

3.2 HAL层OpenCamera耗时

开始调用CameraServer的connectDevice函数 -----> 结束调用CameraServer的connectDevice函数
可以看出 connectDevice 的耗时是 19.4 ms

在这里插入图片描述

3.3 APP层结束调用CameraServer的connectDevice函数 -----> 开始调用 endConfigure

搜索 endConfigure,然后按下回车键,最后再按 f 键
在这里插入图片描述
没有看到 endConfigure,只要你把鼠标网上滚动一点点就能看到了
在这里插入图片描述

点击 星星,将endConfigure至于top层
在这里插入图片描述
左键点击选中 endConfigure,然后按 shift+m 永久选中
在这里插入图片描述
测量 结束调用connectDevice 到 开始调用endConfigure,发现耗时 314.4 ms
在这里插入图片描述

3.4 HAL层开始调用 endConfigure -----> 结束调用 endConfigure

可以发现 endConfigure耗时 24.9 ms
在这里插入图片描述

3.5 APP层结束调用 endConfigure -----> 开始调用 submitRequestList

APP层结束调用 endConfigure 代表 已经创建好 Session,因此这里测量的是创建好 Session 到 下 Request 的耗时。
搜索栏搜索 submitRequestList,点击回车,再按下 f 键,定位到 submitRequestList

在这里插入图片描述
左键选中 submitRequestList,再按 shift + m 永久选中
在这里插入图片描述
测量结束调用 endConfigure -----> 开始调用 submitRequestList耗时为 1.8 ms
在这里插入图片描述

3.6 HAL层开始调用 submitRequestList -----> CameraServer 收到第一帧

first full buffer 代表 CameraServer 收到第一帧
在搜索栏搜索 first full buffer ,回车,按 f 键定位

在这里插入图片描述
可以看到这里是 stream0 的 first full buffer,也就是说每路 Stream 都有 first full buffer
点击 stream0:first full buffer ,然后按 shift + m 永久选中

在这里插入图片描述
点击星星,置于 top 层
在这里插入图片描述
测量 开始调用 submitRequestList -----> CameraServer 收到第一帧的耗时为 296.3ms
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Redmoon955331/article/details/129918685
今日推荐