anr?不存在的!该如何分析?系统应用Gallery和Camera的anr当案例

不积跬步无以至千里
      之前遇到anr,都是通过代码猜测哪一块有问题?是不是这一块比较耗内存,或者有内存溢出或者内存泄漏导致的,还是系统某些方法响应时间过长导致的?但是效率太低,而且当你面临一个你不熟悉又庞大的代码时,再去采用上面的方法会更加束手无策,所以说,怎么去解决anr?答案当然是:还是看log!!!
       针对编译器给咱们提出的问题,来找问题,不就是对症下药吗?比你胡乱猜想,有病乱吃药不好的多?有时候也许是因为你不知道怎么分析anr,所以下面给大家说明一下,我这次解决问题的思路。
       我遇见的问题是如下:
这里写图片描述
      根据测试的现象,看出当机器消耗内存过多才会出现此现象,所以当时没有根据anr的错误log,去分析,当时只想的是这一块不管是图库还是camera都是相当耗内存的,系统服务+图片,都会对系统出现高消耗内存,所以我怀疑图库是不是打开的时候会有高消耗(查找数据图来寻找图片,系统中的还有sd卡中的),所以当时想的是去查看图库初始化会有什么逻辑,因为本身对图库和相机并不了解,所以只能硬着头皮去看,后来还是搜了一下网上对图库这块做的分析,大概知道了图库的逻辑和架构,但是还是解决不了问题,还要去精细的分析代码,有点头痛,还不如去分析log,于是把anr产生的文件在手机内存中,接下来说一下获取anr崩溃log文件,如下:
adb root
adb remount
adb shell
cd data/anr/
ls
traces_com.android.gallery3d
traces_org.codeaurora.snapcam
     会发现目录下,有两个文件,于是需要把这两个文件pull到PC上,方便查看,于是执行命令:
adb pull data/anr/traces_com.android.gallery3d.txt
adb pull data/anr/traces_org.codeaurora.snapcam.txt
打开这两个log文件分析一下问题,看到如下所示:
这里写图片描述
      从这可以看出,cpu的占用率并不高,所以有可能并不是内存溢出和内存泄漏导致的,有可能调用某个方法时间过长,导致anr,接着往下看:
这里写图片描述
      据图可知,看出log再说系统的sensor没有注销掉,是gallery中的方向控制暂停,从而一步步的导致了anr。后来查证camera中也是同样的log,所以问了驱动的同事原来是加速度传感器出现了问题,导致下面的数据传不上来,上层获取不到,然后时间过长导致的,然后修改了,就发现问题迎刃而解。
       因此,可以看出解决问题还是看log,一步步来,不要心急,只有对症下药才行,最快的解决根本问题。

08-05 16:05:57.285467 30567 23927 D PTC.SERVICE.DependSettingValueProxy: getSettingsState, settingKeytouch_interactions_support , value = 0 08-05 16:05:57.285507 30567 23927 D PTC.SERVICE.Util: current dev support nfc is true 08-05 16:05:57.286837 26917 26917 D OplusViewDebugManager: setFrame for VRI[] Rect(0, 0 - 1264, 2780) 08-05 16:05:57.286878 26917 26917 D OnBackInvokedDispatcher: ViewRootImpl.registerBackCallbackOnWindow. Dispatcher:android.window.WindowOnBackInvokedDispatcher@2f6407f Package:com.oplus.camera IWindow:android.view.OplusViewRootImplHooks$ColorW@29aad9e Session:android.view.WindowlessWindowManager@bba584c 08-05 16:05:57.286911 26917 26917 D ViewRootImplExtImpl: onDisplayChanged -1 for VRI android.view.ViewRootImpl@7b8659b 08-05 16:05:57.287045 26917 26917 I OCAM_UIStateMachine: transferToState, from STATE_DESTROY to STATE_CREATE 08-05 16:05:57.287147 26917 26917 V OCAM_OppoCamera_TRACE: traceEndSection, msg: UIShellContainer.createSurfaceHost, colorMode: 0 08-05 16:05:57.287178 26917 26917 V OCAM_OppoCamera_TRACE: traceBeginSection, msg: UIShellContainer.attachTaskView 08-05 16:05:57.287670 26917 26917 I OCAM_UIShellContainer: attachTaskView, taskView created 08-05 16:05:57.287695 26917 26917 V OCAM_OppoCamera_TRACE: traceEndSection, msg: UIShellContainer.attachTaskView 08-05 16:05:57.287731 26917 26917 I OCAM_UIShellContainer: updateFlexibleTaskViewIfNeed, same intent, ignore update 08-05 16:05:57.287774 26917 26917 I OCAM_UIShellContainer: reparentHostToParent 08-05 16:05:57.288732 26917 26960 D OCAM_SeamlessUIControl: onStateChanged, from STATE_DESTROY to STATE_CREATE 08-05 16:05:57.288798 26917 26960 V OCAM_OppoCamera_TRACE: traceBeginSection, msg: onStateChanged, STATE_START 08-05 16:05:57.288819 26917 26960 D OCAM_SeamlessUIControl: handleStartState 08-05 16:05:57.288966 26917 26960 V OCAM_CameraPerformance: recordTime, KEY_GALLERY_STATE_START 08-05 16:05:57.289059 26917 26960 V OCAM_OppoCamera_TRACE: traceEndSection, msg: onStateChanged, STATE_START 08-05 16:05:57.289101 26917 26960 I OCAM_PreviewHDRControl: onSeamlessStateChanged, fromState: 4, toState: 1, isResumed: true 08-05 16:05:57.289158 26917 26996 D OCAM_FluencyPerformance: onInterrupt, is reconfigure: true, reason: onPause start 08-05 16:05:57.289418 26917 26960 I OCAM_PreviewHDRControl: updateSurfaceEdrAnimDuration, animDuration: Pair{500 300}, mEdrScene: EDR_SCENE_INTEGRATION_UI 08-05 16:05:57.289622 26917 26951 V OCAM_CameraExitPerformance: setOnPauseEndTime, old: 0, new: 1754381157288 08-05 16:05:57.289848 3384 6385 W PackageConfigPersister: App-specific configuration not found for packageName: com.coloros.gallery3d and userId: 0 08-05 16:05:57.289672 26917 26951 V OCAM_CameraExitPerformance: setOnPauseStartTime, old: 0, new: 1754381157288 08-05 16:05:57.290300 1992 1992 I cryptoeng_hidl: cryptoeng_invoke_command cmdid = 26 result:-1 out_buf_len = 4 08-05 16:05:57.290462 1992 1992 I cryptoeng_hidl: cryptoeng_invoke_command_DCS cryptoeng_id_ret cryptoeng_event msg.value: 26:-1 08-05 16:05:57.290368 26917 26950 V OCAM_GalleryPreCodeClient: setSeamlessUIStateToGallery, state: 1 08-05 16:05:57.290951 3384 6638 D CommonDcsUploader: notifyMsgToCommonDcs, logTag: 20120cryptoeng_event 08-05 16:05:57.291172 26917 26960 D OCAM_CaptureDeferUtils: onSeamUiStateChanged, sSeamUiState: 1 08-05 16:05:57.291571 1992 1992 E cryptoeng_hidl: process com.heytap.accessory:service have no permission calling cmd:26. 08-05 16:05:57.291596 1992 1992 I cryptoeng_hidl: cryptoeng_invoke_command in_len:772, cmdid = 26 08-05 16:05:57.291600 1992 1992 D cryptoeng_hidl: upload_dcs_device_unlock 08-05 16:05:57.291610 1992 1992 D cryptoeng_hidl: security DCS paramstr is: unlocked 08-05 16:05:57.291616 1992 1992 D CryptoEngInvokeCommand: crypto_eng_invoke_command enter in_cmd1 = 436207616 08-05 16:05:57.291655 14634 14647 I IPCThreadState: oneway function results for code 6 on binder at 0xb400007707eeb3a0 will be dropped but finished with status UNKNOWN_TRANSACTION 08-05 16:05:57.292152 26917 26951 V OCAM_Performance: requestInstantCpuLoad, sCpuSampleCount++: 6 08-05 16:05:57.292590 26917 26917 V OCAM_OppoCamera_TRACE: traceEndSection, msg: SeamlessUIControl.startPresent 08-05 16:05:57.292629 26917 26917 V OCAM_CaptureProcessor: resetFirstCaptureState 08-05 16:05:57.292682 26917 26917 W InputLog: View : performClick, li=OnClickListener, this=com.oplus.camera.control.ThumbImageView, result=truenull 08-05 16:05:57.292721 1992 1992 I cryptoeng_hidl: cryptoeng_invoke_command cmdid = 26 result:-1 out_buf_len = 4 08-05 16:05:57.292745 1992 1992 I cryptoeng_hidl: cryptoeng_invoke_command_DCS cryptoeng_id_ret cryptoeng_event msg.value: 26:-1 08-05 16:05:57.292792 26917 26917 D OCAM_HdrPresenter: checkDolbyRecordState, setAutoBrightnessAdjust value to: true 08-05 16:05:57.292849 26917 26917 V OCAM_ScreenBrightnessController: setAutoBrightnessAdjust 22012.941406 08-05 16:05:57.292883 30567 30605 D PTC.SERVICE.SecretKeyManager: -- NFC-Security -- getResultFromCryptoEng: resultCode=-1 08-05 16:05:57.292900 30567 30605 D PTC.SERVICE.SecretKeyManager: -- NFC-Security -- isSecretKeySupport: false 08-05 16:05:57.292905 30567 30605 E PTC.SERVICE.Util: isBaseNfcConditionSupport false: secret key not support 08-05 16:05:57.292954 30567 30605 D PTC.SERVICE.Util: current support share2phone function is true 08-05 16:05:57.292965 30567 30605 D PTC.SERVICE.Util: current support share2phone function is true 08-05 16:05:57.293424 26917 26917 D ViewRootImplExtImpl: wrapConfigInfoIntoFlags rotation=0, smallestScreenWidthDp=361, residentWS=false, scenario=0, bounds=Rect(0, 0 - 1264, 2780), relayoutAsync=true, flags=0, newFlags=1457532192, title=com.oplus.camera/com.oplus.camera.Camera 08-05 16:05:57.293711 26917 26960 D OCAM_ScreenSwitchController: updateUIPresentState, state: 1, mbIsSeamlessGallery: false 08-05 16:05:57.293751 26917 26960 I OCAM_HdrPresenter: seamlessUiStateListener, update state, current state: 4 change to --> 1 08-05 16:05:57.293846 26917 26917 D VRI[Camera]: relayoutWindow result, sizeChanged:false, surfaceControlChanged:false, transformHintChanged:false, mSurfaceSize:Point(1264, 2780), mLastSurfaceSize:Point(1264, 2780), mWidth:1264, mHeight:2780, requestedWidth:1264, requestedHeight:2780, transformHint:0, installOrientation:0, displayRotation:0, isSurfaceValid:true, attr.flag:-2122316416, tmpFrames:ClientWindowFrames{frame=[0,0][1264,2780] display=[0,0][1264,2780] parentFrame=[0,0][1264,2780]}, relayoutAsync:true, mSyncSeqId:0 08-05 16:05:57.293865 26917 26917 W VRI[Camera]: updateBlastSurfaceIfNeeded, surfaceSize:Point(1264, 2780), lastSurfaceSize:Point(1264, 2780), format:-3, blastBufferQueue:android.graphics.BLASTBufferQueue@e004ad1 08-05 16:05:57.293874 3384 7340 D WindowManagerServiceExtImpl: extractConfigInfoAndRealFlags rotation=0, screenDp=361, residentWS:0, scenario:0, bounds:2780, serverWinBounds:Rect(0, 0 - 1264, 2780), win=Window{4bc0a06 u0 com.oplus.camera/com.oplus.camera.Camera} 08-05 16:05:57.293973 26917 26998 V OCAM_OppoCamera_TRACE: traceBeginSection, msg: setTemporaryAutoBrightnessAdjustment 22012.941406 08-05 16:05:57.294022 26917 26917 D OplusViewDebugManager: setFrame for VRI[Camera] Rect(0, 0 - 1264, 2780) 08-05 16:05:57.294088 3384 7340 V WindowManager: Relayout Window{4bc0a06 u0 com.oplus.camera/com.oplus.camera.Camera}: viewVisibility=0, oldvis=0, req=1264x2780 , apr = 0, vsysui=FULLSCREEN LAYOUT_HIDE_NAVIGATION LAYOUT_FULLSCREEN IMMERSIVE_STICKY, x=0, y=0 08-05 16:05:57.294317 3384 7340 D DisplayModeDirector: setAppRequest displayId : 59 modeId: 0 requestedRefreshRate: 0.0 requestedMinRefreshRateRange: 0.0 requestedMaxRefreshRateRange: 0.0 08-05 16:05:57.294433 26917 26917 D OplusBracketLog: [OplusViewMirrorManager] adjustSurfaceViewFrameIfNeed, viewRoot:android.view.ViewRootImpl@755ba12, inRec:Rect(0, 0 - 1264, 2780), absInRec:Rect(0, 0 - 1264, 2780), limitRec:Rect(0, 0 - 0, 0), outRec:Rect(0, 0 - 1264, 2780), isLegalRec:false, isSurfaceValid:false, v:pc.b{bb7f7f2 VFE...... ......ID 0,0-1264,2780 alpha=1.0 viewInfo = } 08-05 16:05:57.294451 26917 26917 D SurfaceView: 196605938 updateSurface: has no frame 分析上面日志流程
最新发布
08-14
### ### Android系统日志分析流程 Android系统日志是开发者系统管理员了解设备运行状态、诊断问题、优化性能的重要工具。通过分析日志,可以追踪组件状态变化、Surface管理、NFC相关操作以及潜在的性能或状态异常。 #### ### 组件状态变化分析 Android系统中的组件(如Activity、Service、BroadcastReceiver等)具有明确的生命周期。在日志中,这些生命周期的变化通常会被记录,以便开发者跟踪应用的状态变化。例如,当一个Activity从`onCreate`到`onStart`再到`onResume`,或者从活跃状态进入`onPause`、`onStop`甚至`onDestroy`时,相关的日志条目会反映这些状态转换。 日志中的状态变化通常伴随着特定的标签消息,例如: ``` I OCAM_UIStateMachine: transferToState, from STATE_DESTROY to STATE_CREATE ``` 这类信息可以帮助开发者确认组件是否按照预期的生命周期进行转换,并且可以用于检测可能的异常行为,比如组件未能正确释放资源或者未能及时响应系统事件。 #### ### Surface管理分析 Surface管理是Android系统中图形渲染的关键部分。当SurfaceView尝试更新其内容时,如果没有新的图像帧到达,可能会输出类似`updateSurface: has no frame`的日志信息。这表明当前SurfaceView无法获取新的图像帧进行更新,通常发生在SurfaceTexture无法从生产者(如MediaPlayer或Camera)接收到新帧的情况下。 在日志中,与Surface管理相关的条目可能包括: ``` V OCAM_OppoCamera_TRACE: traceBeginSection, msg: onStateChanged, STATE_START ``` 这类信息有助于开发者理解Surface的状态变化,并且可以用于排查渲染问题,如黑屏、卡顿或画面冻结。 #### ### NFC相关日志分析 NFC(近场通信)是Android设备中常见的功能之一,用于支持非接触式数据交换。在日志中,NFC相关的操作通常会被详细记录,包括NFC功能的启用、禁用以及具体的NFC交易过程。例如,当设备尝试使用NFC进行安全通信时,可能会记录以下信息: ``` D PTC.SERVICE.SecretKeyManager: -- NFC-Security -- getResultFromCryptoEng: resultCode=-1 ``` 这些日志条目可以帮助开发者验证NFC功能是否正常工作,并且可以用于调试NFC相关的安全问题。 #### ### 性能或状态异常分析 性能或状态异常是Android系统日志中另一个重要的分析领域。这类问题可能包括应用崩溃、ANR(Application Not Responding)、内存泄漏等。日志中通常会有明确的错误信息,例如: ``` E cryptoeng_hidl: process com.heytap.accessory:service have no permission calling cmd:26. ``` 这类信息可以帮助开发者快速定位问题所在,并且可以用于优化应用性能,确保应用能够在各种设备上稳定运行。 为了有效地分析这些日志,开发者可以使用Android提供的工具,如`adb logcat`来查看实时日志输出,或者使用日志分析工具来解析过滤日志文件。此外,还可以通过编写自定义的日志管理模块来记录管理日志文件,以便更好地进行后续分析。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rom_Fisher

赠人玫瑰,手留余香。

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

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

打赏作者

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

抵扣说明:

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

余额充值