无法编译 Android 测试应用程序

Posted

技术标签:

【中文标题】无法编译 Android 测试应用程序【英文标题】:Can't compile the Android test application 【发布时间】:2012-05-31 23:13:16 【问题描述】:

我决定尝试为 android 编程。我开始了他们的教程,但无法运行第一个项目自动创建的应用程序。我怀疑我的计算机设置错误,但不知道在哪里搜索错误。

教程说要进入新创建的项目目录并运行ant debug。这会给我一个错误:java.lang.NoClassDefFoundError: com.android.sdklib.internal.build.DebugKeyProvider。我怀疑 SDK 安装错误,但不知道出了什么问题或如何修复它。

我的电脑运行 openSUSE 12.1 64 位。我安装了 Oracte JDK 版本 1.7.0_04,以及包括工具和平台 Android 4.0 和 4.0.3 的 Android SDK。安装后,我将android工具文件夹添加到我的路径环境中,并为我的手机添加了一个udev规则,但没有做进一步的自定义。 adb 看到我的手机,我可以用 ddms 截屏。我不使用 Eclipse。

我错过了设置的某些部分吗?如何解决此问题?

更新我发现了一个mailing list discussion,关于某人有同样的问题。他通过更新 /usr/bin 中一个名为“keytool”的符号链接来解决这个问题,以指向正确的文件。我没有这样的链接,所以我创建了它。问题仍然存在。回答该线程的人建议 SDK 中可能缺少一个名为“jarutil.jar”的文件。即使从头开始重新安装,我的 SDK 中也没有这样的文件。由于讨论已经有一年多了,我什至不知道当前版本中是否应该存在这样的文件。

这是ant debug 命令的完整输出:

rumtscho@bradbury:~/dev/learn-android/MyFirstApp> ant debug Buildfile: /home/rumtscho/dev/learn-android/MyFirstApp/build.xml

-set-mode-check:

-set-debug-files:

-set-debug-mode:

-调试-混淆-检查:

-设置: [echo] 如果需要,创建输出目录... [echo] 正在为 MyFirstApp 收集信息... [设置] Android SDK 工具修订版 19 [设置] 项目目标:Android 4.0.3 [设置] API 级别:15 [设置] [设置] - - - - - - - - - [设置] 解决库依赖关系: [设置] 没有库依赖项。 [设置] [设置] - - - - - - - - - [设置] API

-构建设置:

-预构建:

-代码生成: [回声] ---------- [echo] 处理aidl文件... [aidl] 没有要编译的 AIDL 文件。 [回声] ---------- [echo] 处理 RenderScript 文件... [renderscript] 没有要编译的 RenderScript 文件。 [回声] ---------- [回声] 处理资源... [aapt] 没有更改的资源。 R.java 和 Manifest.java 保持不变。 [回声] ---------- [echo] 处理 BuildConfig 类... [buildconfig] 生成 BuildConfig 类。

-预编译:

-编译: [javac] 编译1个源文件到/home/rumtscho/dev/learn-android/MyFirstApp/bin/classes

-编译后:

-混淆:

-dex: [dex] 找到修改过的输入文件 [dex] 将编译后的文件和外部库转换成/home/rumtscho/dev/learn-android/MyFirstApp/bin/classes.dex...

-crunch: [crunch] 在源目录中处理 PNG 文件:/home/rumtscho/dev/learn-android/MyFirstApp/res [crunch] 到 目标目录:/home/rumtscho/dev/learn-android/MyFirstApp/bin/res [crunch] 压缩 0 个 PNG 文件来更新缓存

-包资源: [aapt] 创建完整资源包...

-package: [apkbuilder] 当前构建类型与以前的构建不同:强制 apkbuilder 运行。 [apkbuilder] 创建 MyFirstApp-debug-unaligned.apk 并使用调试密钥对其进行签名...

构建失败/home/rumtscho/android-sdk-linux/tools/ant/build.xml:886: 执行此行时发生以下错误: /home/rumtscho/android-sdk-linux/tools/ant/build.xml:897: 执行此行时发生以下错误: /home/rumtscho/android-sdk-linux/tools/ant/build.xml:307: java.lang.NoClassDefFoundError: com.android.sdklib.internal.build.DebugKeyProvider 在 java.lang.Class.initializeClass(libgcj.so.12) 在 com.android.sdklib.build.ApkBuilder.getDebugKeystore(ApkBuilder.java:919) 在 com.android.ant.ApkBuilderTask.execute(ApkBuilderTask.java:334) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 com.android.ant.IfElseTask.execute(IfElseTask.java:124) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 com.android.ant.IfElseTask.execute(IfElseTask.java:124) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 在 java.lang.reflect.Method.invoke(libgcj.so.12) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:390) 在 org.apache.tools.ant.Target.performTasks(Target.java:411) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1368) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1251) 在 org.apache.tools.ant.Main.runBuild(Main.java:809) 在 org.apache.tools.ant.Main.startAnt(Main.java:217) 在 org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 在 org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 引起 作者:java.lang.ClassNotFoundException: java.security.KeyStore$ProtectionParameter 位于 org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1361) 在 org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1311) 在 org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1064) 在 java.lang.ClassLoader.loadClass(libgcj.so.12) 在 java.lang.Class.initializeClass(libgcj.so.12) ...48 更多

总时间:3秒

【问题讨论】:

你不使用eclipse有什么原因吗?我想这与 SDK 不在您的类路径上有关。另外,你在java 1.7下这样做有什么原因吗?我只是好奇,因为我从来没有听说过它工作(或不工作)。 @Falmarri 原因是我想在没有 Eclipse 的情况下学习它 - 上次我不得不用 Eclipse 编写的项目(不适用于 Android),我们遇到了一个 dll-hell-like情况,没有人知道出了什么问题。此外,我确实将 SDK(或者至少是工具和平台工具文件夹,如 Android 教程中所建议的那样)放入了我的 PATH。 java 1.7有什么奇怪的?它只是 JDK 的当前版本,所以这就是我安装的。我使用 Oracle java,因为我有一些程序不能与打开的程序一起运行。 @rumtscho:我会认真重新考虑使用 Eclipse。它与 ADT、Android SDK 和 AVD Manager 一起工作的方式使其物有所值。不是我用过的最好的 IDE,但它让我的生活更轻松。只是我的意见,你的选择。 将来我可能会开始使用 eclipse。我只想先了解细节,而不是让它屏蔽我。当我对自己掌握了不依赖 eclipse 创建应用程序的知识感到满意时,我可能会为了方便而开始使用它。 【参考方案1】:

Oracle JDK rpm 不以 SuSE 方式配置 Java。特别是您的 JAVA_HOME 可能设置不正确。

试试JAVA_HOME=/usr/java/default ant debug

还要确保 readlink -f `which java` 指向您的 Oracle JDK

看来你可以在/etc/java/java.conf中永久设置JAVA_HOME

Apache Ant 手册建议使用以下方式设置 ant 需要的环境变量:

export ANT_HOME=/usr/local/ant
export JAVA_HOME=/usr/local/jdk-1.5.0.05
export PATH=$PATH:$ANT_HOME/bin 

jdk 编号应该指向计算机上安装的 JDK 编号。这也会永久设置变量。

【讨论】:

做到了。 libgcj.so.12 中的错误意味着 ant 试图使用 gcc 编译 java。现在它运行了。谢谢!

以上是关于无法编译 Android 测试应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio导入现有单元测试“无法找到仪器信息”

android 数据绑定单元测试错误无法解析数据绑定编译器选项。参数:

Libgdx 桌面版本无法编译

无法编译 Android 应用程序

我无法通过 ndk 在 android studio 中编译和 android 应用程序

无法编译 WebRtc AppRTCDemo android 应用程序