1、问题背景
最近接手了一个Android开发项目,由于之前的开发人员是用Android studio开发的,并且用的Android6.0的API,因此我之前用的eclipse就不能支持了,于是正式安装了Android studio,来体验一下google官方推荐的开发工具感觉如何。我的版本是2.2.2
2、问题描述
昨天上午,我在app中添加了一个activity并为之配了相应的布局文件,之后突然发现,应用报错了!!!!而且坑爹的Android studio没有给出任何的报错信息,只有一句话:app:mergeDebugResources FAILED。于是按照惯例,我首先去百度,一般来说,这种问题一定是大家都会遇到的,所以一般都会得到答案,但我万万没有想到,由于Android studio给出的这一句错误信息模糊不堪,而可以导致这个错误的原因有非常多,因此百度到的答案众说纷纭,没有一个能解决我的问题……但是学到了一个可以在Android studio中打印详细报错信息的方法,也算一点收获吧……
方法附上:
在命令行中进入项目的根目录,或者可以在Android studio的Terminal中直接操作也可以,然后敲入一个命令:
gradlew compileDebug --stacktrace
就可以输出较详细的信息,然后根据命令行给出的提示,还可以在后面加上-info或者-debug的选项得到更详细的信息,于是这个命令可以这样写:
gradlew compileDebug --stacktrace -info
或者:gradlew compileDebug --stacktrace -debug
但是并没有任何作用!给出的报错信息都是包中的类的错误位置,没有一句提到是我的代码的什么地方出了错,打印出的信息截图如下:
就这样整整耗费了我一整天的时间,debug没有任何进展,我带着万般无奈的心情在当天的bug还没有被解决的情况下睡觉了,盼望第二天能解决它……
3、排错过程
由于一直在想这个bug,我一晚上都没睡好,今天早早就醒了,起来继续debug,哎………………
前一天在百度的过程中,我看到一位大大在博客里写到出现这种报错一般是之前的代码哪里写错了,只要回复到之前的版本就可以了,但是我第一没有把项目推到github上,第二Android studio已经关闭过了,不可能使用Ctrl+z来恢复,不过我觉得这位大大说的还是很有道理的,因为我真的觉得没有什么导致了错误,也只能是这样了,于是我就顺着这个思路往下找,把项目中的十几个activity文件的代码逐行检查了一遍,同时把几十个layout文件也逐行检查了一遍,没有任何错误……崩溃
于是我又开始用老方法,企图从报错信息中找到一些蛛丝马迹。不过这一次我在打印出的信息中注意到了以前没有关注的细节,附图:
注意看我用红色标记的句子,它说compileDebug这个命令是模糊的,可以用后面那一大串来代替它,然后我突然反应过来,我报的错误一直提示什么resource的问题,于是我在这些候选命令里找到了红线标注的一句:compileDebugSources,本着死马当活马医的心态,我把打印报错信息的命令改成了如下这样:
gradlew compileDebugSources --stacktrace -info
然后还真的获得了一些不同的信息,附图如下:
注意我用红线标注的地方,它说我在drawable-xhdpi这个目录下少了一张图片,我很奇怪,因为程序出错的时候我根本没有动过图片,将信将疑地,我打开相关目录看了一下,方法如下:
如图,点击我用红线框起来的地方,把视图改成project,于是可以看到完整的目录结构:
找到报错信息提示的目录,我发现之前我用到的若干图片,只放在了mipmap-mdpi中而在mipmap-hdpi中没有,于是我复制了一份放到mipmap-hdpi中,再次尝试启动应用,神奇的事情发生了,程序正确运行,错误被排除了!!!!太感人了……
4、总结
这次的排错过程让我摸索出了很多东西,和大家分享一下
1、Android studio不像eclipse那样可以直接在logcat中打印错误信息,更别提错误代码的定位了
2、如果希望获得Android studio的报错信息,需要手动编译项目,方法我已经写在上面
3、排错时,首先用gradlew compileDebug --stacktrace -info来查看最基本的信息,然后根据这些信息进一步精确命令,比如在本例中我需要用compileDebugSources来获得更精确的定位
4、虽然感觉到Android studio用起来不如eclipse舒服,存在很多缺点:重量级,运行需要耗费许多计算资源、不能很好地给出错误提示,不能定位错误代码、有时候会出现一些莫名其妙的错误,但是毕竟它是google官方推荐的开发工具,并且目前对eclipse的维护已经停止,因此我们不得不将平台逐渐迁移到Android studio来,只好自己去适应这个工具的一些特点,相信我这次调错得到的一些经验对于今后的调试还是有一定帮助的
5、最后的最后,在编程的过程中,经验的指导作用还是相当重要的,因此当我们把每一次的debug当做一次积累经验的机会和学习调高的机会的话,那么debug也没有那么可怕了,甚至当排除一个奇怪的错误时还能获得很多的成就感。