我如何找到在大量Android手机上安全使用的Java最低版本?

我如何找到在大量Android手机上安全使用的Java最低版本?,java,android,Java,Android,我最近在工作中发现,我们将Java目标限制在1.1,因为据说还有Android手机只支持该版本。我一直在用谷歌搜索不同版本的Android上安装了哪些版本的Java(除非它们得到更新,那么包含的最低版本是什么?),但在我的搜索中没有这样的运气 所以,我试图找出Android上Java的最佳最低目标是什么。知道有什么好的源代码详细说明Android设备上使用的Java版本吗 [编辑] 为了澄清,我们使用JavaSDK构建一个jar,然后将其打包到apk中。所以我确实需要知道一个特定的JavaSDK

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

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

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

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


事实上,只要使用1.7以外的任何工具进行编译,就可以了,尽管使用1.5及以下版本进行编译会在
@Override
注释中出现大量错误。1.6是您最安全的赌注。到目前为止,我在我所有的应用程序中都使用过它,但没有发现一台设备因为我的Java版本而不兼容。

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

如果你谈论Android版本,你应该至少支持API级别8,目标API级别17。这将使您能够访问90%甚至更多的Android设备

其余的都是拉格哈夫写的


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

更新:现在的Java 7没有资源试用,也没有更新的方法和类。如果你使用了不应该使用的东西,你的IDE会抱怨

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

您还可以将Java 7的全套功能(即包括try with resources)用于针对Android 4.4及更高版本的应用程序


Android本身需要

JDK 6,如果你想建立姜饼或更新;JDK 5适用于Froyo或更早版本

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

这同样适用于应用程序。Android的内部Java实现与JDK不同,因此没有可比的版本号。但是,例如,添加在API level 9中的
String#isEmpty()
,该版本正是前面提到的Froyo之后的版本

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

使用JDK 6构建任何应用程序都应该可以很好地工作。您的代码不能像Android框架中的任何其他方法一样,使用旧Android版本中不存在的核心Java方法。对于已实现的接口,使用
@Override
注释也没有问题,因为该注释未包含在
.class
文件中(请参阅)

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

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

[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.

你有什么消息来源吗?我必须说服整个公司这样做是安全的。他们不会轻易改变。@leetNightshade没有出现在任何官方文档中,但Wikipedia页面可以告诉你Android并不遵循正式的Java SE版本,而是将该语言作为一种工具,而不是一个平台(Android基于Dalvik VM,而不是类似Java SE的Java VM)。正如WarrenFaith的回答所指出的,你周围看到的Java与Android中的Java不同。@leetNightshade举例说,Android本身必须用Java 5或6构建。这与Android内部使用的Java版本无关,但可能有助于conviceI。我很乐意接受包含@zapl提供的链接的答案,因为这完全符合我的要求。谢谢@zapl@zapl可以随意添加您自己的答案!我没有混淆Java和Android。我不关心androidapi目标,而是关注javasdk目标。尽管如此,到目前为止,API 9级支持率还没有超过90%吗?是的,支持API 9级及以上将排除主要问题,即您是否想要API 8的3.2%。例如,Android Studio当前的默认设置建议仍然使用8。我同意沃伦的观点,你把PC的Java和Android的Java混淆了。两者有着根本的不同。正如他所说,在运行android应用程序时,您不会以Java1.1、1.5、1.6等为目标。您的目标是API级别。嗯,我们实际上是使用JavaSDK for PC编译.jar,然后将其打包到APK中。所以,我可能把他们弄糊涂了,但我仍然在谈论JavaSDK目标,而不是API级别。我们称之为“javac.exe-target1.1…”。我用过JDK1.6,它在Android 1.5上工作过。。。谁告诉过你限制使用Java1.1的?射杀他们。:)事实上,他们可能被J2ME搞糊涂了。哈哈。我们有一个Android清单,该公司生产的所有游戏都必须遵循。我想这是其中一个t