http://www.devba.com/index.php/archives/6157.html  Android闪屏问题的分析思路

作者:孤风一剑   发布:2015-01-22 12:35   栏目:移动开发   点击:2,114次   评论关闭  
 

闪屏问题作为Android的一类常见问题,原因复杂多样.我们在这里整理一下如何分析闪屏问题,找到具体导致闪屏问题的原因.

严格从技术来说,闪屏问题不能归为一类问题,他是因为屏幕快速变化导致用户看起来显示不正常的问题(很多测试者甚至会将花屏问题当做闪屏问题,这里不做讨论).它可能是多种完全不同的原因导致的,硬件问题,驱动问题,绘制问题,合成问题,窗口调度问题,activity问题,以及app本身的逻辑问题都有可能导致用户看起来屏幕闪屏的感觉,其中百分之九十以上闪屏的问题是由后三种问题导致的.

特殊指出的是,由于闪屏问题基本都是逻辑错误而不是异常,基本难以单纯从log中看到异常信息,因此要分析闪屏问题,可复现的问题最好,如果不能,起码要保证有清晰完整的屏幕录像(adb shell screenrecord录下来的最好),否则问题无法分析.

下面我们来讲下如何分析一个可复现的闪屏问题:

 

1 首先来确认下问题是否和屏幕硬件以及驱动有关

 

1.1 屏幕录像,是不是屏幕问题?

这个问题很好确认,将手机连接电脑,输入adb shell screenrecord /sdcard/tt.mp4,稍等片刻,开始复现问题,在问题复现完毕后,停止命令执行,去手机sdcard目录下查看视频文件.
如果视频文件中问题不存在,说明这个问题和屏幕硬件驱动或者MDP合成有关系,我们需要继续区分这到底是屏幕问题还是合成问题.

 

1.2 是不是合成问题?

如何区分这到底是屏幕问题还是合成问题呢?打开开发者选项,勾选禁用硬件叠加选项.
重新复现问题,如果问题依然复现,说明问题是LCD驱动或者硬件层面导致,这是需要LCD组进行check;
如果问题不再复现,说明这很大可能是一个MDP合成问题,需要平台厂商进行check.

 

1.3 underruan问题?

这里指出一种特别的闪屏问题,如果屏幕闪烁规则的半个屏幕的蓝色或者黑色矩形,我们有理由怀疑是发生了underrun,这种闪屏问题是可以通过log来确认的,一般来说如果在log中看到显示有关的硬件打印了underrun的log,说明此时发生了underrun.一般是由于平台某个硬件带宽不足引起的,建议将问题交给平台来处理.

 

2 接下来我们需要看下是不是绘制或者硬件加速问题

 

2.1 是不是硬件加速问题?

其实,一般来说,如果闪屏只发生在某个特定的路径下,一般基本没有可能是绘制的问题或者GPU的问题(因为绘制错误只会导致花屏,不可能导致屏幕大小级别的闪屏,如果绘制或者GPU出问题导致闪屏,一般会出现整个系统所有app不分路径的闪屏),尽管可能性很小,我们也可以测试排除一下.

关闭发生闪屏的程序的硬件加速,在app的AndroidManifest.xml文件中,加入application android:hardwareAccelerated="false" ,如果问题发生在两个app切换时,关闭两个app的硬件加速,重新编译app,拷贝替换.

复现问题,如果问题继续复现,说明这个问题和绘制没有关系;如果问题不复现,需要继续排查是GPU硬件问题还是硬件加速问题导致的闪屏.

 

2.2 是不是GPU问题?

一般来说,如果是GPU出现问题,会不分路径的,在除了全屏视频播放之外的所有路径下都可能出现大范围的闪屏,这种情况下log中一般搜索opengl的log,会发现在闪屏的应用打出了海量的opengl error的log,这种情况下,很有可能是发生了硬件损坏,建议交给硬件部门check.

 

3 继续分析问题

如果经过前面的check,我们确定不是硬件的问题,不是驱动的问题,不是绘制的问题,也不是合成的问题.那基本上这个问题就是上层的问题,为了确定到底发生了什么问题,我们需要进一步的确认.

 

3.1 再一次的分析录像

对于闪屏问题,adb shell screenrecord录到的视频是最有分析价值的,所以我们需要进一步分析.
分析之前请下载一款具有高级视频调节功能的播放器,逐帧播放问题发生时的录像.

因为闪屏问题,很多时候是切换的问题,那么我们也可以放慢动画速度来观察现象.打开开发者选项,将其中的窗口动画比例,过渡动画比例,以及动画影像时间伸缩效果都设置为10x,这样我们也可以清晰的看到切换的时候发生了什么问题.

此时剩下的问题一般就是activity或者窗口快速切换让用户产生了屏幕在闪的幻觉,这种问题大多都可以通过查看录像慢放明显的看到不该出现的activity(窗口)出现了,这种问题就是app本身在activity的切换逻辑上有问题,这样我们就可以从app的角度进行分析(如果慢放动画可以使得现象变慢的话,我们也可以在问题发生时,抓取SurfaceFlinger的dumpsys,以及通过ADT的Hierarchy view查看闪出来的是哪个activity).

一种比较少见的问题是,app使用了某种特殊的动画效果,让测试者或者用户感觉是闪屏问题.这个时候,在开发者选项中的绘图选项中,将三个动画相关的设置都修改为动画已关闭.如果问题消失,那么可以确定是app自身使用了某种特殊的看起来像是闪屏的动画效果.

当然还存在另外一种情况,窗口数量是正常的,但是窗口之间在不正常的频繁切换.

对于后一种情况,只靠查看视频还不能完全确认,我们还需要查看log来进一步确认.

 

3.2 查看log中窗口的变更和绘制

窗口之间在不正常的频繁切换,对待这种问题,一个最简单有效的办法是,在问题复现时,保持手指一指触摸屏幕,然后抓取log,我们会看到触摸的焦点窗口一直在高速变化,如下:

  1. 11-01 10:45:07.047: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ..}
  2. 11-01 10:45:07.087: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0 ...}
  3. 11-01 10:45:07.207: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ...}
  4. 11-01 10:45:07.237: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0..}
  5. 11-01 10:45:07.257: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ...}
  6. 11-01 10:45:07.287: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0 ..}

这样我们就可以断定是app在进行不正常的window切换,我们就可以从app的角度检查一下在问题发生时activity的切换逻辑了.

Android闪屏问题的分析思路的更多相关文章

  1. react-native移动端设置android闪屏页

    前言 因为app启动时会白屏一段时间,导致让人用起来非常的不舒服,后来了解一下知道这叫做闪屏 于是着手解决这个白屏的问题,换个颜色?不行,不如用一张好看的图片来替换,这样才让人看起来更加舒服. 那么该 ...

  2. android 闪屏还是会出现黑屏问题

    public class SplashActivity extends Activity{ @Override protected void onCreate(Bundle savedInstance ...

  3. imx6 android 进入文件系统闪屏

    imx6进入文件系统的时候都会闪屏,应该是framebuffer未初始化,就已经打开了背光.目前解决办法,在kenel阶段关闭背光,显示android的开机动画之后(此时framebuffer已经初始 ...

  4. android 的闪屏效果

    android的闪屏效果,就是我们刚开始启动应用的时候弹出的界面或者动画,过2秒之后自动的跳转到主界面. 其实,实现这个效果很简单,使用Handler对象的postDelayed方法就可以实现.在这个 ...

  5. Android 实现闪屏页和右上角的倒计时跳转

    效果图: 闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.No ...

  6. 【转】android 电容屏(三):驱动调试之驱动程序分析篇

    关键词:android  电容屏 tp 工作队列 中断 坐点计算  电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0  平台:S5PV310( ...

  7. Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面

    上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友可以点击链接回去 ...

  8. Android应用icon和闪屏splash的尺寸

    icon (尺寸为px) 目录 尺寸 (width * height) drawable 72 x 72 drawable-hdpi 72 x 72 drawable-ldpi 36 x 36 dra ...

  9. Android中使用Handler以及CountDownTimer实现包括倒计时的闪屏页面

    上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的用法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友能够点击链接回去看看 ...

随机推荐

  1. MobX入门示例

    在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的. 没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那 ...

  2. linux解压缩的常用命令

    1.解包:tar xvf filename.tar, 打包: tar cvf filename DirName 2.解压:gunzip filename.gz, tar zxvf filename.t ...

  3. win10开机启动vmware虚拟机【亲测可用】

    创建vbs脚本放到开机启动目录: set ws=createobject("wscript.shell") ws.run """C:\Program ...

  4. 【爬虫】使用selenium设置cookie

    https://segmentfault.com/a/1190000015826749

  5. 小型SSM项目出现Failed to load ApplicationContext错误的解决方法(个人向)

    使用单元测试的时候,出现了Failed to load ApplicationContext错误,在添加了一个新的Mapper.xml文件才出现的,在保证其他配置文件没有出错的情况下,检查mapper ...

  6. Codeforces C Match Points(二分贪心)

    题目描述: Match Points time limit per test 2 seconds memory limit per test 256 mega bytes input standard ...

  7. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  8. wordpress防止垃圾邮件的另一种方法

    我们知道wordpress可以用Akismet插件防止垃圾邮件,前面ytkah还讲过contact form 7如何搭配Akismet过滤垃圾邮件,还有什么方法呢?我们留在网站上的邮箱有可能被爬虫批量 ...

  9. Markdown插入图表

    链接:https://www.jianshu.com/p/3cf83d22dd3d Markdown图表语法 本文介绍如何用Markdown的mermaid等语法插入时序图.流程图.甘特图 如果是想学 ...

  10. js语言评价--js 基于哈希表、原型链、作用域、属性类型可配置的多范式编程语言

    js 基于哈希表.原型链.作用域.属性类型可配置的多范式编程语言 值类型.引用类型.直接赋值: 原型是以对象形式存在的类型信息. ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值,对 ...