Eclipse 中使用ADT 时出现“R cannot be resolved to a variable”的错误简单解决

 更新时间:2016年9月20日 19:58  点击:2234
在eclipse中并不能直接开发android程序,需要一个ADT插件,但在64位Ubuntu上,Eclipse中使用ADT时,提示R找不到“R cannot be resolved to a variable”错误,如何解决呢?

在64位Ubuntu上,Eclipse中使用ADT查看Andorid App 代码时,发现很多都时红的(错误),提示为R找不到“R cannot be resolved to a variable”。

我们都知道R.java时自动生成的,通过R可以引用App中的resource。

同时,仔细一看,在gen/my.package/下并没有自动生成R.java文件。

其原因,应该是自动生成R.java的工具的运行需要32bit的一些库,而在64bit系统上默认可能缺少这些库。

解决方案也很简单,直接安装所需的库即可,例如在Ubuntu上:

 代码如下 复制代码
jay@jay-linux:~$ sudo apt-get install ia32-libs



安装好32bit的库后,刷新项目或重启Eclipse后,就正常了。

本文来分享我在Ubuntu使用Android SDK开发经验的几点总结,测试环境为:Ubuntu 12.04 x86_64,ADT Bundle Linux x86_64 。

测试硬件环境:

打开了Intel VT的PC (使用KVM时需要VT支持的)

测试软件环境:

Ubuntu 12.04 x86_64

ADT Bundle Linux x86_64 (在android官网下载:https://developer.android.com/sdk/index.html )

1. 下载所需的Image和创建AVD:

可以在Eclipse(ADT)中,”Window” -> “Andorid SDK Manager”来打开SDK管理器进行下载,需要下载相应版本(如Android 4.2.2/4.3)的SDK Platform及其对应的ARM或Intel x86 Atom的系统镜像(如果要在Intel PC上使用Emulator并且要使用KVM加速,则一定需要下载Intel x86 Atom的系统镜像)。另外,由于SDK Manager是默认到google.com的一些网站下载相关的信息,如果发现有连接不上的情况(原因你懂的),可以通过”Tools”->”Options”中设置你自己的代理。

在Eclipse-ADT中,”Window” -> “Andorid Virtual Device Manager” 来打开AVD管理器,在上面可以创建自己的AVD文件,注意:如果要在Intel平台上使用KVM加速,则创建AVD时,对CPU/ABI的选择是 “Intel Atom (x86)”。

另外,如果使用一些程序时,其定义的API没有找到,就需要自己下载了;比如,当前有Android API 18 SDK,可能某个程序需要API 17,就需要下载Android 17的SDK了。

2. KVM加速:

我们都知道,运行Android Emulator时很慢的,有时慢到难以忍受。

如果在Android Emulaor中使用了KVM,则可以实现启动和运行时程序的加速,效果可能提高5~10倍的执行速度;记得用x86那种AVD。

一些命令行操作如下:

 代码如下 复制代码
jay@jay-linux:~$ sudo modprobe kvm
jay@jay-linux:~$ sudo modprobe kvm_intel
 
jay@jay-linux:~$ lsmod | grep kvm
kvm_intel             137721  0
kvm                   415550  1 kvm_intel
 
jay@jay-linux:~$ ps -ef | grep emulator | grep -v grep
jay      11749 10704 14 19:48 pts/18   00:02:18 /home/jay/adt-bundle-linux-x86_64-20130917/sdk//tools/emulator64-x86 -avd Android-4.2-x86 -scale 0.23
 
jay@jay-linux:~$ lsmod | grep kvm
kvm_intel             137721  3
kvm                   415550  1 kvm_intel
# 可看使用Emualtor后,kvm_intel模块已经有3个引用了。

3. OpenGL ES:

如果有OpenGL ES的支持,则可以在Emulator中有更好的图像处理能力,比如:可以运行一些3D的程序。

当本机缺少或ADT没找到OpenGL相关的库时,会遇到如下的错误。

 代码如下 复制代码
[2013-10-10 18:34:19 - App2] Launching a new emulator with Virtual Device 'Android-4.2-x86'
[2013-10-10 18:34:26 - Emulator] Failed to load libGL.so
[2013-10-10 18:34:26 - Emulator] error libGL.so: cannot open shared object file: No such file or directory
[2013-10-10 18:34:26 - Emulator] Failed to load libGL.so
[2013-10-10 18:34:26 - Emulator] error libGL.so: cannot open shared object file: No such file or directory
[2013-10-10 18:34:26 - Emulator] emulator: emulator window was out of view and was recentered

解决方法也很简单,一般来说都是有了库的,只是需要添加一个软连接而已;有时,库也缺少,那么就需要先安装GL相关的软件库,再建立软连接。

 代码如下 复制代码
# 如果在/usr/lib下找不到libGL相关的东西,可以用 sudo apt-get install libgl1-mesa-glx  来安装相应的软件库。
jay@jay-linux:~$ ll /usr/lib/x86_64-linux-gnu/mesa/
total 428
drwxr-xr-x  2 root root   4096 Sep  3 17:56 ./
drwxr-xr-x 54 root root  36864 Oct 10 15:07 ../
-rw-r--r--  1 root root     31 Jun 19 04:54 ld.so.conf
lrwxrwxrwx  1 root root     12 Jun 19 04:54 libGL.so.1 -> libGL.so.1.2
-rw-r--r--  1 root root 390352 Jun 19 04:55 libGL.so.1.2
# 可以看到刚好没有libGL.so,就在 /usr/lib/x86_64-linux-gnu/mesa/ 目录下,建立一个指向libGL.so.1.2的软连接libGL.so即可
# 如果没有root权限,则可以在SDK的lib目录中建立软连接亦可,如下所示:
jay@jay-linux:~$ ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2 /home/jay/adt-bundle-linux-x86_64-20130917/sdk/tools/lib/libGL.so

Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。

周末试玩了一下在Eclipse中使用ADT开发Android应用程序的环境,当然诚如大家都懂的那样,Android Emulator模拟器启动和运行的速度确实是比较慢的,也都“有口皆碑”了的,呵呵。当然,Intel去年开发并在Google Android官方网站发布了一个对Android Emulator的驱动,大幅提升了在Intel x86平台上Android Emulator的启动和运行效率,从而提升Android应用程序开发者在使用Android模拟器开发程序时的效率。
在Windows、MacOS上使用HAXM (Hardware Accelerated Execution Manager) 来加速Android Emulator,在Linux平台上直接使用KVM加速即可。据官方介绍,一般来说使用了HAXM或KVM,有5~10x的性能提高,我简单看了下确实也有几倍的提高。
HAXM必须要求有Intel硬件虚拟化的支持,一般在BIOS中可以设置。BTW,ThinkPad X230的BIOS中,居然是在Security选项中设置VT的。
可以通过Android SDK Manager那下载HAXM, 在 Package 列表的最下面就是要用到的 Intel HAXM 扩展 (Intel x86 Emulator Accelerator (HAXM)),也需要安装对应的Image(Intel x86 Atom System Image)。下载后的HAXM安装文件在sdkextrasintelHardware_Accelerated_Execution_Manager 目录下,点击安装即可(注意如果Intel VT没有打开是不能安装成功的)。

在制作AVD时,需要设置其“CPU/ABI”属性为“Intel Atom (x86)”。对于图形方面的加速,编辑AVD设置时,Emulation Option选择“Use Host GPU”。

Android Virtual Device Manager中启动某个某个AVD时,可能会看到如下:

Starting emulator for AVD 'AVD_for_Nexus_S_by_Google'
emulator: device fd:620
HAX is working and emulator runs in fast virt mode
creating window 0 0 438 729

Eclipse中ADT运行时,对应的输出如下(可以看到HAX是否work):

[2013-07-08 11:44:43 - JayFirstApp] ------------------------------
[2013-07-08 11:44:43 - JayFirstApp] Android Launch!
[2013-07-08 11:44:43 - JayFirstApp] adb is running normally.
[2013-07-08 11:44:43 - JayFirstApp] Performing com.example.jayfirstapp.MainActivity activity launch
[2013-07-08 11:44:43 - JayFirstApp] Automatic Target Mode: launching new emulator with compatible AVD 'AVD_for_Nexus_S_by_Google'
[2013-07-08 11:44:43 - JayFirstApp] Launching a new emulator with Virtual Device 'AVD_for_Nexus_S_by_Google'
[2013-07-08 11:44:47 - Emulator] emulator: device fd:620
[2013-07-08 11:44:47 - Emulator]
[2013-07-08 11:44:47 - Emulator] HAX is working and emulator runs in fast virt mode
[2013-07-08 11:44:50 - Emulator] creating window 0 0 438 729
[2013-07-08 11:44:50 - JayFirstApp] New emulator found: emulator-5554
[2013-07-08 11:44:50 - JayFirstApp] Waiting for HOME ('android.process.acore') to be launched...

BTW,HAXM是我们Team开发的,如果大家使用时遇到什么bug,也可以反馈给我,我可转交给HAXM的developer。 (Update:本人不在那个team,请大家有问题到Intel HAXM官方网站去反馈吧: http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager)

使用 Intel HAXM 为 Android 模拟器加速,媲美真机

Intel HAXM (Hardware Accelerated Execution Manager) 使用基于 Intel(R) Virtualization Technology (VT) 的硬件加速, 因此需要 CPU 支持 VT , 而且仅限于 Intel CPU, 与 AMD CPU 无缘, Intel HAXM 的描述如下:

使用 Intel VT 技术;

为 Android x86 虚拟设备的模拟运行提供硬件加速;

与 Android SDK 集成;

硬件需求如下:

支持 VT-x, EM64T 以及 Execute Disable Bit 的 Intel 处理器;

至少 1GB 可用内存

支持的操作系统:

Windows 7 (32/64-bit)

Windows Vista (32/64-bit)

Windows XP (32-bit only)

OS X 10.6 or 10.7 (32/64-bit)

下载并安装 Intel HAXM 扩展

启动 Android SDK Manager, 在 Package 列表的最下面就是要用到的 Intel HAXM 扩展, 打勾, 下载, 不用去 Intel 的网站, 如下图:

 

下载并安装 Intel HAXM 扩展

 

下载 HAXM 之后, 需要运行安装程序来进行安装, HAXM 下载的目录是 android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager , 运行 IntelHaxm.exe 进行安装, 根据屏幕提示,一步一步安装即可。

下载 Android x86 镜像

Android SDK Manager 中已经有了 4.1.2 的 x86 镜像, 因此选择 4.1.2 x86 镜像, 如下图所示:

 

下载 Android x86 镜像

 

使用 Android x86 镜像

新建或者编辑 Android 模拟器, 将模拟器 CPU/ABI 设置为 Intel Atom X86 , 如下图所示:

 

配置 Android 模拟器使用 x86 系统镜像

 

如果上面的步骤都没有出错, 现在, Android 模拟器运行的速度几乎可以媲美真机了, 再也不用羡慕 MAC 平台上的 iOS 模拟器。

张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

在Android开发中,测试完全模拟人为点击时输入中文比较麻烦,不过我们可以用 MonkeyRunner 自动输入中文字符,下面我们来分享这个的实现方法。

在做一些Android自动化脚本,比如向手机QQ中输入中文聊天内容,由于使用Robotium、Appium等工具来做时,由于TX作了签名校验的,所以登录不了QQ的。后来只能使用最傻的MonkeyRunner来做,不过它是完全模拟人为点击,而数据中文就很麻烦了。为此我们尝试了多种方案,简单分享一下:

1. 通过PC的剪贴板与Android模拟器中共享来实现:先将要输入的中文放到PC的剪贴板中,再到Android模拟器中粘贴到QQ聊天输入框中。其缺点是,很不稳定,有时候成功,有时候比较莫名的失败。

2. adb shell input 命令可直接将字符串输入到Android应用的Input框中,但问题来了,它不支持unicode字符啊(仅支持ASICC字符)。于是,我根据网上资料找到了一个方法:使用unicode字符原样输出,然后再转化为encoded字符。比如:https://github.com/bingwei/inputchineseviaadb,就实现了这样的转换,在app中复制到android的剪贴板中,然后可以在QQ聊天框等地方粘贴就好了。当然这里他这个gitlab项目中utils/inputunicode.py文件有点小bug,对于python 2.x,需要在adb shell input后跟的string用encode(‘unicode-escape’)编码。
这个种方式的速度不是很快,不过还是算不错的,因为本来做UI自动化耽误个一两秒钟也是可以接受的;我们最终就是采用了这种方案,目前运行下来是非常稳定的。

3. 使用一个外部REST服务器,搞一个key-value对放到REST sever中,其中key是全英文的,而value中可以包含中文;然后通过adb shell input将key传入到Andoid中,在Android中根据key去请求远程REST API从而得到包含中文字符的Value。没试过这种方法,不过应该是可行的;但其效率估计比第2中方法还要效率低下。

4. 一种专门为unicode做的输入法,可以adb shell input输入unicode,它帮你转成中文之类的字符。没真正尝试过。

本文我们来看看使用 Android Emulator 模拟器,如何设置自己的GPS地址位置信息的几个方法,做 Android 开发的朋友可以看下。

使用Android Emulator,可以自己设置GPS地理位置信息,根据Android官方文档的介绍,可以有如下几种方式:

1. 通过命令行:

telnet 5554    # 5554为emulator的console端口
 
geo fix 121.420413 31.215345  # 第一个数值是经度(longitude),第二个数值是纬度(latitude)
# 可从 google maps获取经纬度, https://maps.google.com/

2. 通过Eclipse:


设置路径为:Window > Show View > Other > Emulator Control.
In the Emulator Control panel, enter GPS coordinates under Location Controls as individual lat/long coordinates, with a GPX file for route playback, or a KML file for multiple place marks. (Be sure that you have a device selected in the Devices panel—available from Window > Show View > Other > Devices.)
Using DDMS

3. 通过DDMS:

With the DDMS tool, you can simulate location data a few different ways:
Manually send individual longitude/latitude coordinates to the device.
Use a GPX file describing a route for playback to the device.
Use a KML file describing individual place marks for sequenced playback to the device.

我还是比较喜欢用命令行的方式~
不过,我通常使用HAXM或KVM来加速我的emulator(里面时运行Intel的image),我就发现这些设置方法对我的emulator都没有生效。这个问题曾经困扰了我好几天,后来和一个同事交流时才发现,其实这个设置地理位置信息是依赖于Google API的,而使用Intel的一些image,里面默认时没有Google API的,所以不能生效(即使geo fix命令返回是ok)。所幸的是,Android SDK中从android 4.4开始也直接提供了x86 image的Google APIs。
对于Android 4.3/4.2等的X86镜像,需要通过如下步骤来手动添加Google API的支持。

 代码如下 复制代码
1.  In Android Virtual Device Manager create an AVD with target "Android 4.3/4.2"  (其实就是先使用arm的image)
2.    emulator -avd name_of_avd    (启动arm image)
3.   adb pull /system/etc/permissions/com.google.android.maps.xml     (下载google maps相关文件)
4.    adb pull /system/framework/com.google.android.maps.jar   (下载google maps相关文件)
5.    (optional) Remove the create AVD in Android Virtual Device Manager   (删掉刚才使用的ARM avd,可选)
6.   In Android Virtual Device Manager create an AVD with target "Intel Atom x86 system Image (Intel Corporation) - API Level 18"    (创建Intel x86 image)
8.   emulator -partition-size 1024 -no-snapshot-save -avd name_of_avd   (启动x86 image)
9.   adb remount rw    (让文件系统可写)
10.    adb push com.google.android.maps.xml /system/etc/permissions    (上传google maps相关文件到x86 iamge中)
11.   adb push com.google.android.maps.jar /system/framework   (上传google maps相关文件到x86 iamge中)
12.    Download mkfs.yaffs2.x86  (下载地址:https://android-group-korea.googlecode.com/files/mkfs.yaffs2.x86)
13.   adb push mkfs.yaffs2.x86 /data   (将mkfs.yaffs2.x86传到image里面)
14.   adb shell   (连接到该emualtor的shell)
15.   cd /data
16.    chmod 777 mkfs.yaffs2.x86
17.   ./mkfs.yaffs2.x86 /system system.img            (重新制作system.img文件)
18.    exit  (退出adb shell)
19.    adb pull /data/system.img  (下载制作好的system.img,需要较长时间,耐心等待吧)
20.    Copy system.img into avd directory    (将这个system.img 复制到的你的AVD目录中,覆盖掉原来的system.img,可以先备份原来的)
21.   Reboot emulator  (重启emulator,即可使用到新的system.img)



我第一次这么操作时,在上传google maps文件到x86 image中时,出现了如下的错误:

jay@jay-linux:~/adt-bundle-linux-x86_64-20140321/sdk$ adb push com.google.android.maps.xml /system/etc/permissions
failed to copy 'com.google.android.maps.xml' to '/system/etc/permissions/com.google.android.maps.xml': Out of memory

后来发现原因是,原本的system.img的容量只够存放自己的东西,里面已经存不下其他东西了。所以,在启动x86 AVD时,要用”emulator -partition-size 1024 avd-for-x86“命令来调整/data目录的大小为1024MB。

参考资料:


android官方文档:http://developer.android.com/guide/topics/location/strategies.html
Intel image使用Google Maps API: http://38911bytes.blogspot.de/2012/03/how-to-use-google-maps-api-in-android.html
http://stackoverflow.com/questions/9857325/google-maps-sdk-with-new-intel-atom-x86-emulator

[!--infotagslink--]

相关文章

  • Ecshop提示Only variables should be passed by reference in错误

    在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25
  • 409错误是什么 http 409错误怎么解决

    409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • 414错误是什么 414错误怎么解决

    414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • Tomcat配置及如何在Eclipse中启动

    这篇文章主要介绍了Tomcat配置及如何在Eclipse中启动,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-04
  • http 402错误是什么 http 402简介

    http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
  • 411错误是什么 411错误怎么解决

    411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • 404错误是什么 404错误怎么解决

    403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
  • PHP Fatal error: Cannot use object of type stdClass as array in错误

    下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。 普通的数组出现如下错误 代码...2016-11-25
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21