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

And*_*eas 6 java android

我刚刚尝试在Android 4.0设备上运行使用Java 8编译的应用程序.虽然我习惯于仔细查看Android文档中的Android API级别,以确保我只使用Android 4.0上提供的API,但我并不习惯确保我不使用Java 4.0中的任何功能在Android 4.0上都不可用.

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

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

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

Could not find method java.lang.ReflectiveOperationException.printStackTrace
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

小智 19

从https://source.android.com/setup/build/older-versions#jdk找到的“支持旧版本”AOSP 文档:

\n
\n

支持的版本

\n

Android 7.0(牛轧糖)\xe2\x80\x93 Android 8.0(奥利奥):

\n

Ubuntu:OpenJDK 8

\n

Mac OS X:JDK 8u45 或更高版本

\n

Android 5.x(棒棒糖)\xe2\x80\x93 Android 6.0(棉花糖):

\n

Ubuntu:OpenJDK 7

\n

Mac OS X:jdk-7u71-macosx-x64.dmg

\n

Android 2.3.x(姜饼)\xe2\x80\x93 Android 4.4.x(奇巧):

\n

Ubuntu:Java JDK 6

\n

Mac OS X:Java JDK 6

\n

Android 1.5(纸杯蛋糕)\xe2\x80\x93 Android 2.2.x(Froyo):

\n

Ubuntu:Java JDK 5

\n
\n

该文档目前(2022 年 2 月)并未在 Android >=9.0 和 JDK 之间建立任何关联(我可以找到);我怀疑这一点被忽视了,因为自 Ubuntu 20.04 LTS 发布之前的某个时间以来,安装文档似乎并未得到彻底更新。它确实提到最新的主分支 (Android 12.0.0_r32) 附带了一个预构建文件夹,其中包含必要的 JDK。

\n

  • 这里需要说明的是,Android 7.0 并不支持 JDK 8 的所有功能,但 Android 8.0 支持 (2认同)

bmd*_*ruz 11

这只是一个猜测,但我认为我们可以根据 Git 存储库的分支来判断 Android 操作系统版本具有哪个 Java 版本,可以在https://android.googlesource.com//platform/prebuilts/jdk/jdk*上看到:

  • /platform/prebuilts/jdk/jdk8git 存储库有以下分支: oreo (8)、pie (9)、10、11、12、13、14
  • /platform/prebuilts/jdk/jdk9git 存储库有以下分支:pie (9), 10, 11, 12, 13, 14
  • /platform/prebuilts/jdk/jdk11git 存储库有以下分支:11、12、13、14
  • /platform/prebuilts/jdk/jdk17git 存储库有以下分支: 13, 14
  • /platform/prebuilts/jdk/jdk21git 存储库存在,但还没有任何 Android 操作系统版本的分支

有了上面的信息,我想我们可以假设......

  • Android 13 和 14可以访问Java 8、9、11 和 17
  • Android 11 和 12可以访问Java 8、9 和 11
  • Android Pie (9) 和 10可以访问Java 8 和 9
  • Android Oreo (8)可以访问Java 8

我没有看到任何关于比 Oreo 更旧的版本的分支,所以我不知道要查找什么以及在哪里查找,但我认为 @claypooj 的答案涵盖了这一点:

  • Android Nougat (7)可以访问Java 8
  • Android Lollipop (5) 和 Marshmallow (6)可以访问Java 7
  • Android Gingerbread (2.3)、Honeycomb (3)、Ice Cream Sandwich (4)、Jelly Bean (4.1) 和 KitKat (4.4)可以访问Java 6
  • Android Cupcake (1.5)、Donut (1.6)、Eclair (2) 和 Froyo (2.2)可以访问Java 5


Com*_*are 7

显然,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 Level 24+,通常是因为它们依赖于此时仅添加到Android SDK的某些类.

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

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

  • @EliTheHuman:Dalvik 运行时环境已被 ART 取代。这个答案指的是仍在使用的字节码格式上下文中的 Dalvik。 (3认同)
  • 那么如何确保 Java 代码也适用于旧版 Android 版本呢?对于纯 Android API,这很简单,只需检查 API 级别即可,但是内置的 Java 内容(例如 Android 8 上存在的“ReflectiveOperationException”)又如何,但 Android 4.0 上没有。诚然,我的示例做了一些通常不应该做的事情,但是在其他情况下,您是否使用了 Android 8 上有但 Android 4 上没有的某些 Java 方法/类,而您却不知道呢?这有点令人不安。 (2认同)
  • @Andreas:“那么我怎样才能确保 Java 代码也能在旧的 Android 版本上运行呢?” -- 适当地设置你的 `minSdkVersion`,并让构建工具指导你,因为当你直接使用比你的 `minSdkVersion` 更新的东西时,你会收到 Lint 的抱怨。另外,还有全面的测试套件。 (2认同)