R类文件失踪案
1. 背景:
前些时候,在进行Android程序开发过程中帮助同学修改xml代码时候,偶尔会出现R类文件离奇失踪事件,当时经过一些恢复操作无果后,只好重建一个工程。由于R类文件在Android工程中是一个极其特殊的存在,所以我就此进行了一些小测试。
2. 失踪者资料:
R类文件是由ADT自动生成的一个文件,居所是gen目录下,其会为每一个资源定义唯一的ID,而整个工程就是通过ID的识别来引用相关资源,故R类文件可谓是我们工作的资源中心。
3. 案情分析:
由于R类文件的特殊性,故其的作用是举足轻重的,但这时它竟然失踪的!!一个诺大的工厂就因为缺乏资源的“进口”,无法进行任何“生产”了。究竟是谁把我们的R类文件给绑票了呢?现进行如下可能性推测:
a) 开发者的不小心把gen目录给删除了;
b) 开发工具的一个bug。
4. 案情推理:
a) 测试环境:Android-1.5
i. 是开发者的粗心大意么?
- 新建一个普通的工程,然后手动删除gen目录,马上地工程就报错的,但很快就工程目录下自动生成gen目录,并且在该目录下可以找到R类文件,程序运行无误。
- 通过Project->Clean功能,进行该操作的原因是R类文件是与资源文件同步来定义资源ID的,而该功能能清除开发工具自身产生的操作。果不其然,gen目录消失不见了,但经过对任意文件的修改并保存后,gen目录重新出现在工程目录中,这与背景描述不符。
- 在工程的实际路径下删除gen目录,然后在eclipse中导入该工程,报错如右图所示,同样进行对文件的修改,结果gen目录又回来了,与背景描述也不符。
- 综上可得结论:开发工具自动生成R类文件的功能是如此的强大,并且我觉得每一个Android开发者都应该知道R类文件的重要,并不会冒然去对它进行如此危险的操作吧^_^。。
ii. 是一个bug?
- 把布局文件夹下的文件故意修改成报错状态保存后,进行Clean操作后,只要保持报错状态,R类文件就不会恢复。
- 关于这个问题更多的测试,我真不知道该如何去做,根据网络上的相关介绍,确实有相当一部分人出现R类文件丢失的情况,而大多数介绍的是由于资源文件夹里的xml资源文件使用了转义字符的缘故,也就是说开发工具可能定义了转义字符但忽略了在字符串中使用它们的可能性。
5. 案件结论:
a) 修正所有报错的地方,即可。
b) 既然可能是开发工具的中转义字符引起的一个bug,那么在使用转义字符的时候就应当注意一下了,下面给出常用的转义字符
转义字符 |
实际符号 |
名称 |
< |
< |
小于号 |
> |
> |
大于号 |
& |
& |
和 |
' |
' |
单引号 |
" |
" |
双引号 |
备注:转义字符后面的分号不可省略,更多的转义字符可参考网络资源。
c) 解决方案:
i. 右击工程->Android Tools->Fix Project Properties
ii. 右击工程->Properties->Android->选择相应的target然后点击apply
iii. 上面两方法不奏效时,就能检查下res文件夹里的xml资源文件了