perfetto 分析camera启动性能

时间:2023-01-08 01:26:41

将启动过程拆解成 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

perfetto 分析camera启动性能

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

perfetto 分析camera启动性能

点击 camera app 的图标,等待抓取10秒后自动结束
perfetto 分析camera启动性能

将 trace 拷贝到电脑

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

perfetto 分析camera启动性能
perfetto 分析camera启动性能
打开下面的网址

https://ui.perfetto.dev/

perfetto 分析camera启动性能

将 trace 文件拖到这个网页
perfetto 分析camera启动性能

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

3.1 APP层OpenCamera耗时

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

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

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

perfetto 分析camera启动性能

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

perfetto 分析camera启动性能
然后按 shit+m,这样可以永久选中 deliverInputEvent
perfetto 分析camera启动性能

3.1.2 找到并标记 CameraServer的connectDevice函数

在搜索栏搜索 connectDevice,然后敲回车键
perfetto 分析camera启动性能
按 f 键定位到 connectDevice(有时候可能看不到定位的目标,可以上下滑动一下就看到了)
perfetto 分析camera启动性能
点击选中 connectDevice,然后按 shift+m 永久选中

perfetto 分析camera启动性能
然后点击 connectDevice 右边的星星,让其置于top层
最后,测量两个trace之间的距离,课可以看出app层打开 camera 的耗时是 1.1秒

perfetto 分析camera启动性能

3.2 HAL层OpenCamera耗时

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

perfetto 分析camera启动性能

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

搜索 endConfigure,然后按下回车键,最后再按 f 键
perfetto 分析camera启动性能
没有看到 endConfigure,只要你把鼠标网上滚动一点点就能看到了
perfetto 分析camera启动性能

点击 星星,将endConfigure至于top层
perfetto 分析camera启动性能
左键点击选中 endConfigure,然后按 shift+m 永久选中
perfetto 分析camera启动性能
测量 结束调用connectDevice 到 开始调用endConfigure,发现耗时 314.4 ms
perfetto 分析camera启动性能

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

可以发现 endConfigure耗时 24.9 ms
perfetto 分析camera启动性能

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

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

perfetto 分析camera启动性能
左键选中 submitRequestList,再按 shift + m 永久选中
perfetto 分析camera启动性能
测量结束调用 endConfigure -----> 开始调用 submitRequestList耗时为 1.8 ms
perfetto 分析camera启动性能

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

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

perfetto 分析camera启动性能
可以看到这里是 stream0 的 first full buffer,也就是说每路 Stream 都有 first full buffer
点击 stream0:first full buffer ,然后按 shift + m 永久选中

perfetto 分析camera启动性能
点击星星,置于 top 层
perfetto 分析camera启动性能
测量 开始调用 submitRequestList -----> CameraServer 收到第一帧的耗时为 296.3ms
perfetto 分析camera启动性能