【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲:
目录
三、:Camera相机Framework CameraServer常见日志详解
一、背景
1:【效率决定成长空间】无论什么开发,分析日志是解决问题的法宝。且是最有效最常用的调试工具,特别是在Android或Linux领域下,log分析是开发必备技能,然而log分析效率参差不齐,你分析一份日志要一天,别人分析只需要一个小时,作何感想?别人一年的学习成果可能是你几年才能学会。
2:【巨量日志降低了开发效率】接触过Android日志,就清楚日志量非常大。几十个进程几百个线程同时并行打印日志。而Camera领域日志量极大,因为预览一般是每秒30帧的日志量,录屏一般是每秒60帧的日志量,少则几万行日志,多则几十万行日志,更多则多个日志总量几百万行日志。
3:【日志梯度分级来提效】开发追求效率,如何快速有效挖掘出问题,并如何解决问题变得尤为重要。此专题将以梯度分级日志来分析日志,让日志流程变得简单化,提高解决问题的效率。
4:【举一反三】当前以高通CamX架构为例讲解Camera日志,方式通用,其他领域模块均可效仿借鉴。
5:【开发思维决定成长高度】当前讲述的是Camera领域log分析梯度分级讲解,讲究的是一种分析技巧,分析思维,一种感悟。技术路线的提升空间,需要更多开发技巧和开发学习能力去提升。技术大拿分析问题,可以从日志快速定位问题并解决问题,有充分的时间去学习更多知识,成长速度极快。同一起跑线,学习能力,开发效率等等都决定了程序员的成长提升空间。记得我毕业三年,同学之间的差距无限拉大,一些人还在几千块薪水,你已经是他的四五倍了,人与人的差距就是短短几年就拉开了。
二、Camera相机APP常见日志详解
1.点击拍照和模式切换相关
相册点击删除:D Gallery.PhotoPage: onItemSelected
点击模式按钮:onModeTypeChanged
切换Mode:checkToSwitchMode, lastModeName:
切换前后置:onSwitchCameraButtonClick 或 onShutterButtonClick, switch_camera_button
点击拍照:onShutterButtonClick, ShutterButton.id
app下发请求:takePicture before
app日志:OneCameraImpl
拍照模式:ModeManager: onBeforePreview, capMode:
相机拍照按钮点击:CameraManager: CameraTest Shutter Respond Start
相机点击缩图:CameraManager: CameraTest Camera View Picture Start, onThumbNailClick zhen
显示缩略图:
从快门响应->缩略图显示完成时间:CapturePerformance: onEnd
相机下发拍照:OneCameraImpl: burstCapture, pictureNum:
shutterCallback:OneCameraImpl: mPictureCallback, onCaptureStarted, mCameraRole:
画幅:OCAM_RatioPresenter: updateFeatureValue
app接收到算法回调的预览决策结果:postEventFromNative
拍照对应的决策:capture, decisionResult:
看quick图时间戳:onPreviewReceived, refTimestamp
看log开关系统属性:initLog, autoTestLogOn
触发算法内存限制:decisionResult not allow to capture
相机退出时间点和堆积的待处理图片:Camera: on|FinishProcessPicture
丢图问题:OCAM_CaptureFailInfoUtil
进相机对应测试场景后,查看真实刷新率:adb shell "dumpsys SurfaceFlinger | grep activeMode"
错峰状态:executeDeferJob in this scene
看应用拉起时间:ActivityController:
错峰堆积张数:getJobType, isFromOtherApp
2.收集meta和image送算法处理
收集图片: addImage, timeStamp:
收集 addMetaInfo
收集图片张数(meta和对应image): countAddFrame, identity:
app送完算法之前: processImages, objInfo:
app送完算法后: addFrameAndProcessImage, processImages result:
3.缩略图
Storage : newImage, jpeg
Storage : newImage, uri //更新_temp图
Storage : newImageForGallery
Storage : updateImage
Storage : updateQuickJpeg //存在快图逻辑更新为_quick
Thumbnail: createThumbnail
4.算法回图以及存图
savePicture,
: savePicture, End
: onJpegReceived //相机中拍照在算法合成后大图从算法返回
: deleteThumbnailAndCache, thumbnailItem: //算法处理异常 app删除cache
ProcessQueueThread: afterAddFrame, mCaptureSize: //送完算法后等待算法送回图的张数
ProcessQueueThread: onPicReceiveFrom, mCaptureSize: //回大图后算法还需要处理的大图的张数
ImageSaverThread: handlePicture, picture.jpeg
ImageSaverThread: CameraTest Picture Save End //大图保存完成
quick图做大图:updateQuickToFinal
相机拍摄完整log流程
点击拍照:onShutterButtonClick, ShutterButton
快门响应:Shutter Respond Start
生成临时 temp:Storage : newImage
原图保存:Picture Save End
照片保存后相册收到多媒体库通知:Gallery.MediaSyncManager: mamMediaObserver.onChange
点击左下角跳转到相册:Camera View Picture Start, onThumbNailClick
有快拍流程的:
生成后相机插入临时记录到相册:Gallery.FastCaptureHelper: insert
原图生成后更新:Gallery.FastCaptureHelper: update
拍照后照片加载显示:Camera View Picture End
图片保存后相册解析 exif 并且更新 datetaken:
Gallery.MediaSyncActionStatistic: onSyncDateTaken:ParseDetail
一次完整的拍照的log分析
需要拆解出总时间、出帧耗时、各算法处理时间、具体算法的耗时、编码时间
过滤关键字:
burstCapture, pictureNum|onShutterButtonClick,|CameraManager: LocalImageAvailableListener,|AlgoInterface::process start|AlgoInterface::process end|sw_jpeg_enc|CameraTest Picture Save End|CameraTest Camera View Picture|codecProcess(.*)start|onJpegReceived, result|ActivityTaskManager: START u0|process_time|CameraUnit, : onFinishAddFrame|CameraManager: onFinishAddFrame|AddFrameBuff(.*)frameId:|addFrameBuff|MediaProvider: Moving
三、:Camera相机Framework CameraServer常见日志详解
Camera3-Device|CameraService:|Camera3-Stream:|CameraDeviceClient:|CameraCaptureSession|Camera2ClientBase:
四、Camera相机高通Camx HAL常见日志详解
ConfigureStreams:configure_streams
查看ExtensionMode选用的UseCase:
CHIUSECASE.*GetMatchingUsecase
CHIUSECASE.*feature2
CHIUSECASE.*advancedcamerausecase
request到达hal:process_capture_request.*num_output_buffers
result即将从hal向上传递:process_capture_result.*num_output_buffers
第一帧在CHI中处理流程:
创建的pipeline及对应的连接信息:topology:|GetXmlUsecaseByname
人脸检测:FDSWOnlyExecution
hal返回帧(预览和拍照通过size区分):Returning framework result Frame
打开关闭相机:CameraService::connect|camxhal3.*open|camxhal3.*close
hal所有的日志:CamX :|CHIUSECASE
查看sensormode:sensor modelist
五、Camera相机MTK HAL常见日志详解
拍照request 请求:CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE 预览request 请求:CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW
六、相册常见日志详解
ThumbnailLoader:
相机操作相册数据库的helper类:FastCaptureHelper
插入:insert
更新:update
相册的大图页面onCreate执行:PhotoPage: onCreate
相册的大图页面onResume执行:PhotoPage: onResume
相相大图页面数据加载 线程:PhotoDataAdapter: ReloadTask
提交相册大图页面次高清图片任务线程:PhotoDataAdapter: submitScreenNailTask
PhotoDataAdapter: ScreenNailJob
PhotoDataAdapter: ScreenNailListener, onFutureDone
相册大图页面次高清图片任务执行完成:PhotoPage: CameraTest Camera View Picture End
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: