无法编译 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 数据绑定单元测试错误无法解析数据绑定编译器选项。参数: