将启动过程拆解成 APP 、Framework、HAL 三层,分别统计三层的启动耗时
文章目录
- 1. 启动模拟器
- 2. 抓取trace
- 3.将camera启动拆解为6个部分分析
- 3.1 APP层OpenCamera耗时
- 3.1.1 找到并标记 luncher 进程的第二个 deliverInputEvent
- 3.1.2 找到并标记 CameraServer的connectDevice函数
- 3.2 HAL层OpenCamera耗时
- 3.3 APP层结束调用CameraServer的connectDevice函数 -----> 开始调用 endConfigure
- 3.4 HAL层开始调用 endConfigure -----> 结束调用 endConfigure
- 3.5 APP层结束调用 endConfigure -----> 开始调用 submitRequestList
- 3.6 HAL层开始调用 submitRequestList -----> CameraServer 收到第一帧
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