启动性能:
从camera app和java framework角度分析:
app 点击app icon 开始调用 opencamera
trace:deliverinputevent中有两个点 down和up, opencamera
opencamera:opencameraforuid、connectdevice
底层 开始调用 opencamera opencamera结束
trace:整个opencamera耗时
app opencamera结束 开启调用 createcapturesession
trace:opencamera createcapturesession
底层 开启调用 createcapturesession 调用createcapturesession结束
trace:整个endconfigure耗时
createcapturesession:waituntilidle(创建session时希望 处理request的状态处于idle)、beginconfig、createstream、endconfig
app 调用createcapturesession结束 调用setrepeatrequest
trace:createcapturesession setrepeatrequest
底层 调用setrepeatrequest 收到第一帧
trace:setrepeatrequest first full buffer
从camera server角度分析:
app 点击app icon 开始调用 connectdevice
trace:deliverinputevent中有两个点 down和up, connectdevice
hal 开始调用 connectdevice connectdevice结束
trace:整个connectdevice耗时
app connectdevice结束 开启调用endconfigure
trace:connectdevice endconfigure
hal 开启调用endconfigure 调用endconfigure结束
trace:整个endconfigure耗时
app 调用endconfigure结束 调用submitrequestlist
trace:endconfigure submitrequestlist
hal 调用submitrequestlist cameraserver收到第一帧
trace:submitrequestlist first full buffer
手机启动时provider会将hal 的 characteristics信息进行保存,一旦camera server调用则provider直接提供
1.app调用camera server的 getcharacteristics 流程
shouldrejectsystemcameraconnection(是否为系统camera,如果没有申请系统camera权限则拒绝,getcharacteristics为空)
cameramanager的getcharacteristics、getcharacteristics::checkpermission
2.app调用open camera,camera server的 connectdevice 流程
connect permission
handleevictionslocked
initializeimpl、cameradeviceclient::initializeimpl、camera2clientbase::initializeimpl、camera3device的initializeimpl、camerahal::opensession
3.app调用createCaptureSession,camera server的 createDefaultRequest 流程
调用camera3device的createDefaultRequest、camerahal:constructDefaultRequestSettings
4.camera server的 createstream 流程(几路流就有几个createstream)
cameradeviceclient::createstream
调用createsurfacefromgbp(query width height format)(java surface通过gbp转成底层的surface)
调用camera3device的createstream、new camera3outputstream
5.camera server的 endconfigure 流程
cameradeviceclient::endconfigure
调用camera3device的configurestreams
camera3stream::startconfiguration
camerahal::configurestreams
6.camera server的 submitrequestlist 流程
submitrequestlist会将request放在一个线程中跑:c3Dev-0-reqQueu的threadLoop
在request没来之前 threadLoop会一直等 waitfirNextRequestBatch,等到之后调用prepareHalRequests、sendRequestsBatch
camerahal::processBacthCaptureRequest
7.camera server的 processCaptureResult 流程
调用camera3device的processCaptureResult
Camera3OutputUtils::returnAndRemovePendingOutputBuffers
Camera3OutputUtils::returnOutputBuffers
Camera3Stream::returnBuffer
Camera3OutputStream::returnBufferLocked
Camera3IOStreamBase::returnAnyBufferLocked
Camera3OutputStream::returnBufferCheckedLocked
Camera3OutputStream::queueBufferToConsumer
// 启动
S0
app AppLaunch_dispatchPtr:Up -> activityStart
S1
app activityStart->openCameraDeviceUserAsync.connectDevice
activityStart->cameraserver:connectDevice
S2
HAL openCameraDeviceUserAsync.connectDevice ->CameraStartupPerformance.onCameraOpened
cameraserver:connectDevice->cameraserver:createDefaultRequest
S3
app "CameraStartupPerformance.onCameraOpened-> CameraStartupPerformance.createCaptureSession"
cameraserver:createDefaultRequest-> cameraserver:createStream
S4
HAL "CameraStartupPerformance.createCaptureSession-> CameraStartupPerformance.onCameraCaptureSessionConfigured"
cameraserver:createstream-> cameraserver:endConfigure的结束点
S5
app "CameraStartupPerformance.onCameraCaptureSessionConfigured-> CameraStartupPerformance.setRepeatingRequest"
cameraserver:endConfigure的结束点-> cameraserver:submitRequestList
S6
hal CameraStartupPerformance.setRepeatingRequest-> onFirstFrameAvailable
cameraserver:submitRequestList-> cameraserver:frame capture结束点
S7
app S7 : onFirstFrameAvailable起点--- SurfaceView Buffer柱起点为终
+ SurfaceView Buffer柱起点 --- Trace presentFence fence X --- waiting for presentFence X
cameraserver:frame capture结束段 -> sf:presentFence对应帧
// 关键字:
sensor power up:cslacquiredevice
sensor init settings applysensorinitsettings
stream on
startpreview2firstframe
切换性能:
app 点击switch icon 开始调用 disconnect
trace:deliverinputevent中有两个点 down和up, disconnect
hal 开始调用 disconnect disconnect结束
trace:整个disconnect耗时
app disconnect结束 开启调用connectdevice
trace:disconnect connectdevice
hal 开始调用 connectdevice connectdevice结束
trace:整个connectdevice耗时
app connectdevice结束 开启调用endconfigure
trace:connectdevice endconfigure
hal 开启调用endconfigure 调用endconfigure结束
trace:整个endconfigure耗时
app 调用endconfigure结束 调用submitrequestlist
trace:endconfigure submitrequestlist
hal 调用submitrequestlist cameraserver收到第一帧
trace:submitrequestlist first full buffer
native framework close camera的流程:
java fwk调用close -> native fwk disconnect
CameraService::cacheDump :
会将上一次使用相机的信息保存在dumpsys中
关键字:active camera clients、from previous open session
CameraDeviceClient::detachDevice:
cameraHal::flush
waituntilDrained
cameraHal::close
release stream buffer
CameraService::BasicClient::disconnect
finishCameraOps
拍照性能:
shot2thumbnail 点击shutter button -> thumbnail完成更新
shot2view 点击shutter button -> thumbnail完成更新 -> 点击thumbnail进gallery 图像清晰显示完成
shot2shot 点击shutter button -> 下一次点击shutter button
shot2thumbnail:
app 点击shutter button app送拍照capturerequest给底层
trace:deliverinputevent中有两个点 down和up, submitrequestlist
hal app送拍照capturerequest给底层 app收到jpeg buffer (onImageAvaliable)
trace:submitrequestlist imageReader
// cameraserver 中 有still capture,为hal拍照时间, cookie 值为该帧的requestNum