Camera 启动流程 trace 分析

和你一起终身学习,这里是程序员 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 启动流程拆解
  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
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 交互拆解
  1. launcher 点击事件处理
  2. 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 交互拆解步骤
  1. Camera app 练级并下发打开Camera 的opensession
  2. Camera FWK 处理App 下发的 openSession,并通过HIDL 跟Camera HAL进行通信
  3. 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 交互拆解
  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 交互送显

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冷启动阶段分析补充

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

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等操作

七、参考文献

  1. 012_相机性能优化.pdf
  2. 【腾讯文档】Camera学习知识库
    https://docs.qq.com/doc/DSWZ6dUlNemtUWndv

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

你可能感兴趣的:(Camera 启动流程 trace 分析)