我刚刚尝试在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支持的版本
\nAndroid 7.0(牛轧糖)\xe2\x80\x93 Android 8.0(奥利奥):
\nUbuntu:OpenJDK 8
\nMac OS X:JDK 8u45 或更高版本
\nAndroid 5.x(棒棒糖)\xe2\x80\x93 Android 6.0(棉花糖):
\nUbuntu:OpenJDK 7
\nMac OS X:jdk-7u71-macosx-x64.dmg
\nAndroid 2.3.x(姜饼)\xe2\x80\x93 Android 4.4.x(奇巧):
\nUbuntu:Java JDK 6
\nMac OS X:Java JDK 6
\nAndroid 1.5(纸杯蛋糕)\xe2\x80\x93 Android 2.2.x(Froyo):
\nUbuntu:Java JDK 5
\n
该文档目前(2022 年 2 月)并未在 Android >=9.0 和 JDK 之间建立任何关联(我可以找到);我怀疑这一点被忽视了,因为自 Ubuntu 20.04 LTS 发布之前的某个时间以来,安装文档似乎并未得到彻底更新。它确实提到最新的主分支 (Android 12.0.0_r32) 附带了一个预构建文件夹,其中包含必要的 JDK。
\nbmd*_*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 操作系统版本的分支有了上面的信息,我想我们可以假设......
我没有看到任何关于比 Oreo 更旧的版本的分支,所以我不知道要查找什么以及在哪里查找,但我认为 @claypooj 的答案涵盖了这一点:
显然,Android 4.0不支持Java 7.
根据您的定义,Android不支持任何版本的Java.Android SDK中的java和javax类与任何版本的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版本而是因设备型号而异,因为设备制造商可以并且确实会更改框架类的实现.