Android:在Eclipse下开发android应用产生的问题及解决方法
总结下,新手在使用eclipse开发android过程中可能遇到的一些问题。
1、升级sdk后遇到的问题:Unable to execute dex: java.nio.BufferOverflowException.
具体信息如下:
Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.java.nio.BufferOverflowExceptionat java.nio.Buffer.nextPutIndex(Unknown Source)at java.nio.HeapByteBuffer.putShort(Unknown Source)at com.android.dex.Dex$Section.writeShort(Dex.java:818)at com.android.dex.Dex$Section.writeTypeList(Dex.java:870)at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437)at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423)at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317)at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423)at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163)at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)at com.android.dx.command.dexer.Main.run(Main.java:230)at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:187)at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:813)at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:597)at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:321)at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:396)at org.eclipse.core.internal.resources.Project$1.run(Project.java:618)at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)at org.eclipse.core.internal.resources.Project.internalBuild(Project.java:597)at org.eclipse.core.internal.resources.Project.build(Project.java:124)at com.android.ide.eclipse.adt.internal.project.ProjectHelper.doFullIncrementalDebugBuild(ProjectHelper.java:1116)at com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate.launch(LaunchConfigDelegate.java:147)at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:854)at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:703)at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:937)at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1141)at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
解决方法:
移除java build path下的Android Dependencies即可。作用是移除以前低版本的依赖文件,在重新运行时,编译环境会自动为项目添加新的依赖文件,所以可以放心的移除。
2、指定了低版本的安卓库,但是在run时却只能选择更高版本的AVD设备的问题(在同时有该低版本avd和更高版本avd的情况下):
具体信息:
比如已经选择Android 2.3.3作为库文件,并且已经有该版本的虚拟机的情况下,run程序时,target自动选择了4.4版本的avd设备,而不是2.3.3版本的avd。
原因:
在Java build path中选择安卓版本指明了该安卓应用适用的安卓系统版本。比如在Java build path中选择2.3.3版本,则编译环境会在project.properties中自动生成target=android-10。
但为什么run的时候会自动选择高版本avd呢?这是因为AdroidManifest.xml中minSdkVersion值设置有问题,如下:
<uses-sdk android:minSdkVersion="15" />
上面这段xml片段表明应用需要的最低sdk版本是15,即android 4.0.3。而目前的avd中只有2.3.3和4.4版本的,所以run时自动选择了4.4版本的以匹配这个设置。
所以解决方法就是将该值设置为minSdkVersion="10"即可。
上面的情况编译环境不会发出任何警告,所以需要开发者自己仔细注意了。
3、如何在logcat中查看程序异常信息?
具体情况:
比如:如下定义一个activity:
public class Bmi extends Activity { /** Called when the activity is first created. */ private RadioButton radio_man = (RadioButton) findViewById(R.id.radio_man);
上面代码段在定义radio_man时就试图通过findViewById获取ID为R.id.radio_man的视图对象,但是由于变量定义是在new对象时首先定义的,这时候不存在R.id.radio_man对应的对象,所以上面就会抛出异常。
作为一个不是很新的java新手,犯下如是错误实属不该。
那么如何查看到底哪里出错了呢?因为在avd模拟器上,只能看到如下视图:
解决方法:打开菜单Windows/show view/logcat,即可显示logcat视图,如下:
全选上面的错误信息导出到txt文档里,可看到更详细的信息如下:
12-05 05:22:08.971: D/AndroidRuntime(340): Shutting down VM12-05 05:22:08.971: W/dalvikvm(340): threadid=1: thread exiting with uncaught exception (group=0x40015560)12-05 05:22:09.221: E/AndroidRuntime(340): FATAL EXCEPTION: main12-05 05:22:09.221: E/AndroidRuntime(340): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.johnny.util/com.demo.android.bmi.Bmi}: java.lang.NullPointerException12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread.access$1500(ActivityThread.java:117)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)12-05 05:22:09.221: E/AndroidRuntime(340): at android.os.Handler.dispatchMessage(Handler.java:99)12-05 05:22:09.221: E/AndroidRuntime(340): at android.os.Looper.loop(Looper.java:123)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread.main(ActivityThread.java:3683)12-05 05:22:09.221: E/AndroidRuntime(340): at java.lang.reflect.Method.invokeNative(Native Method)12-05 05:22:09.221: E/AndroidRuntime(340): at java.lang.reflect.Method.invoke(Method.java:507)12-05 05:22:09.221: E/AndroidRuntime(340): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)12-05 05:22:09.221: E/AndroidRuntime(340): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)12-05 05:22:09.221: E/AndroidRuntime(340): at dalvik.system.NativeStart.main(Native Method)12-05 05:22:09.221: E/AndroidRuntime(340): Caused by: java.lang.NullPointerException12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.Activity.findViewById(Activity.java:1647)12-05 05:22:09.221: E/AndroidRuntime(340): at com.demo.android.bmi.Bmi.<init>(Bmi.java:33)12-05 05:22:09.221: E/AndroidRuntime(340): at java.lang.Class.newInstanceImpl(Native Method)12-05 05:22:09.221: E/AndroidRuntime(340): at java.lang.Class.newInstance(Class.java:1409)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)12-05 05:22:09.221: E/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)12-05 05:22:09.221: E/AndroidRuntime(340): ... 11 more
通过在at com.demo.android.bmi.Bmi.<init>(Bmi.java:33)上可知道Bmi.java的第33行代码抛出了空指针异常。
于是修改代码:
private RadioButton radio_man = (RadioButton) findViewById(R.id.radio_man);
修改为:
private RadioButton radio_man;
4、关于“The process com.android.phone has stopped”的解决方案
具体情况:
在我升级了我的android sdk到最新版本(android19)后,在模拟器上run之前编写的android 应用或导入别人的应用,均产生如题这样一个问题。程序看起来能够运行,但是不能进行输入,且不是弹出“The process com.android.acore has stopped”或“The process com.android.phone has stopped”错误对话框。不管是在2.3.3版本下碍事4.0.3下。
解决方案:
可能是android模拟器的一个bug,但是经过在网络上搜索,问题已经解决。
方法是:
首先,打开avd manager,删除所有现有的avd;
然后,新建新的avd设备,建议基于模板(比如nexus s)建一个。
最后,run你的应用,可以看到不会弹出令人烦躁的错误对话框了。
5、导入其他人现有工程到你的工作空间时可能遇见的问题
具体情况:
1)、可能遇见与问题1类似的问题,解决方法类似。
2)、可能因为AndroidManifest.xml文件中设置允许的最小sdk版本在你的编译环境不存在,从而产生类似“[2013-12-06 11:01:58 - Lesson14_HelloService] Unable to resolve target 'android-8'”错误,解决方法是修改<uses-sdk android:minSdkVersion="8" />为合适的版本。
6、 The connection to adb is down, and a severe error has occured.
这种情况遇到了一次。当时是插上手机到电脑上后,再打开eclipse,然后run应用程序的时候弹出该问题。
在网上搜索了一下,很多人讲到可能需要关闭手机卫士之类的程序,又考虑到我的手机已经打开调试模式,所以真的可能是由于主机已经打开adb的缘故。于是在任务管理器中寻找,果然有adb.exe进程。于是关掉该进程,拔掉手机,然后重启eclipse,问题得到解决。
7、Could not write file .classpath
在run由现有工程导入的程序的时候,又可能遇到上述错误。
问题原因是工程目录中的.classpath和.project已经设为隐藏了。如果你的电脑文件夹选项设为“不显示隐藏文件和文件夹”的话,在工程下时看不到这两个文件的。
解决方法:先设置文件及选项为“显示隐藏的文件和文件夹”,然后去掉这两个文件的属性“隐藏”前的勾选。
8、AndroidManifest.xml file missing
这是个比较奇怪的问题。因为你明明看到这个文件就在eclipse左侧的工程树中,但是eclipse仍然报这样的错误!而且中情况,也多半是发生在导入已有工程到工作空间引起的。
解决方法:将工程文件拷贝至其他地方,然后重新import一下。问题得到解决。
9、Eclipse不识别com.google.android.maps.xxx
在使用了import com.google.android.maps.xxx的android工程中,如果target设为非google apis,则eclpse会认为“import com.google.android.maps.xxx”
语句是错误的。
解决方法:将project build target选择为google apis。问题解决。
10、中文注释乱码问题
在javadoc generation向导中配置参数的地方,添加额外选项:-encoding UTF-8 -charset UTF-8
如下:
11、Android开发错误——Could not find class
在运行weibo app时,遇到问题:
Could not find class 'org.apache.commons.httpclient.methods.PostMethod', referenced from method weibo4android.http.HttpClient.multPartURL
首先是查看依赖的库中有没有httpclient类,及该类下面有没有PostMethod方法。答案是有该类及该方法。那这个问题就显得很奇怪。
第二个搜索得到的解决方案告诉我,有可能是因为该类并没有在生成apk的时候导入apk中,所以运行的时候会产生错误。经过试验,确实解决了问题。
下面是具体步骤。
2.在properties中没有设置,右键工程->properties->Java Build Path->Order and Export 将刚刚新建的A勾选->点击ok 就可以了。如图所示: not
12、Failed to install x.apk on device y: timeout
很奇怪的突然遇到上述问题。因为昨晚一切都是OK的,apk都能上传到手机上调试,但是今天早上起来一打开,出现上述异常。 搜索了一些解决,包括“ window- > preferences- > Android- > DDMS- > ADBconnectiontimeout(ms)“设置得更大,比如500000,还是未能解决该问题。 决定关闭eclipse,并且打开任务管理器,关掉adb.exe进程,然后重启eclipse。 重启完成后,再度连接到真机上调试,OK,已经可以安装成功。问题解决。更多相关文章
- AVD那些事儿
- uiautomatorviewer.bat的使用
- android获取应用基本信息
- android 发布时去除Log
- Android(安卓)DEX安全攻防战
- [2].FFMpeg入门之 - Android使用FFMpeg命令
- android R文件生成错误
- Android(安卓)定制RadioButton样式
- Android(安卓)文件下载三种基本方式