ITEEDU

疑难排解

这里是一些基本Android错误的提示和技巧。当错误发生时,请不要忘记使用 ddms logcat capability来得到深层次的信息。参见 调试Android程序 来获得更多提示。

  • adb install)?

    启动一个应用程序时,得到"Binary XML file line #2: You must supply a layout_wilih attribute"错误信息

    • 确定你编译使用的SDK版本与你当前运行的Android OS版本相同。
    • 确定在你的onCreate()方法中先调用了setContentView(); 调用其他方法,例如在setContentView()方法之前,先调用了setListAdapter()方法,这时Androids试图访问并未设置的屏幕元素,经常引起odd错误;

    我的请求(打电话,接收一条短信,接收一个通知,发送intent到Android 应用程序)被忽略

    你可能没有调用这个activity或者接收这个insent的权限(或可能没有被请求的权限),许多标准的Android activities,例如打一个电话,有权限指定它去阻止任意的应用程序发送或者接收请求. 参见 Security and Permissions(安全与许可)获得更多关于Permissions信息, manifest.permission获得关于Android限制的权限列表的信息.

    求助!我的工程在Eclipse中不能编译

    如果你的工程无法编译,你应该注意如下症状,例如在res/子目录新增加的资源并没有显示在R class中,模拟器没有启动,不能运行应用程序, 甚至在运行老版本的应用程序。

    要解决这类的问题,首先尝试:

    1. Eclipse内切换到DDMS试图(如果你没有打开它):
      1. 在菜单栏上选择 Window > Open Perspective > Other
      2. 从列表上选择 DDMS ,点击 OK
    2. 在Devices面板上 (默认面板顶部右侧), 点击向下的三角形图标,弹出面板菜单
    3. 在菜单上选择 Reset ADB ,试着再次运行你的应用程序

    如果上面的问题依旧没解决,你可以尝试下面的步骤:

    1. 请查看位于Eclipse UI底部的console和problems标签
    2. 如果在这两个标签上有问题显示,它们应该会提供一些线索给你,告诉你哪里发生了错误
    3. 如果你不确定这些问题时新的还是旧的,在console内右键选择>Clear,清空console,然后清理工程
    4. 清理工程(处理一些编译错误的好办法),在Eclipse主菜单上选择Project>Clean,然后选中你当前运行的工程(或者清除所有)即可

    Eclipse与模拟器之间无法交互

    当Eclipse和模拟器之间看起来没有任何的通讯,这样的状况可能有:在你按下运行后没有反应,模拟挂起等待一个调试连接,或者Eclipse报告没有找到模拟器或者shell 最经常出现的状况时当你点了运行,模拟启动了(或者已经在运行),但是应用程序没有启动。

    你会发现下面这些步骤中的内容可以修复这个问题,通过实践或许你可以知道哪一步是你的问题需要做的, 但是从现在开始,最安全可靠的选择是按照下面的顺序执行:

    1. 如果模拟器正在运行,请先退出
    2. 检查所有的模拟器进程已经被杀掉(有时候它们可能处于悬挂状态,在unix或mac上使用ps命令,或者在windows上进入任务管理的进程视图查看)
    3. 退出Eclipse
    4. 在命令行内,键入:
      adb kill-server 
    5. 启动Eclipse,尝试连接模拟器

    当我进入Eclipse的preferences选项,选择"Android",得到如下错误信息:Unsupported major.minor version 49.0

    如果你使用的是一个比较老的JDK版本,会显示这个错误。请确任你使用的是JDK5 或者JDK6 的版本。

    由于签名错误,导致无法在我的IDE内安装ApiDemos应用程序

    Android 系统要求所有的应用程序必须被签名,像签名你的应用程序描述的那样。 ApiDemos应用程序包含在SDK中,预装在模拟器上,所以条码已经被编译过,并签署上了一个私有的密钥。

    如果你想在Eclipse/ADT或其他IDE内运行或修改任意一个ApiDemo apps,你仅仅要做的就是通过模拟器卸载预安装app版本。 如果你没有卸载预安装版本之前,尝试在你的IDE内运行ApiDemos apps,你会得到类似下面的错误信息:

    [2008-08-13 15:14:15 - ApiDemos] Re-installation failed due to different application signatures.
    [2008-08-13 15:14:15 - ApiDemos] You must perform a full uninstall of the application. WARNING: ...This will remove the application data!
    [2008-08-13 15:14:15 - ApiDemos] Please execute 'adb uninstall com.android.samples' in a shell.

    这个错误的发生是因为,在这个例子中,你试图在模拟器上安装ApiDemos的拷贝版本,而这个拷贝拥有一个不同证书的签名( Android IDE工具将app用一个调试证书签名,而当前存在的版本已经被一个私有的证书签名)。 系统不允许这类重安装过程。

    要解决这个问题,你需要完全卸载预安装版本,然后使用adb工具重新安装它。下面告诉你该怎么做:

    1. 在终端里,更改SDK工具的目录.
    2. 如果没有模拟器实例在运行, 使用emulator &命令启动模拟器.
    3. 使用adb uninstall com.android.samples命令卸载预安装app.
    4. 使用adb install <ApiDemos.apk所在路径>命令重新请安装app. 如果你工作在Eclipse/ADT上,可以通过正常的方式编译和运行app。

    注意,如果你有多个模拟器实例正在运行,需要在你的卸载/安装命令中指定你的模拟器实例。这样你需要在命令后增加 -s <serialNumber>, 例如:

    adb -s emulator-5556 install

    获取更多关于adb的信息, 参见Android调试桥文档。

    我无法编译我的应用程序,因为编译工具产生一个过期的调试签名证书

    你的开发机器使用不包含非阳历日历的区域设置,你在第一次编译和运行程序时可能会遇到很多问题。确切地说, 你会发现Android编译工具无法编译你的应用程序因为调试密钥已经过期。

    问题出现是因为密钥和证书管理工具— 包含在JDK里,Android 编译工具内里使用— 未能正确处理非阳历区域设置,并创建正确日期。 更确切地说,可能生成调试密钥已经过期,结果存在编译错误。

    如果你遇到这样的问题,下面这些步骤可以解决它:

    1. 首先, 删除通过Android编译工具生成的调试密码保护文件/密钥(keystore/key)。确切地说, 删除 debug.keystore 文件。在Linux/Mac OSX操作系统上, 文件存放在 ~/.android。在Windows XP操作系统上, 文件存放在 C:\Documents and Settings\<user>\Local Settings\Application Data\Android。在 Windows Vista上, 文件存放在 C:\Users\<user>\AppData\Local\Android
    2. 然后, 你可以选择其中一个:
      • 临时改变你开发机器的区域设置(日期和时间)到一个可以使用公历日历的, 例如, United States. 一旦区域设置改变,使用Android编译工具来编译并安装你的应用程序。编译工具会重新生成一个新的密码保护文件和包含无效日期的调试密钥。一旦新的调试密钥生成,将你开发机器上的区域设置重置到原始状态。
      • 相应地, 如果你不想改变你机器的区域设置,你在其他机器上使用公历日历生成密码保护文件/密钥(keystore/key),然后从那台计算机上拷贝debug.keystore 文件到你开发机器的合适位置.

    这个问题已经在Windows上验证通过,可能会应用到其他平台上。

    更全的关于签名Android应用程序的信息,见 签名你的应用程序.

    在Eclipse/ADT内无法运行JUnit测试类

    如果你使用Eclipse/ADT开发,你可以在你的应用程序中增加JUnit测试类。因此,当你视图把一个类作为一个JUnit测试类去运行,你会得到一个错误:

    Error occurred during initialization of VM
    java/lang/NoClassDefFoundError: java/lang/ref/FinalReference

    发生这个错误是因为在android.jar仅仅包含stub类,并没有包含全部Junit.*类的实现。

    要增加一个JUnit类,你必须建立一个JUnit配置:.

    1. 在包浏览视图内,选择你的工程。
    2. 打开运行配置管理器。
      • Eclipse 3.3 (Europa)里, 选择Run > Open Run Dialog... or Run > Open Debug Dialog... .
      • Eclipse 3.4 (Ganymede)里, 选择 Run > Run Configurations... or Run > Debug Configurations...
    3. 在配置管理器(configuration manager)内, 右击 "JUnit" 配置类型,选择 New
    4. 在新的配置的 测试(Test) 标签内, 指定工程和测试类,还有运行测试的其他选项
    5. 在新的配置的 Classpath 标签内, Bootstrap Entries下找到 "Android Library" ,并删除它
    6. 仍然在 Classpath 标签内, 选择 Bootstrap Entries ,单击 Advanced 按钮
      1. 选择 Add Library ,单击OK。
      2. 选择 JRE System Library ,单击 Next。
      3. 选择 Workspace Default JRE ,单击 Finish。
    7. 再次选择 Bootstrap Entries ,单击 Advanced。
      1. 选择 Add Library ,单击 OK.
      2. 选择 JUnit 3 ,单击 Finish.

    按照这样的方式进行配置,现在你的JUnit测试类应该可以正常运行了。