
和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、Camera 启动流程概览
二、Launcher 跟Camera APP 交互
三、Camera app 与FWK Camera Service 交互
四、Camera FWK 与 Camera HAL 交互
五、Camera FWK、Camera app、SF 交互送显
一、Camera 启动流程概览

Camera 启动流程概览
原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-76bb736b92c7b871.png
1.1 Camera 启动流程拆解
- 点击Launcher 中 Camera app icon, Launcher 处理点击事件,关键字:deliverInputEvent(AppLaunch_dispatchPtr:Up ) 
- Camera app 执行activity的onCreate 、onStart 、onResume等动作,关键字:activityStart,activityResume 
- Camera app 下发 onOpen,opensession等动作,对应Framework CameraService 的关键字:CameraHal::openSession 
- open Camera 后开始对camera进行一些配置,对应的FWK 关键字:CameraHal::configureStreams 
- Camera 配完流之后,app开始获取预览请求,对应的FWK 关键字:setRepeatingRequest 
- App 请求之后,Framework 、HAL 层处理之后,返回第一帧给FWK ,关键字:first full buffer 
- FWK call back 第一帧后,对应的app SurfaceView的buffer 会 +1 
- vsync-sf 到来之后,SF 从app对应的SurfaceView 的buffer 取出数据进行合成并显示到屏幕上,对应的SurfaceView buffer -1 
- SF 拿到buffer后通过binder 跟HWC 通信,然后刷新显示到屏幕上,这时候我们可以看到预览第一帧。 
- Camera app 布局合成第一个buffer 
1.2 Camera trace 关键字
| 启动阶段 | 模块 | trace 关键字 | 
|---|---|---|
| S1 | 系统 | deliverInputEvent(AppLaunch_dispatchPtr:Up ) ⇒ activityStart | 
| S2 | Camera APP | activityStart ⇒ CameraHal::openSession | 
| S3 | Camera HAL | CameraHal::openSession | 
| S4 | Camera APP | CameraHal::openSession end ⇒ CameraHal::configureStreams start | 
| S5 | Camera HAL | CameraHal::configureStreams | 
| S6 | Camera APP | CameraHal::configureStreams end ⇒ setRepeatingRequest start | 
| S7 | Camera HAL | setRepeatingRequest start ⇒ first full buffer | 
| S8 | Camera APP、SF | first full buffer ⇒ 第一帧显示(onPreviewOk) | 
二、Launcher 跟Camera APP 交互
Launcher 跟 Camera app 交互图如下:

Launcher 跟Camera APP 交互图
原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-1a04e920e4b9e4a1.png
2.1 Launcher 跟Camera APP 交互拆解
- launcher 点击事件处理 
- Camera App mainActivity 的 onCreate、onStart、onResume 处理。 
三、Camera app 与FWK Camera Service 交互

Camera app 与 Camera FWK交互图
原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-f8c531de5d70c8d0.png
3.1 Camera app 与FWK Camera Service 交互拆解步骤
- Camera app 练级并下发打开Camera 的opensession 
- Camera FWK 处理App 下发的 openSession,并通过HIDL 跟Camera HAL进行通信 
- Camera Sensor 打开后,根据不同的Feature 配置不同的流信息。 
四、Camera FWK 与 Camera HAL 交互

Camera FWK 与 Camera HAL 交互图
原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-9b8429d750ea41d5.png
4.1 Camera FWK 与 Camera HAL 交互拆解
- Camera FWK Opensession 通过HIDL 跟 Camera HAL 进行通信 
- Camera HAL 处理openSession。 
- Camera FWK 在Camera Sesnor 打开后,开始执行configurestreams。 
- 通过HIDL Camera HAL 处理Camera FWK 传递的configurestream 。 
- Camera FWK 开始执行第一帧预览请求,关键字:setRepeatingRequest 
- Camera HAL 处理 Camera FWK 传下来的processcaptureRequest请求,并通过processCaptureResult callback 上去。 
五、Camera FWK、Camera app、SF 交互送显

Camera FWK、Camera app、SF 交互送显
原图查看链接:
https://upload-images.jianshu.io/upload_images/5851256-283fa9c17c5fd281.png
Camera FWK、Camera app、SF 交互送显拆解
- Camera FWK 返回第一帧 :关键字 first full buffer 
- Camera App SurfaceTexture 获取到Camera FWK 返回的第一帧 
- ImageReader 获取Camera FWK 返回的第一帧 
- Camera App 开始 dequeueBuffer ,对返回的第一帧进行处理。 
- Camera App 处理完后通过queuebuffer,将处理完的buffer 放到SF 对应的BufferQueue中,同时对应的Camera 的SurfaceView 的buffer值 +1 
- vsync-sf 到来之后,SF 从BufferQueue中取出一个buffer 进行消费并送显,对应的Camera App 的buffer -1 
六、Camera冷启动阶段分析补充

冷启动阶段会比热启动阶段多大致以下流程
PostFork --> ZygoteInit-->ActivityThreadMain-->bindApplication-->activityStart(后面同上分析)
6.1 阶段分析解释
- PostFork 耗时需要排查 Zygote.java 代码 
Zygote.java frameworks\base\core\java\com\android\internal\os
- ZygoteInit 耗时需要排查ZygoteInit.java 代码 
ZygoteInit.java frameworks\base\core\java\com\android\internal\os
- ActivityThreadMain耗时需要排查ActivityThread.java代码 
ActivityThread.java frameworks\base\core\java\android\app
- bindApplication 耗时需要排查ActivityThread.java代码,同上 
- activityStart App 开始执行 MainActivity 一系列 onCreate,onStart,onResume,openCamera等操作 
7 参考文献
- 012_相机性能优化.pdf 
- 【腾讯文档】Camera学习知识库 
 https://docs.qq.com/doc/DSWZ6dUlNemtUWndv
友情推荐:
Android 开发干货集锦
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

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



















