哪些Android版本运行哪些Java版本?

时间:2019-01-10 13:31:35

标签: java android

我刚刚尝试在Android 4.0设备上运行使用Java 8编译的应用程序。尽管我习惯于非常仔细地查看Android文档中的Android API级别以确保仅使用Android 4.0上可用的API,但我并不习惯于确保未使用Java本身中所有Android 4.0中不提供的功能。

考虑以下代码,它会尝试从initializeScrollbars()类导入View API,因为出于某种原因,它是来自官方SDK的removed

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(而非Android本身)支持的Java版本的结果。

那么,有人可以对此有所了解吗?我知道它肯定在某个明显的地方,但是我似乎找不到它...

1 个答案:

答案 0 :(得分:5)

  

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

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

  

是否有概述清楚地显示了哪个Android版本与哪个Java版本一起

在语言功能(例如lambda表达式)方面,引用the documentation

  

Android Studio 3.0和更高版本支持所有Java 7语言功能以及部分Java 8语言功能,具体取决于平台版本

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

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

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