基于android4.4系统行车记录应用黑屏问题分析及对策

基于android4.4系统行车记录应用黑屏问题分析及对策

笔者最近遇到一个棘手的问题,那就是行车记录应用出现黑屏的问题,现象就是进入行车记录应用surface是黑的,录像文件几分钟一个的那种,每个文件的大小都是零。看到这个大家都非常重视,对于车载产品来说,行车记录功能需要保持长时间正常工作,出现这种问题肯定是不能接受的,必须解决!那这个问题是怎么出现的呢?

跟了很长时间,同时动用了8台相同的机器来单独做行车记录的拷机测试,12个小时内都不会出问题,但是超过24小时,就有那么2-3台机器会出现黑屏的问题,时间越长出问题的机器会增多,当然笔者在连续测试3X24小时的情况下,还有那么1-2台机器是毫发无损的正常工作!不是短时间就能出来,不是每台都能遇到,遇到这样的问题,大家可能都会觉得很棘手吧!那怎么解决呢?

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

要解决问题,我们也只能多做实验了,加一些测试代码用于调试,另外必须增加一个持续抓取系统打印信息的功能,否则这么长时间,不可能都拿一台机器在旁边抓打印吧!即使可以,也很不方便是不是,也没那么多电脑做到一机配一PC吧!持续抓打印这个功能相对比较简单,笔者在一年多前写过类似这方面的博文,有需要的可以去翻阅一下。

首先来看一下出问题时的打印是个什么样的状态吧!

10-09 01:10:32.670 E/V4L2CameraDevice( 1205): select timeout
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): wait v4l2 buffer time out
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): nmCurAvailBufferCnt: 2
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 0 ( refCnt:0 index:0 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 1 ( refCnt:1 index:1 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 2 ( refCnt:1 index:2 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 3 ( refCnt:1 index:3 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 4 ( refCnt:1 index:4 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 5 ( refCnt:0 index:5 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): buffer: 6 ( refCnt:1 index:6 )
10-09 01:10:32.670 W/V4L2CameraDevice( 1205): preview_num: 0, picture_num: 0
10-09 01:10:33.110 D/dalvikvm( 2011): GC_FOR_ALLOC freed 1603K, 40% free 4102K/6796K, paused 51ms, total 51ms
10-09 01:10:34.690 E/V4L2CameraDevice( 1205): select timeout
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): wait v4l2 buffer time out
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): nmCurAvailBufferCnt: 2
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 0 ( refCnt:0 index:0 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 1 ( refCnt:1 index:1 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 2 ( refCnt:1 index:2 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 3 ( refCnt:1 index:3 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 4 ( refCnt:1 index:4 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 5 ( refCnt:0 index:5 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): buffer: 6 ( refCnt:1 index:6 )
10-09 01:10:34.690 W/V4L2CameraDevice( 1205): preview_num: 0, picture_num: 0
10-09 01:10:35.500 D/dalvikvm( 2011): GC_FOR_ALLOC freed 1392K, 40% free 4102K/6796K, paused 44ms, total 44ms
10-09 01:10:36.700 E/V4L2CameraDevice( 1205): select timeout
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): wait v4l2 buffer time out
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): nmCurAvailBufferCnt: 2
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 0 ( refCnt:0 index:0 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 1 ( refCnt:1 index:1 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 2 ( refCnt:1 index:2 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 3 ( refCnt:1 index:3 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 4 ( refCnt:1 index:4 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 5 ( refCnt:0 index:5 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): buffer: 6 ( refCnt:1 index:6 )
10-09 01:10:36.700 W/V4L2CameraDevice( 1205): preview_num: 0, picture_num: 0
10-09 01:10:37.050 D/MXNavi-JNI( 2726): send_Msg_to_control onUpdateGuidePointInfo pturninfo HighSpeedFlag:1,ulDistance370,destinationDistance:796,ulTurnid:5----EEyeGuideInfo{0-0-0}
10-09 01:10:37.080 D/MXNavi-JNI( 2726): send_Msg_to_control onUpdateGuidePointInfo pturninfo HighSpeedFlag:1,ulDistance370,destinationDistance:796,ulTurnid:5----EEyeGuideInfo{0-0-0}
10-09 01:10:37.190 D/MXNavi-JNI( 2726): snd_start_play_sound
10-09 01:10:37.190 V/jeavox  ( 1657): MiddleWareService onNaviInfoSpecialStatusChanged####1 1
10-09 01:10:37.190 I/jeavox  ( 1657): MiddleWareService NaviAudiowillPlay##1NAVI_RADAR_Coming 0
10-09 01:10:37.920 D/dalvikvm( 2011): GC_FOR_ALLOC freed 1430K, 40% free 4102K/6796K, paused 47ms, total 48ms
10-09 01:10:38.710 E/V4L2CameraDevice( 1205): select timeout
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): wait v4l2 buffer time out
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): nmCurAvailBufferCnt: 2
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 0 ( refCnt:0 index:0 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 1 ( refCnt:1 index:1 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 2 ( refCnt:1 index:2 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 3 ( refCnt:1 index:3 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 4 ( refCnt:1 index:4 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 5 ( refCnt:0 index:5 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): buffer: 6 ( refCnt:1 index:6 )
10-09 01:10:38.710 W/V4L2CameraDevice( 1205): preview_num: 0, picture_num: 0
10-09 01:10:40.180 D/Clock_Component( 1205): ----adjust ratio:1 ,precise_adjust_ratio:1, ref:2703668109 sys:2703728392 diff:-60283 diff-percent:-1 ----
10-09 01:10:40.230 D/dalvikvm( 2011): GC_FOR_ALLOC freed 1409K, 40% free 4102K/6796K, paused 54ms, total 55ms
10-09 01:10:40.720 E/V4L2CameraDevice( 1205): select timeout
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): wait v4l2 buffer time out
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): nmCurAvailBufferCnt: 2
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 0 ( refCnt:0 index:0 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 1 ( refCnt:1 index:1 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 2 ( refCnt:1 index:2 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 3 ( refCnt:1 index:3 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 4 ( refCnt:1 index:4 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 5 ( refCnt:0 index:5 )
10-09 01:10:40.720 W/V4L2CameraDevice( 1205): buffer: 6 ( refCnt:1 index:6 )

很明显是select超时了,为什么超时了呢?是由于buffer的问题!没有足够的空buffer!上面的打印有每个buffer的refCnt,从打印上分析一个是录像编码那边可能没正常释放,造成没释放的原因可能有系统任务多比较忙,也可能是SD卡读写速度跟不上,造成短时堵车,buffer没正常处理,总的来说我还是怀疑录像编码模块出的问题。但是有一个很现实的问题,就是这种问题在原厂那边不是很重视,也是公司地位不门当户对,也因为这个行业还不是贡献他们GDP的拳头。人家不投入那么多精力帮你,你能怎么办?跟老板说,原厂不解决,我们没办法!这样当然不行,很多客观的条件我们短时解决平衡不了的。那总得有招吧!

笔者在测试发现,每次黑屏以后,该应用需要全部退出,再开启,又能正常工作。在HAL层出问题了,一旦出现这种select超时的问题,它是不会自愈的,多长时间都一样,那我想总可以想办法让应用知道这个事吧!上面知道这个事,不就有办法解决了嘛!虽然这不是最佳的解决办法,但是是合符目前各种现状的!停止再重新开启,大概需要1秒钟,也就是说会丢一秒钟的数据。这个在我看来这还属于可以接受的一个范围吧!

那怎么上报呢?其实camera里面有现成的一套,只要利用起来就好了!在camera.java里面有一个重要的接口如下:

    /**
     * Registers a callback to be invoked when an error occurs.
     * @param cb The callback to run
     */
    public final void setErrorCallback(ErrorCallback cb)
    {
        mErrorCallback = cb;
    }

通过这个接口注册可能作监听错误,注册了就相当于有一个钩子在那等了!那诱饵怎么抛出呢?还是得看看V4L2CameraDevice.cpp,这里面已经有一个现成的mCallbackNotifier,并且mCallbackNotifier它还有一个onCameraDeviceError()这样一个现成的接口,那不就简单了嘛!

因此,在select超时的地方,直接通过mCallbackNotifier去call onCameraDeviceError,顺带一个特殊的错误号,这样行车记录应用监听到错误,对比一下错误码,不就可以做处理了嘛!

笔者通过8台机器,连续测试了将近110个小时,发现8台机器都还在正常工作,没有出现黑屏的问题!同时,我也看了一下其中5台的系统打印,确实都曾出现过select超时的问题!那说明我们的处理方法手段还是有效的。虽然不是什么很高明的方法,但是还是一条切合实际的路!

很多时候,我们没有那么多的资源,又要干一些事情,当然需要想一些办法了!

时间: 2024-08-06 07:35:38

基于android4.4系统行车记录应用黑屏问题分析及对策的相关文章

Android5.0L因SystemUI ANR导致的黑屏问题分析

一.问题现象 1.用户直观看到的现象是黑屏. 2.出问题时StatusBar.NavigationBar和墙纸消失. 3.大部分发生在FOTA重启之后,出现概率很低. Platform:MSM8916 Android版本:5.0.2L BuildType:user 系统软件版本:VA6V+L5V0 系统RAM:1GB 参考机行为: 1.5.0L的Nexus4和5.1L的Nexus5都没有重现此问题. 二.解决方案 通过初步分析.深入分析(具体分析过程.关键代码和log在下面会附上)我们清楚的知道

Android中Google Drive显示黑屏问题分析

一.问题现象 在contacts中添加一个新的联系人,为新的联系人选择一个icon,在弹出的documents窗口中选择drive,在drive中选择一个图片,然后出现一段时间的黑屏. Platform:MT6572 Android版本:4.4KK BuildType:user 系统软件版本:SWC9G+UAG0 系统RAM:512M 二.关键log以及相关代码 三.问题初步分析 四.建议的问题解决方案 完整的分析流程请直接下载PDF文档: Drive_show_black_screen_iss

一种基于动态插件系统的移动测试黑科技

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本.技术和效率问题提供解决方案.同时分享行业领先的百度技术,作者来自百度员工和业界领袖等. 本文作者:hyxbiao && tony xin 背景 移动APP插件化是平台化产品解决系统限制(65535).模块解耦.和多团队协作的利器.它的最大特点是模块动态下发,给产品带来的收益显而易见,但是,在百度,这套系统给移动端测试技术带来了新思路 移动端线上问题定位的几个场景: 场景一: 云端用户反馈某功能不可用,RD猜

vnc+kvm远程安装系统的黑屏问题

利用vnc从Windows远程到linux,再从linux的kvm中远程连接到kvm管理器,安装系统时发现总是黑屏,开始以为是安装包的问题,后来在kvm本地安装发现能够正常显示,这应该是vnc的bug吧. 之后利用Remote viewer工具能够成功远程.过程如下 1.在Windows中vnc远程linux,在kvm中连接远端服务器的kvm管理器,新建虚拟机. 2.在遇到如下图界面时,把箭头所指选项勾上 3.在Display Spice 中改为如下选项,因为kvm默认是localhost不能远

win10 + Ubuntu18.04 双系统,UEFI+GPT,从win10切换到Ubuntu时黑屏问题

1.现象: ①win10主系统,从win10重启,立即黑屏,之后会进入Ubuntu(还是黑屏)(为什么会知道进入了Ubuntu:按音量键可以听到Ubuntu音量加减的系统声音,数字锁定和大小写锁定均有效).此时重启,强制关机再开机均为黑屏,且屏幕不显示任何信息,但系统能正常进入(判断方法同上). ②将主机的显示器接线接到旁边相同的显示器,可以正常显示.再接回来,依然黑屏. ③治标不治本法一:将主机的显示器接线接到旁边相同的显示器,退出Ubuntu系统进入Win10,再接回来,重新正常显示. ④治

Linux 安装 Nvidia 驱动出现的黑屏各种问题和解决方式

之前因为想OBS支持h264-nvenc这个功能然后就编译ffmpeg,然后使用Github上面的一个编译项目),项目编译完成之后重启电脑,然后就进入不了系统的登录页面了,选择进入Linux系统之后就一直黑屏,最后不知道什么原因,只能重装,花了我一个晚上弄才把i3-wm桌面弄好,真的不想再来一次了. 在重新安装linux-mint的过程中有几个值得注意的点: 引导项安装在 windows和Mac在的盘符(启动的时候可以直接引导) 安装完配置之后很有必要备份一下系统,这样子下次系统出现问题之后就可

如何基于android4.4.2的源码和android-4.3.1_r1的驱动编译I9250的ROM

如何基于android4.4.2的源码和android-4.3.1_r1的驱动编译I9250的ROM 作者:雨水  2014-05-04 联系方式:dennis.hu.cd at gmail.com 说明:经过多番折腾,终于把自己编译的Android4.4.2的源代码成功地跑在我的三星Galaxy Nexus I9250手机上了.期间离不开一位外国朋友的帮助,也就是参考资料[1]的作者Sato Kensuke. 这里将过程记录下来,希望对大家有所帮助! 第一步:下载android-4.4.2_r

2015-10-5系统崩溃记录

2015-10-5系统崩溃记录 在3系统级别切换至5系统级别的时候,出现了报错 [[email protected] linux]# init 5 Calling the system activity data collector (sadc)- 并且在切换到3系统级别的时候也是出现了同样的提示 Calling the system activity data collector (sadc)- 立刻拍摄当前系统快照,并且恢复上一次系统快照,进行系统级别切换的操作 之前快照版本的系统没有任何问

基于最新RHEL7系统的Packstack自动部署RDO(OpenStack Icehouse)

本篇文章是通过最新发布的Red Hat Enterpise Linux 7 系统部署OpenStack,集成到RHEL系统的OpenStack 简称为RDO.此篇是通过制作应答文件answer.conf自动化部署OpenStack Icehouse 版本. 由于采用RHEL7系统在部署中或多或少碰到不少报错的问题,这里只列出我的几张截图,在部署中还是需要根据实际情况来决定,多看下报错及日志文件:例如:解决包的依赖,服务不能没有启动起来,数据库密码设置未成功等:希望本篇可以给部署RDO的同学带来一