更新:现在是 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.