十一前后,遇到了两个很有意思的问题,现在记下来。
记得十一之前的一周,突然公司所有机型的截屏都不弄用了,这可让我郁闷了。截屏一直都是我在弄,从Android 2.3起,到Android 4.1,都自己都在弄,自己已经两三个月没有动代码了。在Android 2.3的时候,还经常动,原因是那是自己写的,先从PhoneWindowManager得到事件,发送broadcast从引用,应用从fb里读取数据,在生成PNG图片,之所以这么复杂的原因,是因为物理按键是在framework层截取的,而framework是没有读取SD卡权限的,所以怎个流程怎的这么复杂,当然这是权限问题引起的,就好比加了systemid属性的应用无法读写sd一样,所以这个流程产生了很多问题,比如图片会花呀,截出来是黑的呀,主要是Android有时候走的是overlay,等等,各种原因,有问题是正常的。但Android 4.0以后,是几乎没有什么问题的,原因是系统默认有截屏的代码,默认是长按POWER+音量下键,我们只是把截屏方式该了下,其他都没有动过。而且从4.0到4.1移植过去,都没有什么问题,可突然之间,所以开发的机型都有问题,我就郁闷了。
在截屏的代码里打了个LOG看了一下,发现无论怎么到无法在sd卡上写数据,可为什么现在会有问题呢?自己没有动过代码,想一下,应该是别人改出来的,查了一下,9月11的没有问题,12号的有问题,看了下11号到12集成的版本,50个左右,回退了一个半左右,20个左右的版本,但看其他的版本,跟我那个根本就毫无关系,第二天加班很晚才回来,但问题还没找到,回来怎么也睡不着,思前想后,是不是方法不对呀?那个晚上,躺床上想了很久,其他的版本是否还需要继续回退呢?想着想着,既然没有回退的版本,跟截屏一点关系都没有,那是不是应用引起的呢?明天回去试一下。第二天,把11号跟12号apk用二分法对调了一下,果然是应用引起的,mediaplay.apk一替换就不行了,找到相关的负责人问了一下,最近是不是做过什么改动,他说确实有改动。Android 4.0以后,在没有文件的时候,mediaplay会为你建立一个文件,但这样如果应用异常,变化产生很对垃圾文件,他把mediaplay改成不建立文件,而截屏的代码是在systemui下面,是加了systemid属性的,导致了无法读写sd的问题,也导致的无法使用截屏的问题。Android 4.1以后的截屏代码都没怎么看了,懒了,唉。
这周又遇到一个问题,就是在我们新的Android 4.1的代码的机型里,点击应用,按两次back键,滑动Launcher,都会变的很卡,会出现短暂的停顿现象,切西瓜的时候,也会出现,手指离开后,界面还在显示滑动的过程。追了问题一段时间后,发现这样的问题,都是会抛出anr,抛出anr后,会写sd卡的trace文件,整个dalvik会被pause掉,所以会出现这种卡顿的情况。对于ANR来说,我想都知道,只要看trace,应该就可以解决,而且都不知道看过多少这样的问题了,这次也不例外。分析trace文件很久,只有Launcher跟system_server两个进程在跑,但都很正常,一致的观点认为,问题出在system_server下面。我的理解是,trace文件是在有anr后5秒打出来的,但anr是在5秒前发生的,如果是死锁,或者其他的,也许可能还有用,但对于卡顿,trace打出来的状态,根本就不是引起卡顿时候的状态,所以没有多大用处。于是乎又跟了两天代码,依然毫无结果。明明是个anr,问什么就看不出来什么呢?在无意中,我同事说烧哥user版本的看看是否有这样的现象,结果大出意料,user版本的却没有这样的问题,这让人折腾的。user版本把许多log都去掉了,很多时候,在打log的时候,都会判断build的属性是user还是eng。
两个问题,都是以为出乎意料的结果出现,都是这么的坑人,都以为及不可能引起问题的原因,确引起的,看来胡适说的没错,”大胆假设,小心求证“,是相当有道理的。也许以后自己在处理问题的时候,如果坚持了三天,还没有解决,那应该就是方向问题了,可以停下想想,是否应该换个方向试试了,换一个认为不太可能引起问题的方向,找找别的出路,解问题的时候是这样,我还不知道做人是不是也应该这样,在走投无路的情况下,是否静下心来,好好想想,是否换个方向,也许能得到意想不到的的结果,我还没有遇到过,这样的疑问,有一天,我想我会得到自己想要的答案的。