文档章节

gen下R文件消失 && 工程无故报错

zhengguogaun
 zhengguogaun
发布于 2013/06/19 15:20
字数 1783
阅读 148
收藏 0

一、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

gen下R文件消失 <wbr>&& <wbr>工程无故报错

i. 是开发者的粗心大意么?

  1. 新建一个普通的工程,然后手动删除gen目录,马上地工程就报错的,但很快就工程目录下自动生成gen目录,并且在该目录下可以找到R类文件,程序运行无误。
  2. 通过Project->Clean功能,进行该操作的原因是R类文件是与资源文件同步来定义资源ID的,而该功能能清除开发工具自身产生的操作。果不其然,gen目录消失不见了,但经过对任意文件的修改并保存后,gen目录重新出现在工程目录中,这与背景描述不符。
  3. 在工程的实际路径下删除gen目录,然后在eclipse中导入该工程,报错如右图所示,同样进行对文件的修改,结果gen目录又回来了,与背景描述也不符。
  4. 综上可得结论:开发工具自动生成R类文件的功能是如此的强大,并且我觉得每一个Android开发者都应该知道R类文件的重要,并不会冒然去对它进行如此危险的操作吧^_^。。

ii. 是一个bug?

  1. 把布局文件夹下的文件故意修改成报错状态保存后,进行Clean操作后,只要保持报错状态,R类文件就不会恢复。
  2. 关于这个问题更多的测试,我真不知道该如何去做,根据网络上的相关介绍,确实有相当一部分人出现R类文件丢失的情况,而大多数介绍的是由于资源文件夹里的xml资源文件使用了转义字符的缘故,也就是说开发工具可能定义了转义字符但忽略了在字符串中使用它们的可能性。

 

5. 案件结论:

a) 修正所有报错的地方,即可。

b) 既然可能是开发工具的中转义字符引起的一个bug,那么在使用转义字符的时候就应当注意一下了,下面给出常用的转义字符

转义字符 实际符号 名称
&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号

备注:转义字符后面的分号不可省略,更多的转义字符可参考网络资源。

c) 解决方案:

i. 右击工程->Android Tools->Fix Project Properties

ii. 右击工程->Properties->Android->选择正确相应的target然后点击apply。

iii. 上面两方法不奏效时,就能检查下res文件夹里的xml资源文件了:

(1)xml文件名不能包括大写字母。

二、android工程无故报错--conversion to dalvik format failed with error 1

conversion to dalvik format failed with error 1:

android低版本工程(如2.1)放到高版本环境中(如2.2)可能会上述错误。

法(1):Android2.1问题。建工程建议直接使用2.2以上版本。

法(2):尝试project clean。

法(3):修改SDK版本。

网上问题解决附录:

在eclipse开发Android项目时出现的很多问题都可以使用Project--------->clean来轻易解决。

但如果出现说Android库找不到,或者不小心remove了Android系统库,怎么重新添加Android系统库呢?
在eclipse里面的Java Build Path里面是没法添加例如Android 2.1这样定义好的系统库。而我尝试手动添加
SDK 文件夹里面的Android.jar,结果出现了Conversion to Dalvik format failed with error 1问题了。折腾了
一番后,很多网友都说用Project clean可以解决,但对我的情况来说,没有用处。
在百度找到解决方法了:
修改项目classpath文件,这让我明白了,直接从其他正常项目里面把
<!-- 注意,这个.classpath文件在eclipse工作空间的硬盘存放位置对应工程项目目录下面 -->

<classpathentry kind="lib" path ="自定义jar的地址" />
修改成

<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>。
这样子刷新项目,Android系统库Android 2.1回来了,那个错误也解决了。

--------------------------------------------------------------------------------------------------------------------------

这几天又遇到这样的问题了,但是.classpath文件里面已经包含了上面的con Path,后来在论坛
(http://www.eoeandroid.com/thread-53880-1-1.html)上找到新方法:

project -> properties -> android label, check a target from the project build target list
<!-- 这样有时候还是不能去掉错误,这时候注意,在进入project -> properties -> android后,下面有
一个is library项,把它勾上,再点击确定错误就OK了,我的错误就是这样解决的,一开始按照上面
以及后面的方法都解决不了,最后我看到有一个is library项,把它勾上再确定试一下OK,错误没了 -->
============================================================================

附:
上网上广为流传的解决方法:conversion to dalvik format failed with error 1的解决办法

android低版本工程(如1.5)放到高版本环境中(如2.2)可能会上述错误,解决方法如下:
1、如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。 (该处理方式
只是在高版本中兼容了低版本工程,未真正意义上的升级)

2、如果修改android sdk版本,则需要以下几个步骤:
1) 修改SDK
选择工程,build path --> configure build path ---> library 删除引用的低版本SDK,
然后add External JARs,选择高版本SDK,OK,保存
2) 修改classpath文件

该文件可能存在该项: <classpathentry kind="lib" path ="你所指定的高版本的地址"
把她修改成<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" />
3) 修改AndroidManifest.xml
在AndroidManifest.xml文件中,application标签后添加<uses-sdk android:minSdkVersion="3"></uses-sdk>
4) 修改default.properties(很重要)
该文件最后一行(前面没用#的)target=android-3 该成target=android-8,保存。
再看看你的工程和新建的android 2.2的工程结构就一样了。

本文转载自:

zhengguogaun
粉丝 2
博文 82
码字总数 5243
作品 0
珠海
私信 提问
Android项目R文件丢失报错

项目中遇到这种问题,很是抓狂,所以我把解决的方案都写下来,给大家作为参考。在你查找百遍后,最可能的原因是xml出错,仔细查找你的文件拼写,命名0-9a-z之后你会发现项目里该报错的信息提...

ForingY
2016/07/17
81
0
Android 工程引用其他Library工程时的R.id问题

A为普通Android工程B为设置了is Library的工程,B中有使用R.id,当A工程引用了B工程时会在A工程的gen目录中生成B的R文件,里面也包含了A的R文件中的内容,但是当B的id定义在layout文件中时需要注...

lxholding
2012/09/28
1K
0
Android: R cannot be resolved to a variable

Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用。。。 1. 检查Android 的SDK...

carlos
2012/07/22
288
0
R cannot be resolved to a variable 解决办法

Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用。。。 1. 检查Android 的SDK...

码飘雪
2015/09/06
292
0
龙且/AvalonProbuffTool

Avalon 网络协议 Avalon 辅助生成ProtocolBuffer的项目。 protobuf 目录下放置 pro文件。 进入到工程目录下 linux/Mac 首先使用buildProtobuf.sh生成对应的Java模板文件 在执行BuilMessageUt...

龙且
2016/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部