0

我最近在工作中发现我们将 Java 目标限制为 1.1,因为据说仍然有 Android 手机只支持该版本。我一直在尝试谷歌在不同版本的 Android 上安装了哪些 Java 版本(除非它们确实得到更新,那么包含的最低版本是什么?),并且在我的搜索中没有这样的运气。

所以,我试图找出在 Android 上 Java 的最佳最低目标是什么。知道任何详细说明跨 Android 设备使用的 Java 版本的好资源吗?

[编辑] 为澄清起见,我们使用 Java SDK 构建一个 jar,然后将其打包到 apk 中。所以我确实需要知道特定的 Java SDK 目标,而不是 Android API 级别。

4

3 回答 3

3

您可以使用 Java 1.6 支持所有主要版本的 Android(2.1 及更高版本,甚至可能更低)。

事实上,只要你用 1.7 以外的任何东西编译你就可以了,尽管用 1.5 及以下版本编译会产生一堆带有@Override注释的错误。1.6 是您最安全的选择。到目前为止,我已经在我的所有应用程序中使用了它,并且还没有找到一个由于我的 Java 版本而不兼容的设备。

于 2013-06-28T14:59:30.083 回答
2

首先不要将 Java 与 Android 混淆。Java-RE 和 Android 系统本身是不同的。

如果您谈论 Android 版本,您应该至少支持 API 级别 8 并以 API 级别 17 为目标。这应该可以让您访问 90% 甚至更多的所有 Android 设备。

其余的 Raghav 已经写了。

对于 Java 作为编译器本身:您可以毫无问题地使用 JavaSDK 7,但不应使用 1.6 以上的编译设置。使用 1.1 已经过时了!

于 2013-06-28T15:01:46.937 回答
2

更新:现在是 Java 7,没有 try-with-resource,也没有一些更新的方法和类。如果你使用了你不应该使用的东西,你的 IDE 会抱怨。

Android 工具了解 Java 7,并且能够将其转换为在旧设备上运行的 Android 字节码。

还可以为面向 Android 4.4 及更高版本的应用程序使用全套 Java 7 功能(即包括 try-with-resources)。


下载和构建Android 本身需要

如果您希望构建 Gingerbread 或更新版本,请使用 JDK 6;适用于 Froyo 或更早版本的 JDK 5。

根据我的经验,使用 JDK 6 构建旧版本是可行的,因为 Java 编译器生成的类格式仍然与 JDK 5 的类格式兼容。

这同样适用于应用程序。Android 的内部 Java 实现与 JDK 不同,因此它没有可比较的版本号。但例如String#isEmpty(),在JDK 6Added in API level 9中添加的内容在Android 的文档中说,这正是上述 Froyo 之后的版本。

如果您的应用程序的最低版本低于 9,Eclipse / Android Lint 也会将这些方法的使用标记为错误。

使用 JDK 6 构建任何应用程序都应该可以正常工作。您的代码不得使用旧 Android 版本上不存在的核心 Java 方法,就像 Android 框架中的任何其他方法一样。对已实现的接口使用注解也没有问题,@Override因为该注解不包含在.class文件中(请参阅 参考资料RetentionPolicy.SOURCE)。

最终真正重要的是Android的将所有.class文件转换为Android.dex文件的dex编译器实际上理解了类格式并且可以生成有效的dex文件。dex 格式是您拥有的任何旧 Android 手机都必须理解的格式,我假设 dex 编译器确保它为任何版本的 Android 生成有效格式。(这是 AFAIK JDK 7 的问题,因为类格式已经改变)

我建议您使用 Java 6 作为编译目标来构建您的任何应用程序。.class这会产生dex 编译器可以理解的最新版本的文件。旧版本确实有效,但您可能会收到如下警告

[dx] warning: Ignoring InnerClasses attribute for an anonymous inner class
[dx] (com.bubblesoft.org.apache.commons.logging.impl.LogFactoryImpl$1) that doesn't come with an
[dx] associated EnclosingMethod attribute. This class was probably produced by a
[dx] compiler that did not target the modern .class file format. The recommended
[dx] solution is to recompile the class from source, using an up-to-date compiler
[dx] and without specifying any "-target" type options. The consequence of ignoring
[dx] this warning is that reflective operations on this class will incorrectly
[dx] indicate that it is *not* an inner class.
于 2013-06-28T16:16:28.097 回答