关闭

Android:在Eclipse下开发android应用产生的问题及解决方法

2665人阅读 评论(1) 收藏 举报
分类:

总结下,新手在使用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.BufferOverflowException
	at 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 VM
12-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: main
12-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.NullPointerException
12-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.NullPointerException
12-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中,所以运行的时候会产生错误。经过试验,确实解决了问题。

下面是具体步骤。

1.所建工程中没有导入jar包,如果是把别人的工程import到自己的eclipse中,需要右击工程Bulid Path->Add Libraries->User Library->User Libraries->new(起一个名字随便A)->Add Jars(将需要的jar包添加到A中) 如图所示:
Android开发错误鈥斺擟ould <wbr>not <wbr>find <wbr>class

2.在properties中没有设置,右键工程->properties->Java Build Path->Order and Export 将刚刚新建的A勾选->点击ok 就可以了。如图所示:
Android开发错误鈥斺擟ould <wbr>not <wbr>find <wbr>class
这样就可以将jar包一同编译到.apk文件中。在模拟器下运行就不会出Could not find class ** referenced from method **错误了。

12、Failed to install x.apk on device y: timeout

很奇怪的突然遇到上述问题。因为昨晚一切都是OK的,apk都能上传到手机上调试,但是今天早上起来一打开,出现上述异常。
搜索了一些解决,包括“window->preferences->Android->DDMS->ADB connection time out (ms)“设置得更大,比如500000,还是未能解决该问题。
决定关闭eclipse,并且打开任务管理器,关掉adb.exe进程,然后重启eclipse。
重启完成后,再度连接到真机上调试,OK,已经可以安装成功。问题解决。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:122271次
    • 积分:1306
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:11篇
    • 译文:0篇
    • 评论:14条
    最新评论