十、Camera 启动流程分析

本文详细解析了Android系统中Camera应用从启动到预览帧显示的完整流程,包括CameraAPP与Launcher的交互、CameraAPP与FWKCameraService的HIDL通信、CameraFWK与CameraHAL的流配置以及预览帧的显示过程。内容涵盖了从用户点击图标到预览帧在屏幕上显示的各个关键步骤和涉及的关键技术点。
摘要由CSDN通过智能技术生成

bf53efe05dfd7176fd50e058472a059a.gif

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

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

一、Camera 启动流程概览
二、Launcher 跟Camera APP 交互
三、Camera app 与FWK Camera Service 交互
四、Camera FWK 与 Camera HAL 交互
五、Camera FWK、Camera app、SF 交互送显

一、Camera 启动流程概览

8ed8224d42cd9ae14bdbe6d0a75544a7.jpeg

Camera 启动流程概览

原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-76bb736b92c7b871.png

1.1 Camera 启动流程拆解
  1. 点击Launcher 中 Camera app icon, Launcher 处理点击事件,关键字:deliverInputEvent(AppLaunch_dispatchPtr:Up )

  2. Camera app 执行activity的onCreate 、onStart 、onResume等动作,关键字:activityStart,activityResume

  3. Camera app 下发 onOpen,opensession等动作,对应Framework CameraService 的关键字:CameraHal::openSession

  4. open Camera 后开始对camera进行一些配置,对应的FWK 关键字:CameraHal::configureStreams

  5. Camera 配完流之后,app开始获取预览请求,对应的FWK 关键字:setRepeatingRequest

  6. App 请求之后,Framework 、HAL 层处理之后,返回第一帧给FWK ,关键字:first full buffer

  7. FWK call back 第一帧后,对应的app SurfaceView的buffer 会 +1

  8. vsync-sf 到来之后,SF 从app对应的SurfaceView 的buffer 取出数据进行合成并显示到屏幕上,对应的SurfaceView buffer -1

  9. SF 拿到buffer后通过binder 跟HWC 通信,然后刷新显示到屏幕上,这时候我们可以看到预览第一帧。

  10. Camera app 布局合成第一个buffer

1.2 Camera trace 关键字
启动阶段模块trace 关键字
S1系统deliverInputEvent(AppLaunch_dispatchPtr:Up ) ⇒ activityStart
S2Camera APPactivityStart ⇒ CameraHal::openSession
S3Camera HALCameraHal::openSession
S4Camera APPCameraHal::openSession end ⇒ CameraHal::configureStreams start
S5Camera HALCameraHal::configureStreams
S6Camera APPCameraHal::configureStreams end ⇒ setRepeatingRequest start
S7Camera HALsetRepeatingRequest start ⇒ first full buffer
S8Camera APP、SFfirst full buffer ⇒ 第一帧显示(onPreviewOk)

二、Launcher 跟Camera APP 交互

Launcher 跟 Camera app 交互图如下:

60ca542678dc6d401f883698d1ac7f26.jpeg

Launcher 跟Camera APP 交互图

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

2.1 Launcher 跟Camera APP 交互拆解
  1. launcher 点击事件处理

  2. Camera App mainActivity 的 onCreate、onStart、onResume 处理。

三、Camera app 与FWK Camera Service 交互

17e0ce6437551654aaf51480768387a2.jpeg

Camera app 与 Camera FWK交互图

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

3.1 Camera app 与FWK Camera Service 交互拆解步骤
  1. Camera app 练级并下发打开Camera 的opensession

  2. Camera FWK 处理App 下发的 openSession,并通过HIDL 跟Camera HAL进行通信

  3. Camera Sensor 打开后,根据不同的Feature 配置不同的流信息。

四、Camera FWK 与 Camera HAL 交互

8f4841607f813ee24777b5d4421b9755.jpeg

Camera FWK 与 Camera HAL 交互图

原图查看链接:

https://upload-images.jianshu.io/upload_images/5851256-9b8429d750ea41d5.png

4.1 Camera FWK 与 Camera HAL 交互拆解
  1. Camera FWK Opensession 通过HIDL 跟 Camera HAL 进行通信

  2. Camera HAL 处理openSession。

  3. Camera FWK 在Camera Sesnor 打开后,开始执行configurestreams。

  4. 通过HIDL Camera HAL 处理Camera FWK 传递的configurestream 。

  5. Camera FWK 开始执行第一帧预览请求,关键字:setRepeatingRequest

  6. Camera HAL 处理 Camera FWK 传下来的processcaptureRequest请求,并通过processCaptureResult callback 上去。

五、Camera FWK、Camera app、SF 交互送显

dd5c89cec55bc2ed0807504e8087041f.jpeg

Camera FWK、Camera app、SF 交互送显

原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-283fa9c17c5fd281.png

Camera FWK、Camera app、SF 交互送显拆解
  1. Camera FWK 返回第一帧 :关键字 first full buffer

  2. Camera App SurfaceTexture 获取到Camera FWK 返回的第一帧

  3. ImageReader 获取Camera FWK 返回的第一帧

  4. Camera App 开始 dequeueBuffer ,对返回的第一帧进行处理。

  5. Camera App 处理完后通过queuebuffer,将处理完的buffer 放到SF 对应的BufferQueue中,同时对应的Camera 的SurfaceView 的buffer值 +1

  6. vsync-sf 到来之后,SF 从BufferQueue中取出一个buffer 进行消费并送显,对应的Camera App 的buffer -1

六、Camera冷启动阶段分析补充

fc6bb04b3164d05d720cb472286196b6.png

冷启动阶段会比热启动阶段多大致以下流程

PostFork --> ZygoteInit-->ActivityThreadMain-->bindApplication-->activityStart(后面同上分析)

6.1 阶段分析解释
  1. PostFork 耗时需要排查 Zygote.java 代码

Zygote.java frameworks\base\core\java\com\android\internal\os

  1. ZygoteInit 耗时需要排查ZygoteInit.java 代码

ZygoteInit.java frameworks\base\core\java\com\android\internal\os

  1. ActivityThreadMain耗时需要排查ActivityThread.java代码

ActivityThread.java frameworks\base\core\java\android\app

  1. bindApplication 耗时需要排查ActivityThread.java代码,同上

  2. activityStart App 开始执行 MainActivity 一系列 onCreate,onStart,onResume,openCamera等操作

7 参考文献

  1. 012_相机性能优化.pdf

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

友情推荐:

Android 开发干货集锦

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

b7ff947cc37a67698b0a5436350707ce.jpeg

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值