首页 > 解决方案 > 哪些 Android 版本运行哪些 Java 版本?

问题描述

我刚刚尝试在 Android 4.0 设备上运行使用 Java 8 编译的应用程序。虽然我习惯于仔细查看 Android 文档中的 Android API 级别,以确保我只使用 Android 4.0 上可用的 API,但我不太习惯确保我没有使用Java 本身的任何特性在 Android 4.0 上不可用。

考虑以下代码,它尝试initializeScrollbars()从类中导入 API,View因为无论出于何种原因,它已从官方 SDK 中删除:

try {
    final Method initializeScrollbars = android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class);
    initializeScrollbars.invoke(this, a);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {        
    e.printStackTrace();
}

虽然此代码在我的 Android 8.0 测试系统上运行良好,但在 Android 4.0 上却无法运行。错误是:

Could not find method java.lang.ReflectiveOperationException.printStackTrace

经过一些研究,我发现ReflectiveOperationException在 Java 7 之前不可用,因此,显然,Android 4.0 不支持 Java 7。

这让我想知道:是否有一个概述清楚地显示了哪些 Android 版本附带了哪些 Java 版本?例如,我怎样才能找到第一个支持 Java 7 的 Android 版本?我怎样才能找到第一个支持 Java 8 的 Android 版本?

这真的很容易找到,但我只是没看到它。谷歌搜索总是会导致人们询问 Android Studio 支持的 Java 版本,而不是 Android 本身。

那么,任何人都可以对此有所了解吗?我知道它一定在某个非常明显的地方,但我似乎没有找到它......

标签: javaandroid

解决方案


因此,显然,Android 4.0 不支持 Java 7。

根据您的定义,Android 不支持任何版本的 Java。Android SDK 中的javajavax类与任何 Java 版本都不完全匹配,无论是数字版本(例如,6、7、8)还是您想将 Java SE/EE/ME 视为的任何版本。

是否有概述清楚地显示哪些 Android 版本附带哪些 Java 版本

在语言特性(例如,lambda 表达式)方面,引用文档

Android Studio 3.0 及更高版本支持所有 Java 7 语言功能和 Java 8 语言功能的子集,这些功能因平台版本而异

在这里,“Android Studio”实际上是指编译您的源代码并创建 Dalvik 字节码的构建工具。当前的工具可以支持所有版本的 Android 上的所有 Java 7 和一些 Java 8 功能。其他 Java 8 功能仅在 API 级别 24+ 上可用,通常是因为它们依赖于当时仅添加到 Android SDK 的某些类。

但是您关心的似乎是类和方法,在这种情况下,没有任何 Java 版本到任何 Android 版本的简单映射。

此外,您正在使用反射侵入框架类,这意味着您的结果不仅会因 Android 版本而异,而且会因设备型号而异,因为设备制造商可以并且确实会更改框架类的实现。


推荐阅读